【react-three/fiber,drei】dreiのDragControlsについて

はじめに

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

react-three/fiberとreact-three/dreiを使い始めて3ヶ月程経ちました。dreiの用意してくれている機能は数多くあり、便利なものが揃っています。

そこで今回は最近実装された DragControls という機能についてご紹介したいと思います。

DragControlsはメッシュをつかんで動かす機能を簡単に作成することができます。

それでは説明に入ります。

説明

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

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

page.tsx内のCanvas内のデザイン等については以下を参考にさせていただきました。(勉強になりました、ありがとうございます。)

【React Three Fiber】DraggableなMeshの実装

https://qiita.com/nemutas/items/c49728da8641ee28fd2e

DragControls

https://drei.docs.pmnd.rs/gizmos/drag-controls

紹介に以下のコードがあります。

本当にこれだけで実装できます。以下実装例です。

実装例

page.tsx

これだけだと本当に紹介だけになってしまうので、以下の二つの機能を追加したいと思います。

  1. 重なっているメッシュを選択した時は手前のもののみ動かせるようにする。(通常時、下記のように重なっていると重複したまま動かせてしまう)

2.メッシュを掴んで動かしている間はOrbitControls※1の回転機能をロックしてメッシュを動かしやすくする。
※1.dreiの機能。sceneの回転やパン、ズームを操作可能にする。

実装コード

draggableObjects.tsx

 

このファイルのコードが今回のメイン部分になります。
1.重なっているメッシュを選択した時は手前のもののみ動かせるようにする。
について

handleMouseMove内でメッシュの手前のものを区別する判定を実装しています。
また、DragControlsの prop にて autoTransform を手前のもののみtrueにすることで
掴んで動かせるものを手前のものに限定しています。

2.メッシュを掴んで動かしている間はOrbitControls※1の回転機能をロックしてメッシュを動かしやすくする。
について
OrbitControlsの回転操作可否をDragControls の onDragStart と onDragEndで制御するようにしました。

meshInfo.ts

 

page.tsx

 

動作結果

まとめ(今後の課題)

今回作成したドラッグして動かせる機能は便利なのですが、方向を固定して動かせた方が思った位置に動かすことができそうなので改善したいと思います。

個人的な感想としてThree.jsをそのまま使う場合と比較してかなりシンプルに実装できたと思います。

その辺りは今後また執筆できたらと思います。

今後も便利そうな機能あったら紹介していきたいと思います。(TransformControls など)

 

追記: 将来的にはもっと機能を追加、使いやすくして以下のような感じのUIを目標にしています。

ARTICLES