開発
開発
プラットフォームを選択

入力データの概要

更新日時: 2024/08/07

概要

このトピックでは、Interaction SDKがトラッキングデータをどのように取得、構造化、修正して、インタラクションを作成するかを説明します。Interaction SDKのすべてのインタラクションは、SDKがヘッドセットのカメラとコントローラーから直接受け取る、ヘッドセットの手とコントローラーの位置と回転に関する正確なデータに依存しています。

プロセスフロー

Interaction SDKは、一連のインターフェイス(IControllerIHandIHmdIBody)を使って入力データをフォーマットします。インターフェイスはそれぞれ、特定のタイプのデータを処理します。例えば、IHandは生のハンドデータを解釈し、IControllerは生のコントローラーデータを解釈します。インターフェイスによって、生の入力データが、Interaction SDKコンポーネントやprefabが理解できるような仕方で編さんされます。
OVR (Oculus仮想現実)プラグイン(ヘッドセット)から生の入力データを実際に取得する場合、Interaction SDKは、[From OVR...Source (OVR ...ソースから)]または[From Unity XR ...Source (Unity XR ...ソースから)]のコンポーネントを使います。「...」部分にはデータのソースが入ります(例: From OVR Body Data SourceまたはFrom OVR Hand Data Sourceなど)。[From ...Source (... ソースから)]のコンポーネントはそれぞれ特定のタイプのデータを取得し、3つのインターフェイスのうちのいずれか1つを使ってそれを整理します。インタラクションは、これらのコンポーネントから得たデータを利用して、手、コントローラー、または体の位置を決定します。これらのコンポーネントは、関連するInteraction SDK prefabにすでに含まれているため、手動で追加する必要はありません(例えば、OVRHands prefabには[From OVR Hand Data Source (OVRハンドデータソースから)]コンポーネントが、またUnityXRHands prefabには[From Unity XR Hand Data Source (Unity XRハンドデータソースから)]コンポーネントが含まれています)。
From ...Sourceコンポーネントには、次のものがあります。
  • Meta Interaction SDKパッケージ
    • From OVR Body Data Source (OVRボディデータソースから)
    • From OVR Controller Data Source (OVRコントローラーデータソースから)
    • From OVR Controller Hand Data Source (OVRコントローラーハンドデータソースから)
    • From OVR Hand Data Source (OVRハンドデータソースから)
    • From OVR Hmd Data Source (OVR HMDデータソースから)
  • Unity XR Handsがインストールされている場合のMeta Interaction SDK Essentialsパッケージ
    • From Unity XR Hand Data Source (Unity XRハンドデータソースから)
    • From Unity XR Controller Data Source (Unity XRコントローラーデータソースから)
    • From Unity XR Hmd Data Source (Unity XR HMDデータソースから)
Data flow from the headset to the From OVR Source components
ヘッドセットから各[From ...Source (... ソースから)]コンポーネントに送られる生の入力データ。それぞれが、3つのInteraction SDKインターフェイスのうち1つを使う。

ハンド入力データの処理

[From ...Source (... ソースから)]コンポーネントから入力データを取得したら、Interactorがそれを使えるようになります。ただし、ハンドデータはInteractorにルーティング(送信)される前に処理可能です。その他のタイプの入力データの処理は不要です。ハンドデータを処理することにより、次のことができます。
  • ジッター(ゆらぎ)の最小化や除去
  • ボタンを押すときや仮想オブジェクトをつかむときなど、仮想の手の指を物理的な指とは違うポーズにする。
  • レイインタラクターの起点を、物理的な手やコントローラーではなく、仮想の手やコントローラーの位置に基づいてオフセットする。
ハンドデータを処理するには、そのデータをIHandインターフェイスを使う特定のコンポーネント(HandFilterなど)に渡した後、そのコンポーネントを[From ...Source (... ソースから)]コンポーネントの代わりにInteractorのデータソースとして使います。この操作は、手を使っている場合にもコントローラー駆動の手を使っている場合にも実行します。
HandGrabExamplesシーンから取得したハンドデータを処理するおすすめの方法を以下に示します。この処理をpokeやgrab以外のインタラクションに使う場合は、SyntheticHandを省略します。手が視覚的に正しく見えるようにするために手の関節データを修正することが必要なのは、pokeとgrabの場合だけだからです。
Hand data processing
ハンドデータがレンダリングされる前に複数のコンポーネントで処理されているところ。
これらのコンポーネントによってハンドデータがどのように処理されるかを以下に示します。
  1. FromOVRHandDataSourceOVRHandから得たデータをIHandを使って変換し、そのデータをInteraction SDKのコンポーネントが認識できるようにします。
    • FromUnityXRHandDataSourceコンポーネントを使う場合は、Unity XRの手から受け取ったOpenXRデータがCore SDKハンドデータに変換されます。
  2. HandFilterは、指定されたフィルターを使って入力の手の位置データを滑らかにして、ジッターを減らします。
  3. SyntheticHandは、関節データをオーバーライドすることにより手のポーズを調整します。これは、pokeの際に指がボタンを突き抜けてしまわないようにしたり、物をつかむ際の指がポーズに沿ったものになるようにしたりするためです。
  4. HandVisualは、処理済みのデータを使って手をレンダリングします。

    動画: レンダリングされた手がボタンやタッチパッドオブジェクトに触れる様子。

