[react-three-fiber/drei] 面操作可能な多角柱の作成

はじめに

皆様こんにちは。
AMDlab Webエンジニアの塚田です。

引き続き react-three/fiberとdrei の学習を進めています。

今回は3D上で面操作可能な多角柱を作成していきたいと思います。面操作には色々方法はありますが、今回はdreiのTransformControlsを使用して作成してみたいと思います。

説明

react、typescript、react-three/fiber、drei、levaについては事前に準備してください。(私はNext.jsを使用しています。)

完成したプロジェクトのフォルダ構成は以下のようになります。

  • app/
    • 3d-manager/
      • page.tsx
    • components/
      • custom-process/
        • CustomProcess.tsx
        • CustomRectangle.tsx
        • CustomShape.tsx
        • CustomTransformControls.tsx
      • panel/
        • CustomPanel.tsx

先にlevaによる操作パネル(CustomPanel.tsx)について記載します。

動画のような動作になります。デフォルトでパネルを掴んで移動させる機能が地味に嬉しいです。

次に今回のメインとなる面操作と形状の変化についてです。

dreiのTransformControlsで面を操作します。形状の変化については自前で用意した面(CustomRectangle)と

THREE.jsのShapeの機能を利用します。Shapeは2次元限定ではありますが、ある程度の複雑な形や多角形に対応することができます。
こちらを床面と上面に利用し、側面にCustomRectangleを利用して多角柱を形成します。

page.tsx

CustomProcess.tsx

 

CustomProcess にはCanvasを用意して、OrbitControlsや各コンポーネントを配置します。

床面と上面のshapeの座標を保持しておく為、points というvector3の2次元配列のstate変数を用意します。初期表示時に固定値を設定しています。

CustomShape.tsx

CustomShape は床面と上面のshapeを作成するコンポーネントです。

CustomRectangle.tsx

 

CustomRectangleは多角柱の側面を形成します。各面を長方形で表示します。

ここでは自前でFaceを作成して長方形を作成しています。TransformControlsで面の向いている方向に動かせる方が便利と考えたので、Quaternionを利用して傾けています。

CustomTransformControls.tsx

CustomTransformControls では対象の面を操作できるようにしています。

形状が破綻しないように以下の制約を課しています。

①shapeは移動と高さ方向にしか伸縮できない。

②側面はx,y方向にしか変化させることができない。

動作結果

 

側面は面の向いている方向に動作し、ある程度複雑な形状まで床面が変化できました。

まとめ(今後の課題)

今回の実装についてですが、dreiのTransformControlsやShapeを利用することで比較的楽に作成することができました。

実用面では多角柱の形状を領域に見立ててその範囲内の物体を取得したりする使い方ができそうです。

今後は線や点も操作できるようにしたりthree-csg-tsなどを利用してmesh同士のマージ等ができるようにしたりしていきたいと思います。

 

ARTICLES