B3S
menu close

雑記

Reactで3Dモデルの展示サイトを構築


イブリン

更新日:2022/11/01


3Dモデルを使用した自社サイトを立ち上げたいと思い研究を始めました。
以前に3Dモデルを使用したサイトが社内で一部好評だったので、そのときに出た案をもとに改良することにしました。
今回は以前出た2点を解決する&今後Webサイトで公開することを見越してReactを使った開発に挑戦しておりますので、
一部Reactの紹介もします。

<前回出た案>
・カラーバリエーションを変えれるようにしたい
・商品を動かすのではなくカメラのパンニング機能を使ってボタンなどで簡単に動かしたい

<元の研究内容>

Three.jsを使って3D製品ページを作成してみよう

目次

完成品の紹介

※動画の処理が重いため、動画ではかくついていますが、実際はもっとなめらかです

動作環境

package.jsonファイルに記載されたバージョン一覧です。

React-three-fiberについて

ReactでThree.jsを扱うためのライブラリで、Reactの宣言的な記述に合わせてWebGLシーンを構築することができます。
※興味ある方はこちらの記事がとてもわかりやすいので見てみてください

以前three.jsで作成していたため、コード量と難しさを桁違いです。
three.jsで挫折した方も、
Reactが理解できればReactコンポーネントのようにThree.jsが書けるので簡単に3Dシーンが構築できます。

Reactのインストール方法

React17.0.2のバージョンの場合は@17.0.2をつけてください

React-three-fiberのインストール方法

※もしreact-three-fiberやuse-cannonに問題があれば、正規版のインストールをしてみてください

ファイル構成

1.3Dモデルを読み込む

|__node_modules
|__public
|         |__gaming_chair_01 //3Dmodelを挿入(この中にgltfファイルを入れる)
|         |__gaming_chair_02 //3Dmodelを挿入(この中にgltfファイルを入れる)
|         |__gaming_chair_03 //3Dmodelを挿入(この中にgltfファイルを入れる)
|__src
|    |__components
|      |__CameraButtons.jsx
|      |__CameraControl.jsx
|      |__Chair.jsx
|      |__ColorPicker.jsx
|      |__Dragable.jsx
|     |__App.css
|     |__App.js //メインjs(他のコンポーネントを統合して表示)
|     |__App.test.js
|     |__index.css
|     |__index.css
|     |__state.js //追加js(カメラ機能の際に導入)
|__.gitgnore
|__package-lock.json
|__package.json
|__README.md

2.完成形ソースコード(App.js)

メインのApp.jsの構成を説明します。

 

モデルのインポート

1.モデルを準備

モデルを使用する方法は主に2種類あります。
そのどちらかの方法で3Dモデルを入手してください。

【ケース1】Blenderで作成されたオブジェクトを使用する場合は、ファイル形式はgltf形式にしてエクスポートしてください
【ケース2】外部サイトからダウンロードする際も同様に、ファイル形式はgltf形式を選択
※3Dモデルおすすめサイト  https://sketchfab.com/

2.モデルをファイル内で設置

モデルgltfファイルをpublicフォルダー下に設置
null

3.3Dモデルを読み込む

3Dモデルを読み込むための、Chairコンポーネントを作成

 

4.モデルコンポーネントを作成

CompornentsにModel.jsxを作成

追加したカラーバリエーションに変更

カラーバリエーションを変更するために必要なポイントは、以下の2つになります
1.パーツの認識
2.カラーバリエーションの設定

1.パーツを認識

カラー変更する箇所を選択するためには、カラー変更箇所のパーツを認識させる必要があります。

◎パーツの取り外し

1つのオブジェクトから、パーツを取り出し、どんなオブジェクトでも移動できるようにします。
そのためには、物理APIがあるかどうかにかかわらず、条件付きで物理プロパティを呼び出します。
Javascriptではキー末尾に?(クエッションマーク)をつけることで、そのオブジェクトに定義されているかどうかわかります。
もしそうでなければ、残りの部分の呼び出さないようにします。

◎パーツオブジェクト名を取り出す

オブジェクト名を取り出す際は、console.log(e.object)を入れると、オブジェクト名を取り出すことができます。

ここのnameに記載されているのが、パーツオブジェクト名です。

◎パーツを1つのオブジェクトにまとめる

1つ1つのパーツを、transformGroupでまとめることによって1つのオブジェクトとして動かすことができる

Chair.jsでDragable.jsを読み込む

2.カラーバリエーションの設定

ColorPicker.jsxファイルを作成し、カラーの選択肢候補とカラーアクションボタンを作成できたら、カラースイッチの完成です

◎カラーボタンを作成

カラー候補分作成します

◎カラー選択時のアクションボタンを作成

カラーボタンをクリックしたら、パーツカラーが変更するよう処理を書きます。

カメラパンニング機能の追加

カメラのパンニング機能とは、左右の矢印ボタンを押すとカメラを水平に360度回転させることができるようにすることを指します。

1.カメラの初期値設定

最初にこの展示会を表示する際に、どの位置にカメラを置くかを状態管理します。

StateというJSファイルを作成

任意の変数を追跡するオブジェクトをエクスポート

それを状態変化させたいファイルにインポート

activeMeshNameには初期で表示させる3Dモデルのパーツ名を入力します。
※このパーツ名は、色を変更するパーツ名と同じ名前にすると分かりやすいです。
このパーツ名を軸に、カメラの位置を指定してカメラポジションを認識するようにします。

2.カメラの導入

先程設定した初期カメラポジションと、このあとに設定する指定の位置にカメラを動かせるように
CameraControlsコンポーネントで状態を切り替えられるようにします。

3.カメラボタンの設置

CameraButtonコンポーネントの役割は、以下の2つです。
1.カメラの方向ボタン(矢印ボタン)の設置
2.各モデルごとのカメラポジション設定

◎カメラの方向ボタン(矢印ボタン)の設置

カメラポジションスタイルをconstで定義します

上記で設定したスタイルを継承して、ボタンを表示させます

矢印ボタンを機能させるために

◎各モデルごとのカメラポジション設定

▼各3Dモデルごとにカメラ位置、モデルごとのカラー変更する部位名を定義します。

▼カメラ定義されたもの(初期カメラ、矢印ボタン、モデル名)の情報を組み合わせて、ボタン機能を成立させていきます。

4.モデルに合わせてカメラの追従

3で設定した各モデルごとのカメラポジションをモデル名で認識できるように、
CameraControlsコンポーネントで条件分岐を付け加えれば、カメラのパンニング機能は完成です。

おわりに

今回のReactを使った3Dモデル表示は、Reactの記法だけでなく、three.jsについてもある程度理解があると
処理の速さや扱いやすさに感動すると思います。
※特にアニメーションの動きをGsap使わなくてもある程度動かせるのは良いです。
今回もつかっていません。

また、three.jsをそのままWebサイトに入れるよりも、Reactで管理したほうが運用コストも下げられていいと思いました。
製品ページにいつか反映できる日が来たらいいな~と思いました。

<関連記事>

Three.jsはじめました!