tks_yoshinagaの日記

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

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

0. 本記事の内容

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

 

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

[準備編]

 

 

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

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

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

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

     

 

[手でつかむ]

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

     

 

 [注意!]

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

 

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

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

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

 

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

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

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

 

4. 遠くのオブジェクトの操作と併用

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


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