tks_yoshinagaの日記

KinectやLeap motion, VRやARなどの技術を使ってやったことのメモとか

MetaQuestで遠くにあるオブジェクトをつかむ

0. 本記事の内容

本記事ではMeta Questで遠くにある3Dオブジェクト(立方体)をつかんで操作するまでを紹介します。この動画はAR版ですがAR/VR両対応です。
GitHubで公開しているサンプルの03-FarManipulationまたは03-FarManipulation-ARシーンでも動作を確認できます。

 

なお本記事は下記での事前準備が済んでいることを前提に解説を進めます。ご注意ください。

[準備編]

 

 

1. コントローラや手で遠くのオブジェクトをつかむ設定

オブジェクトをつかむ際にコントローラを使う場合と手を使う場合、それぞれの場合について追加するスクリプトとその設定方法を紹介します。両方の設定をすることでコントローラと手の両方を使用することも可能です。

[コントローラでつかむ]

  • CubeのInspectorを表示し、Add Componentをクリック
  • Grab Interactableで検索し、候補からDistance Grab Interactableを選択
  • 追加されたDistance Grab InteractableのPointable ElementにCubeをドラッグ&ドロップ
    *Distance Grab InteractableとGrabbalbeを接続し、コントローラでつかんだ情報を用いてGrabbableで設定した挙動(位置・角度・スケールの変化)に反映
  • さらにDistance Grab InteractableのRigidbodyにCubeをドラッグ&ドロップ
    *冒頭でCubeに追加したRigidbodyを割り当てることでコントローラの先のポインタとCubeとの接触検知が利用される

     

 

[手でつかむ]

  • CubeのInspectorを表示し、Add Componentをクリック
  • Grab Interactableで検索し、候補からDistance Hand Grab Interactableを選択
  • 追加されたDistance Hand Grab InteractableのPointable ElementにCubeをドラッグ&ドロップ
    *Distance Hand Grab InteractableとGrabbalbeを接続し、手でつかんだ情報を用いてGrabbableで設定した挙動(位置・角度・スケールの変化)に反映
  • さらにDistance Hand Grab InteractableのRigidbodyにCubeをドラッグ&ドロップ
    *冒頭でCubeに追加したRigidbodyを割り当てることで手の先のポインタとCubeとの接触検知が利用される

     

 

 [注意!]

OVRCameraRigオブジェクトにアタッチされたOVR ManagerのHand Tracking SupportでControllerOnlyを選択しているとハンドトラッキングが動作しないためオブジェクトを手でつかむことができません。設定を必ず確認してください。

 

2. 現状確認と挙動の変更

以下の動画はここまででできたコンテンツの動作の様子です。(コントローラでつかむ場合は中指のグリップボタンを使用します。)

見ての通り遠くのオブジェクトを手元に引き寄せる挙動がMeta XR SDKのデフォルト設定となっていて、冒頭で提示したビデオでの挙動とは異なります。
コンテンツによってはこれで問題ない場合もありますが、オブジェクトを手元に引き寄せずに位置だけを変えたいケースもあるので、これを実現する方法を紹介します。


[つかまれた時のオブジェクトの挙動]

  • Cubeを選択しInspector下方のAdd Componentをクリック
  • Move Fromで検索し、候補からMove From Target Providerを選択して追加

このスクリプトはつかまれた際にオブジェクトがどこを起点に移動するかを記述しています。
デフォルトではコントローラや手に移動してから操作される設定のスクリプトが自動で割り当てられるので、以下の手順でつかまれた時点でのオブジェクトの位置を中心に移動する挙動を記述したスクリプトを明示的に割り当てます。

 

[コントローラ使用時の挙動調整]

  • InspectorのDistance Grab Interactableに注目
  • Optionalsを開く
  • Movement ProviderにCubeをドラッグ&ドロップしてこのCubeに登録されたMove From Target Providerを関連付ける

[手使用時の挙動調整]

  • InspectorのDistance Hand Grab Interactableに注目
  • Reset Grab On Grabs UpdatedOFF
  • Optionalsを開く
  • Movement ProviderにCubeをドラッグ&ドロップしてこのCubeに登録されたMove From Target Providerを関連付ける

 

3. コントローラの設定の微調整 (オプション)

上記の操作によりコントローラでオブジェクトをつかんで動かすことが可能になりました。このときデフォルト設定ではグリップボタン(中指)を使用してつかむようになっています。これを例えばトリガーボタンでもつかめるようにする方法について紹介します。

  • HierarchyのOVRCameraRigInteractionの子要素のOVRCameraRigを開く
  • さらにOVRInteractionComprehensive -> OVRControllersの順に子要素を開く
  • OVRControllersの子要素にLeftControllerRightControllerがあることを確認
  • 左手のコントローラの設定をする場合はLeftControllerを開き、下記の順に子要素を開く
    ControllerInteractors -> ControllerDistanceGrabInteractor -> GripButtonSelector
  • GripButtonSelectorのInspectorでControllerSelectorに注目
  • Controller Button UsageでTriggerButtonのチェックをON
    *GripButtonが不要な場合はGripButtonのチェックを外す
  • 右手のコントローラについても同様の操作を行うことで、つかむ際に使用するボタンを設定可能

 

4. 手の挙動の微調整 (オプション)

細かい話になりますが、デフォルト設定では両手でCubeを拡大縮小した際に、手のオブジェクトがCubeの方に飛んで行ってしまいます。もし手のオブジェクトを実際の手に追従させたい場合は下記を試してください。

  • HierarchyのCubeを選択
  • InspectorからCubeに登録されたDistance Hand Grab Interactableに注目
  • Hand Alignmentの設定をNoneに変更

 

5. 近接オブジェクトの操作と併用

同じオブジェクトに対してコントローラや手による近くでの操作と遠くでの操作を併用することができます。本記事では遠くのオブジェクトの操作方法を紹介しましたが、近くのオブジェクトの操作を追加する場合は下記の記事の1章からの手順をさらに追加してください。

 

 6. Meta XR SDKに関する記事一覧はこちら