前回、Three.jsでPOLAR STAR(ポーラースター)のようなゲームを作るで久々にThree.jsを使ったのですが、完全に忘れてしまっていたので自分のために備忘録をつくります。

基本形

これでY軸を中心に回転する立方体が描画されます。

style.css

index.js

VS Code を使ってコーディングする場合、https://cdn.jsdelivr.net/npm/three@0.167.0/build/three.module.js をダウンロードして同じディレクトリのなかに入れ、最初に2行に //@ts-check と //<reference path=”./three.module.js”/> をいれておくと型が機能することによるVSCodeでの厳密なコード補完の恩恵を受けることができるので便利かもしれません。

直線の描画

これで直線を生成して追加することができます。これまではimport文でThree.jsを読み込む方法とは別の方法を使ってきましたが、importする方法だと直線を生成する方法が変わってきます。

回転と移動

Object3D.position.xを変更すれば移動、Object3D.rotation.xを変更すれば回転させることができます。ただし回転とともに回転の軸も回転してしまいます(実際に X軸で少し回転させたあとY軸で回転させてみるとわかる)。

index.js

オイラー角を指定した回転

回転しても軸がずれないような回転をさせるにはsetRotationFromEuler関数でオイラー角を指定します。

THREE.Eulerのorderを’YXZ’と指定することによって、eulerYを機首方位角、eulerXをピッチ角、eulerZをバンク角とする回転が可能になります。

スプライト

スプライトとは常に正面を向く3Dオブジェクトです。

読み込んだ画像ファイルからスプライトを生成しています。スプライトを100個生成してカメラに向かって移動させ、Z座標がカメラの位置に達したらZ座標を-1000にする処理を繰り返しています。

平面へのテクスチャの貼り付け

平面に画像を貼り付けたいのであれば以下の方法でできます。注意点はテクスチャからマテリアルを生成するとき side: THREE.DoubleSide を指定しないと裏側には描画されないことです。

グループ化

Three.jsの3Dオブジェクトはまとめて管理できる機能があります。これによってまとめて複数の3Dオブジェクトを移動させたり回転させることができるようになります。

グループ化の解除

グループから削除したい場合は、remove関数を使います。グループから削除するとsceneから消えてしまうので再追加の処理が必要です。そのときグループ化されていたときの座標をバックアップしておき再設定しないとグループ化されていたときの座標が反映されません。

以下はボタンがクリックされたらグループ化をして回転処理をおこない、完了したらグループ化を解除するコードです。

index.js