0. 本記事の内容
Meta Questで3Dオブジェクト(立方体)をつかんで操作する方法の紹介を開始します。
ただしVRやARにおいて一言でオブジェクトをつかむと言っても、そのオブジェクトが近くにある場合と遠くにある場合とで必要な設定が異なります。本連載ではそれぞれの場合について実現方法を紹介しますが、その準備段階として本記事では各場合に共通して必要になる設定について解説します。
*この動画はAR版ですがAR/VR両対応です。
なお本記事は下記で作成したVRまたはARのシーンで表示している立方体を操作することを前提としています。立方体に特別なコンポーネントを追加せずQuestで眺めるだけの状態からのスタートとなりますので、他のプロジェクトでも同様の状況であれば本記事と続きの記事の内容を実践することでオブジェクト操作を実現できます。(OVRCameraRigではなくOVRCameraRigInteractionプレハブの使用を前提としています)
[VR版]
[AR版]
1. シーンを複製
前回の記事で作成したシーンを編集することも可能ですが、これを壊さずにオブジェクト操作を試すためシーンを複製します。不要な場合は読み飛ばしてください。
- 前回までに作成したVR版またはAR版のシーンを開く
- File -> Save As... をクリックして現在のシーンを新しい名前で保存
*本記事ではFarManipulationとします - Hierarchyに表示されるシーン名がFarManipulationになっていることを確認
2. オブジェクトの接触検知を有効化
オブジェクトをつかんで操作するには手やコントローラとオブジェクトとの接触を検知ができる必要があります。ここで解説するオブジェクトとの接触検知に関する手順は、Quest開発に限らずUnityでの開発に共通する内容となります。
- Hierarchyで操作対象のオブジェクト(Cube)を選択
- Inspectorで表示されるCubeの詳細情報にBoxColliderが適用されていることを確認
* Cube以外のオブジェクトの場合は、各オブジェクトに合わせたCollider
* 自作のモデルの場合は手作業でColliderを追加 - Inspector下方のAdd Componentボタンをクリック
- 検索領域にRigidbodyと入力
- 表示された候補の中からRigidbodyを選択
- InspectorにRigidbodyが追加されたことを確認し、下記のように変更
Use Gravity: OFF
Is Kinematic: ON
要するに接触検知をするにはColliderとRigidbodyが必要になるということです。
3. つかんで操作できるという属性を追加
ここではつかめるようにする、移動可能にするという2種類の属性を追加します。
[つかめるようにする]
- HierarchyでCubeを選択
- Add Componentをクリック後、Grabbableで検索
- 候補の中からGrabbableを選択
[移動を可能にする]
- CubeのInspectorでAdd Componentをクリック
- Grab Freeで検索
- 候補の中からOne Grab Free Transformerを選択
*片手で操作する際の詳細設定を行うスクリプトです
*細かく設定することで移動や回転の制約を設けることも可能 - Grabbable内のOptionsを開く
- One Grab Transformerの右側のエリアにCubeをドラッグ&ドロップ
*この操作によりCubeに追加したOne Grab TransformerがGrabbableスクリプトに登録され、片手でつかんでオブジェクトを動かす準備が完了 - さらに両手で操作をしたい場合は、再度Add Componentをクリック
*片手のみで良い場合は読み飛ばしてください - Two Grab Free Transformerを選択して追加
- Grabbable内のOptionsを再度開く
- Two Grab Transformerの右側のエリアにCubeをドラッグ&ドロップ
- 下記のようなダイアログが表示されるのでTwo Grab Free Transformerを選択
* 現状ではCubeには2種類のGrabFreeTransformer(OneとTwo)が登録されているので、このダイアログはどちらを使うかをたずねている。
- Grabbableのオプションが下記のようになっていればOK
4. 次のステップ
ここまでの操作でコントローラや手につかまれた場合にオブジェクト(Cube)の位置・角度・スケールが変更されるという設定が完了しました。
しかし現状ではまだオブジェクトを操作できません。なぜなら冒頭にも説明した通り、オブジェクトとコントローラや手の遠近によって要求される設定が異なるため、これらに関する設定をまだ行っていないからです。さらに、つかむ際にコントローラと手のどちらを(もしくは両方を)使うのかについての設定も行なっていません。次の記事では遠近それぞれの場合についての設定方法を紹介します。
[近くのオブジェクト編]
[遠くのオブジェクト編]
5. Meta XR SDKに関する記事一覧はこちら