見出し画像

【制作物共有】3D Glasses

制作日

2022年4月22日


使用しているプラグインなど

・webpack
・Typescript
・React
・gsap
・three.js
・GLTFLoader
・DRACOLoader


制作について

今回の制作の目的は「ユーザーが操作できる部分を増やし、サイトとして実装すること」です。


3Dに関連してユーザーが操作できる部分として簡単に思いつくものは
・3Dモデルの色(マテリアル)
・3Dモデルの位置
・3Dモデルの角度
・3Dモデルのサイズ
でした。

上記の4 つを全て自由に操作できるようにしてしまうと、見やすいサイトとはなりにくそうなので、引き算しつつ実装します。

今回はBlenderでメガネのフレームを作成しました。

ミラーモディファイアを使って片面の作成で左右対称のものにしていきます。
平面でフレームの形を作成し、

スクリーンショット 2022-04-20 13.42.19


ソリッド化で厚みをつけます。

スクリーンショット 2022-04-20 13.46.31

スクリーンショット 2022-04-20 13.50.09


耳にかける部分(テンプル)を作成し、

スクリーンショット 2022-04-20 14.06.02


テンプルの角度を修正します。

スクリーンショット 2022-04-20 14.06.20

スクリーンショット 2022-04-20 14.07.34


鼻パッドの部分も作成し、最後にサブディビジョンサーフェスで表面を滑らかにして完成です。

スクリーンショット 2022-04-20 14.24.36


同じ要領で何種類か作成しました。

ラウンド型

スクリーンショット 2022-04-21 12.19.42

スクリーンショット 2022-04-21 12.28.21


スクエア型

スクリーンショット 2022-04-21 12.41.09

スクリーンショット 2022-04-21 12.46.26

スクリーンショット 2022-04-21 12.48.23


フォックス型

スクリーンショット 2022-04-21 12.58.22

スクリーンショット 2022-04-21 14.16.30


ティアドロップ型

スクリーンショット 2022-04-21 14.26.34

スクリーンショット 2022-04-21 14.37.54


完成したファイルをDRACO圧縮して読み込みます。

gltf-pipeline -i glasses.glb -o glasses-d.glb -d

dat.guiでマテリアルの色を変更できるようにします。

       const gui = new dat.GUI();
       const folder = gui.addFolder('MATERIAL');
       let params = {
           color: 0xff00ff,
       };
       three.material = new THREE.MeshLambertMaterial({ color: params.color });
       folder.addColor(params, 'color').onChange(() => {
           three.ovalMesh.material.color.set(params.color);
       });
       folder.open();

各フレームごとに読み込みます。

  loader.load(srcObj, (obj) => {
       three.ovalMesh = obj.scene.children.find((child: THREE.Mesh) => child.name === 'oval');
       three.bostonMesh = obj.scene.children.find((child: THREE.Mesh) => child.name === 'boston');
       three.teardropMesh = obj.scene.children.find((child: THREE.Mesh) => child.name === 'teardrop');
       three.squareMesh = obj.scene.children.find((child: THREE.Mesh) => child.name === 'square');
       three.roundMesh = obj.scene.children.find((child: THREE.Mesh) => child.name === 'round');
       three.foxMesh = obj.scene.children.find((child: THREE.Mesh) => child.name === 'fox');
  });

レイキャスターを使って交差を検知します。
クリックしたボタンに応じて、リンクした3Dオブジェクトが拡大するようアニメーションを設定します。

画像17


リセットボタンで初期画面に戻します。

画像18


これで完成とします。

今回拡大縮小の動きはボタン(クリック)操作で実装しました。OrbitControlsで自由にし過ぎてしまうと、少し操作しづらさを感じました。
今回のように、複数の3Dモデルを表示したい時などはこのような実装の方がユーザのためになるかもと勉強になりました。


作成したサイト


Git


この記事が気に入ったらサポートをしてみませんか?