SyntheticHandで処理されていないハンドデータとSyntheticHandで処理されたデータの違い。pokeの際、未処理データを使う手はボタンを突き抜けるが、処理済みデータを使う左手の場合は視覚的にpokeが制限される。

ハンド入力データのルーティング

手とコントローラーの入力データは、最終的にInteractorに送られます。上記のセクションに示されているコンポーネントも含め、すべてのハンドデータコンポーネントにはIHandが実装されているため、そのいずれかを使うことによってアプリのさまざまな側面を駆動します。例えば、レイインタラクションでは、HandFilterのハンドデータを使ってレイ(光線)の起点を設定したり、SyntheticHandを使って手のビジュアルを設定したりすることができます。
Two possible ways to route data
アプリのさまざまな部分にデータをルーティングする。上の図の場合、RayInteractorはハンドデータを受け取って物理的手の位置を判定するが、HandVisualはそのデータのフィルターバージョンを受け取って仮想の手の動きをスムーズにする。下の図のSyntheticHandは、2組のデータを受け取る。Handから直接受け取るデータは物理的な手の位置を示すものであり、HandGrabVisualから得るデータは何かをつかむ際の仮想手の外観を決定する。

主なコンポーネント

OVRInteraction

OVRInteraction prefabは、手、コントローラー、コントローラー駆動の手のための取り付けの基盤となるものです。
デフォルトの場合、OVRInteraction prefabのコンテンツは以下のみになります。
OVRInteraction hiearchy
手、コントローラー、コントローラー駆動の手の設定方法については、Interaction SDKスタートガイドをご覧ください。
Unity XRデータプロバイダーを設定する手順については、Interaction SDKとUnity XRのスタートガイドをご覧ください。

Hand

Interaction SDKに含まれる、手のための基本データコンポーネントは、Handと呼ばれます。
Handは、手に関連したポーズデータ、ピンチの状態、ポインターポーズ、入力可能性を提供します。
このデータは、FromOVRHandDataSourceコンポーネントによって、OVRHandから得られます。FromUnityXRHandDataSourceコンポーネントにより、Unity XRの手から受け取ったOpenXRデータがCore SDKハンドデータに変換されます。

IHand

IHandは、Handデータへのアクセスに使う基本インターフェイスです。コンポーネントでは、実際のHandではなく、IHandインターフェイスを使って手のデータを利用するようにしてください。

HandRef

HandRefは、IHandコンポーネント用のパススルーコンポーネントです。すべてのInteractor prefabのルートGameObjectには、その子コンポーネントを紐付けることのできるHandRefコンポーネントがあります。
こうする主なメリットは、インタラクションprefabの接続に必要なシーンの紐付けを最小限に減らせることです。HandOVRInput prefabからインタラクションprefab内の各コンポーネントに紐付けなくても、prefabの最上位のHandRefに紐付けるだけで、prefab中のすべての子オブジェクトはそのHandRefを参照するようになります。

Controller

Interaction SDKの中で、コントローラー用の基本データコンポーネントは、Controllerと呼ばれます。
Controllerは、コントローラーのポーズデータ、ボタンの状態、コントローラーに関連した入力可能性を提供します。
このデータは、FromOVRControllerDataSourceコンポーネントによって、OVRInputから得られます。FromUnityXRControllerDataSourceコンポーネントは、このデータをUnity入力システムのOpenXRサポートから取得します。

IController

IControllerは、Controllerデータへのアクセスに使う基本インターフェイスです。コンポーネントでは、実際のControllerではなく、IControllerインターフェイスを使ってコントローラーのデータを利用するようにしてください。

ControllerRef

ControllerRefは、HandRefと同じく、IControllerコンポーネント用のパススルーコンポーネントです。コントローラーを参照するすべてのInteractor prefabのルートGameObjectには、子コンポーネントを紐付けできるControllerRefコンポーネントがなければなりません。

Modifier

データは、OVRPluginから、いくつかのクラスを経由してControllerHandなどのデータ型へと送られます。それらのどれについても、総称基底クラスであるDataSource<TDataType>を通じてIDataSourceが実装されています。
このインターフェイスの最も重要なフィールドはIDataSource.InputDataAvailableイベントです。これを介して、更新されたトラッキングデータやポーズデータが、さまざまなコンポーネントから依存対象に渡されます。
派生クラスDataSourceは、特定の型(HandDataAssetなど)のデータを提供できます。
DataModifier (それ自体DataSourceから派生)によって、さらに機能が追加されます。これはHandDataAsset上で後処理機能の働きをします。DataModifierは、DataSourceからデータを読み、変更を適用し、結果をキャッシュに入れた後、IDataSourceインターフェイスを通じてそれらの結果を提供します。

