OpenXR ランタイムは、インタラクション プロファイル を使用してさまざまなハードウェア コントローラーをサポートし、接続されているコントローラーにアクション バインディングを提供します。Unreal Engine の OpenXR 入力マッピングは、アクションを OpenXR インタラクション プロファイルに接続するために、アクション マッピング入力システム を活用します。アクション マッピング入力システムの使用方法については、「入力を新規作成する」を参照してください。
OpenXR の入力システムは、Unreal プロジェクトの アクション マッピング で明示的に指定されていないコントローラー マッピングをエミュレートすることで、デバイス間の互換性を提供するように設計されています。コントローラー マッピングをエミュレートする際、OpenXR ランタイムは、ユーザーのコントローラーと緊密に一致するコントローラー バインディングを選択します。 OpenXR では、このような相互互換性が提供されているため、サポートしていて、テスト可能なコントローラーのバインディングのみを追加する必要があります。コントローラーに指定したバインディングは、そのコントローラーに接続されているアクションの内容を定義します。コントローラーにバインディングを部分的にしか適用していない場合は、コントローラーは不明なバインディングを一切サポートしません。 次の例では、プロジェクトに 2 つのアクション、Jump (ジャンプ) と Pickup (ピックアップ) が含まれています。
- Jump は、Vive Index (L) Trigger や Oculus Touch (L) Trigger などの複数のコントローラーのキーにマッピングされています。
- Pickup は、Valve Index (L) A Touch にのみマッピングされています。 この場合、OpenXR ランタイムは他のコントローラーを Pickup アクション用にエミュレートしません。これは、このようなコントローラーに Jump 用のバインディングがあるものの、Pickup 用のバインディングはないためです。他のコントローラーのキーが Jump から削除された場合、OpenXR ランタイムは Jump および Pickup の両方のコントローラーをエミュレートできるようになります。

一部のランタイムは、単一のインタラクション プロファイルのみをサポートし、他のプロファイルをエミュレートする機能を備えていない場合があります。利用しており、サポートする予定のデバイスの数だけバインディングを追加することをお勧めします。
ポーズ
OpenXR では、ユーザーがアクションを実行する際に手をどのような状態にするかを表現するために、次の 2 つのポーズを提供しています。
- Grip (グリップ): 仮想オブジェクトを保持するためにユーザーが閉じた手の位置と向きを表します。
- Aim (指さし): ユーザーの手またはターゲットを指すために使用するコントローラーからの光線を表します。 2 つのポーズの詳細については、OpenXR の The OpenXR Specification を参照してください。Unreal Engine では、これら 2 つのポーズはモーション ソースとして表され、これらのポーズは Enumerate Motion Sources がデバイスで利用可能な場合は、Enumerate Motion Sources を呼び出すと結果として返されます。
Unreal Engine では、OpenXR 仕様に記載されているものとは異なる座標系を使用しています。Unreal では左手の座標系、すなわち+X 前方、+Z 上、+Y 右を使用します。
OpenXRMsftHandInteraction プラグインを有効にすると、HoloLens などこの拡張プラグインをサポートしているランタイムで、追跡対象の手の OpenXR グリップ ポーズや指さしポーズをレプリケートできます。