手とコントローラーを同時に使う(マルチモーダル)
更新日時: 2026/10/07
マルチモーダル入力は、手とコントローラーの両方を同時にトラッキングする機能を提供します。さらに、コントローラーを手にしているかどうかも示します。マルチモーダル入力では、没入感のある手の操作と、正確さとハプティクスのためのコントローラーの操作を組み合わせることができます。システムは自動的に、コントローラーが手の中にあるか、または手から離れている(例: 机に置かれている)かを検出し、ハンドトラッキングとコントローラー入力の間のシームレスな移行を可能にします。マルチモーダル入力を有効にすると、自動トランジションやダブルタップなど、他のトランジション方式は無効になります。
- 手とコントローラーによるゲームプレイ: コントローラーを片手で持ってツールや武器として使い(高い精度、ハプティクス、ワイドFoV)、もう片方の手でオブジェクトとのインタラクションや呪文などの操作を行えます(高い没入感)。
- 1つのコントローラーを使用するゲームプレイ: ほとんどのインタラクションで1つのコントローラーしか必要ない場合に、ユーザーが1つのコントローラーだけをつかみ、もう一方の手は必要に応じて没入感を高めたり普段どおりのインタラクションをしたりできるようにすることができます(例: ラケットとしてコントローラーを使い、もう一方の手でボールを拾ったりメニューを操作したりする)。
- 手とコントローラーを快適に使い分ける: 片手はコントロールとの直接のインタラクションのために使い、もう一方の手はコントローラーを「リモコン」として使って簡単で間接的なインタラクションを行います。
- 手とコントローラーの瞬時移行: ハンドトラッキングがアクティブな場合、コントローラーが手から離れると、それが瞬時に認識されます。これにより手動トランジションの必要性を最小限に抑えることができ、自動トランジションが遅かったり失敗したりする問題を解決できます。
- コントローラーを探す: 手を使っている間もコントローラーが追跡されるようになったため、ユーザーがコントローラーを手に取ろうとしたときに、アプリでその位置を表示できます。これによりコントローラーへのスムーズな移行が可能になり、パススルーをオンにしたりヘッドセットを外したりして没入感を損なうことがありません。
- 「手持ち」信号は、ハンドポーズやコントローラーポーズ、コントローラーからの信号など、必ずしも正確ではないさまざまな信号に基づいています。その結果、トラッキングが失われたり不正確だったり、コントローラーがしばらくの間静止していたりという特定のシナリオでは、コントローラーが手元にないことがシステムによって示されることがあります。そのため、このような制限を念頭に置いて設計することをおすすめします(例えば、コントローラーから手に誤って短時間移行してしまって手から物を落とすようなことがないようにするなど)。
- 一時停止機能が呼び出されると、アプリは、従来の手+コントローラーアプリが実行される「非同時」モードに切り替わります。その場合ユーザーは、一度に手かコントローラーのどちらか一方だけを使うことができます。このときユーザーがコントローラーを持っているかどうかによっては、トラッキングシステムが有効にすべき正しい入力方式を認識して判断するまでに数秒かかる場合があります。
- PCでLinkを使っている場合、コントローラーを使っていないとき(テーブルの上に置いている場合など)は、コントローラーのポーズデータは利用できません。
- Quest 2
- Quest Pro
- Quest 3
- Quest 3S
- Unityバージョン6000.0.66f2以上
- Meta XR Core SDK v62以上
- マルチモーダル入力は、インサイドアウト・ボディトラッキング(IOBT)やフルボディ合成(FBS)とは互換性がありません。これらを同時に有効にしないようにしてください。
- マルチモーダル入力を高速モーションモード(FMM)と同時に有効にすることはできません。両方一緒に有効にした場合、マルチモーダルが優先されます。FMMはマニフェストの中で定義されているため、アプリレベルでFMMを有効にした上で、FMMがそれほど重要でない特定のエクスペリエンスでのみマルチモーダルをオンにすることができます。
- Quest 2でマルチモーダルをリップシンクと同時に有効にすることはできません
- パススルー、マルチモーダル入力、ワイドモーションモード(WMM)を一緒に有効にすることはできません。すべてを同時にオンにした場合、システムでWMMが無効になります。
- Capsenseの手との完全互換性。
- ハプティクスとの完全互換性。
- Meta XR Core SDKパッケージV74以上をインストールします。
- Meta VRデバイス用Unity Hello Worldの説明に従って、カメラリグとコントローラーを設定します。
OVRCameraRigにアタッチされているOVR Managerスクリプトを見つけます。[Quest Features (Questの機能)]の下で、[Simultaneous Hands And Controllers (手とコントローラーを同時に)]を[Supported (サポート対象)]または[Required (必須)]に設定します。
[Window (ウィンドウ)] > [Package Management (パッケージマネジメント)] > [Package Manager (パッケージマネージャ)]の下で、[Meta XR Core SDK]を検索し、[Samples (サンプル)]タブの下で[Import (インポート)]をクリックします。これにより、マルチモーダルのサンプルシーンがインポートされます。
[Project (プロジェクト)]で、OVRControllerPrefabを検索します。
検索結果からOVRControllerPrefabを[Hierarchy (階層)]にドラッグし、新しいLeftHandAnchorDetachedとRightHandAnchorDetachedのGameObjectに配置します。デモについては、Assets/Samples/Meta XR Core SDK/<version>/Sample Scenes/SimultaneousHandsAndControllers.unityをご覧ください。
OVRControllerPrefabの新しいGameObjectのそれぞれについて、[Show State (表示状態)]を[Controller Not In Hand (手持ちでないコントローラー)]に、また[Controller (コントローラー)]を[Touch]に設定します。
[Project (プロジェクト)]の下で、OVRControllerPrefabを検索します。
検索結果のOVRControllerPrefabをLeftControllerInHandAnchorにドラッグします。
[Hierarchy (階層)]で、OVRControllerPrefabを選択します。
[Inspector (インスペクター)]の下で、[Controller (コントローラー)]を手に一致するように設定してから、[Show State (表示状態)]を[Controller In Hand (手持ちコントローラー)]に設定します。
ステップ9~11を、RightControllerInHandAnchorについて繰り返します。
[Project (プロジェクト)]で、OVRHandPrefabを検索します。
検索結果のOVRHandPrefabをLeftHandOnControllerAnchorにドラッグします。
[Inspector (インスペクター)]の下で、[Hand Type (手のタイプ)]の設定値が手であることを確認してから、[Show State (表示状態)]を[Controller In Hand (手持ちコントローラー)]に設定します。
- ステップ14~15を、RightHandOnControllerAnchorについて繰り返します。
OVRControllerHelperとOVRHandには、enumのShowStateがあります。そのオプションは以下のとおりです。
- Always (常に): オブジェクトがコントローラーと手の状態に基づいて自動的に無効になることはありません。
- [Controller in Hand or no Hand (手持ちコントローラーまたは手がない)]: これは、コントローラーがユーザー手持ちでない場合、またはジェスチャーコントロールが完全に無効になっている場合に、このオブジェクトが無効になることを意味します。
- [Controller in Hand (手持ちコントローラー)]: これは、コントローラーがその時点でユーザーの手にない場合にオブジェクトが無効になることを意味します。
- Controller Not in Hand (手持ちでないコントローラー): これは、オブジェクトがユーザーの手の中にある場合は無効になることを意味します。これは、机の上に置かれているなど、コントローラーが手から離れている状況で使用されます。
- [No Hand (手がない)]: ハンドトラッキングが有効、かつ手がある場合、これはオブジェクトのレンダリングを無効にします。
OVRControllerPrefab: OVRControllerHelper
- [Show State (表示状態)]
- When Hands Are Powered By Natural Controller Poses (手でナチュラルコントローラーポーズを利用する場合): これは、ハンドポーズが自然な状態であっても、コントローラーをレンダリングできるかどうかを制御するためのチェックボックスです。これは、コントローラーが手から離れた状態で使います。
OVRHandPrefab: OVRHand
- LeftHandAnchorDetachedとRightHandAnchorDetached: これらのアンカーは、手とコントローラーの同時利用APIが有効になっている場合に、ユーザーの手持ちでないコントローラーのために使います。デフォルトのCameraRig prefabには、これらのアンカーの下にコントローラーのprefabが含まれていないため、それらを使うには追加する必要があります。これらのprefabの表示状態は[Controller Not In Hand (手持ちでないコントローラー)]に設定する必要があります。
マルチモーダルが有効になっている場合、SDKは手から離れたコントローラーの専用プロファイルを使って、現在ユーザーが手に持っていないコントローラーをトラッキングします。これらのプロファイルは、以下のコントローラータイプで自動的に登録されます。
- Oculus Touchコントローラー - 標準のTouchコントローラー
- Meta Quest Touch Proコントローラー - 機能強化されたTouch Proコントローラー
- Meta Quest Touch Plusコントローラー - Touch Plusコントローラー
SDKは、OpenXRランタイムによって検出されたアクティブなインタラクションプロファイルに基づいて、標準コントローラープロファイル(コントローラーを手に持っている場合)と手から離れたコントローラーのプロファイル(コントローラーを置いている場合)を自動的に切り替えます。これにより、システムは手と、手から離れたコントローラーの物理的な位置を同時にトラッキングできます。
ヘッドセットでマルチモーダルが動作していることを確認するにはどうすればよいですか?
手から離れたコントローラーのアクションパスからデータが提供されることを確認してください。
コードを変更せずに、自分のヘッドセットでこの機能を評価できますか?
いいえ。
コントローラーと手の切り替えは、サンプルでは動作しません。
Quest 2 (Meta Quest Proコントローラーがヘッドセットとペアリングされている場合)、Quest 3、Quest 3S、Quest Proのいずれかで実行していることを確認してください。
Using OVRCameraRig -> TrackingSpace to get positions of hands and controllers simultaneously
OVRCameraRig Tracking Spaceオブジェクト階層では、手とコントローラーのデータをレガシーアンカーを使って同時に提供するのは困難です。そのため、トラッキングスペース上に複数の新しいアンカーを作成し、コントローラーと手のprefabに、レンダリングするかどうかについてのゲートロジックを追加する必要があります。