LastKnownGoodHand

LastKnownGoodHandは、手に関する既知の最後の良好なデータを、下位の修正チェーンに渡すことのみ行います。それに提供されるデータが何らかの理由(トラッキングが失われた、トラッキング品質が低いなど)で無効になった場合、有効な最後の手データが維持されます。

SyntheticHand

SyntheticHandは、手の関節データ(指や手首の位置や回転を含む)に対して手動で変更を加えるために使うことができます。HandGrabシーンでは、これを使ってマグカップのつかみ方が調整されています。ボタンを押した際に指をどこまで動かせるかを視覚的に制限する場合にも使われます。これはpoke制限と呼ばれます。
フレームのインタラクションロジックがすべて完了したら(通常はフレームの最後)、SyntheticHandを更新してください。
SyntheticHandは、希望するポーズに収めることによって、または回転量と拡散の上限を設定することによって、関節を円滑にロック/ロック解除します。指定された曲線と速度を調整すれば、スナップの加減を調整できます。
SyntheticHandへの直接呼び出しによって、関節をオーバーライドすることができます。それ以外のコンテキストでは、ジョイントのロックとロック解除を処理するためのコンポーネントがあります。
複数のInteractorVisualが同時にジョイントをロックまたはロック解除しようとする可能性があるため、InteractorGroupにより、SyntheticHandに作用するInteractorVisualが常に1つだけになるようにすることができます。

HandFilter

HandFilterでは、1ユーロフィルターを使用して、入力ストリームの位置データと回転データの両方を補正します。1ユーロフィルターは、遅延を増大させることなく値を安定させるのに役立つ、速度ベースのフィルターです。任意で[Filter Parameters(フィルターパラメーター)]フィールドが、HandFilterParameterBlockアセットを使って設定されます。このアセットには、手首の位置、手首の回転、指の回転に関する以下の値が含まれています。
  • ベータ(0は遅延最大、10は遅延最小)。
  • 最小カットオフ(0の場合はフィルター補正最大かつ遅延増大、10の場合はフィルター補正最小)。
  • Dカットオフは、微分カットオフを表し、エフェクトをさらに細かく調整するために使用できます。
さらに、HandFilterParameterBlock は、1秒当たりのフレーム数として測定した頻度値が含まれています。これが1ユーロフィルターに渡されます。[Filter Parameters(フィルターパラメーター)]に値が設定されていない場合、フィルターは適用されません。

Body

Interaction SDKに含まれるボディ用の基本データコンポーネントは、Bodyと呼ばれます。
Bodyは、体の骨組みに関連するポーズデータ、入力可能状況、関節マッピングを提供します。FromOVRBodyDataSourceコンポーネントでは、このデータをMeta XR Core SDKに含まれるOVRBodyから取得できます。このSDKは個別に入手することも、Meta XR All-in-One SDKに同梱物として入手することもできます。
使っているのがUnity XRデータソースだけの場合、ボディデータは利用できません。

IBody

IBodyは、Bodyデータへのアクセスに使う基本インターフェイスです。コンポーネントでは、実際のBodyではなく、IBodyインターフェイスを使ってボディのデータを利用するようにしてください。

ISkeletonMapping

体の骨組みにはそれぞれ異なる関節セットや親子関係が含まれることがあり、これらのパラメーターはISkeletonMappingによって表されます。
関節にローカルポーズデータを使う場合、その関節の親が認識されていなければ、データを有効活用できません。特定の関節の親を見つけるには、ISkeletonMapping.TryGetParentJointId()メソッドを使います。
BodyJointIdには膨大な関節が含まれており、現在の骨組みデータでは利用できないことがあります。使用するには、事前にISkeletonMapping.Joints HashSetで特定の関節が存在しているかどうかチェックする必要があります。
BodySkeletonMappingはScriptableObjectであり、ISkeletonMappingを含んでいます。これ自体には、ISkeletonMappingインターフェイスが公開されています。

詳しくはこちら

  • Interaction SDKアーキテクチャー全概要については、アーキテクチャーの概要をご覧ください。
  • インタラクションを開始するために手やコントローラーに接続されているInteractorについて詳しくは、Interactorをご覧ください。
  • Interactorに応答するオブジェクトに接続されているInteractableについて詳しくは、Interactableをご覧ください。
  • 同時に複数のホバリングがある場合にどのようにInteractorを優先順位付けするかについて詳しくは、InteractorGroupをご覧ください
  • ボディポーズ検出のコンポーネントについて詳しくは、ボディポーズ検出をご覧ください。
ナビゲーションロゴ
日本語
© 2026 Meta