OpenXR による入力

OpenXR ランタイムは、できる限り多くのプラットフォームをサポートするコントローラー エミュレーションと、没入感のあるインタラクションを作成するためのコントローラーとハンド ポーズを提供します。

Choose your operating system:

Windows

macOS

Linux

OpenXR ランタイムは、 インタラクション プロファイル を使用してさまざまなハードウェア コントローラーをサポートし、接続されているコントローラーにアクション バインディングを提供します。Unreal Engine の OpenXR 入力マッピングは、アクションを OpenXR インタラクション プロファイルに接続するために、 アクション マッピング入力システム を活用します。アクション マッピング入力システムの使用方法については、「 入力を新規作成する 」を参照してください。

Default engine input action mappings

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 の両方のコントローラーをエミュレートできるようになります。

Example engine input action mappings

一部のランタイムは、単一のインタラクション プロファイルのみをサポートし、他のプロファイルをエミュレートする機能を備えていない場合があります。利用しており、サポートする予定のデバイスの数だけバインディングを追加することをお勧めします。

ポーズ

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 グリップ ポーズや指さしポーズをレプリケートできます。 OpenXR hand interaction plugin

モーションコントローラー

モーション コントローラー には、プロジェクトの ポーン にある Motion Controller コンポーネント を通じてアクセスできます。Motion Controller コンポーネントは、 Scene コンポーネント を継承していて、ロケーションベースのビヘイビアをサポートし、ハードウェアからの追跡データに基づいて移動します。このコンポーネントでは、モーション コントローラーをレンダリングする機能、およびポーンで定義されているユーザー インタラクション用にコントローラーを公開する機能が提供されています。これらの両方の機能をセットアップする方法について、以下のセクションで説明します。

Adding Motion Controller Component

視覚化する

Motion Controller コンポーネントの [Details (詳細)] パネルの [Visualization (ビジュアライゼーション)] セクションで、コントローラー用のモデルを表示するかどうか、およびどの スタティック メッシュ を使用するかを指定できます。メッシュに適用できる マテリアルのオーバーライド を指定することもできます。

Motion Controller details

[Details] パネルの [Motion Controller (モーション コントローラー)] セクションにある [Motion Source (モーション ソース)] で、モーション コントローラーのモーション ソースを設定できます。モーション ソースは、追跡対象の位置と回転をフェッチするために XR エクスペリエンスでどの入力ソースが想定されているかを特定する FName です。[Motion Source] の FName のリストは、追加のプラグインを使用して拡張することができます。ユーザーのどちらかの手にあるコントローラー選択するには、[Motion Source] で [Left (左)] または [Right (右)] を選択します。

詳細にアクセスする

モーション コントローラーは Scene コンポーネントを継承しているので、シーン内にデバイスのトランスフォームが含まれていて、 GetWorldLocation などの関数でそれにアクセスできます。また、メッシュや他の Scene コンポーネントを Motion Controller コンポーネントにアタッチして、仮想コンテンツがユーザーの手にアタッチされているように見せることもできます。

モーション コントローラーに関するデバイス特有の情報 ( グリップ位置 ハンド キー位置 、など) にアクセスするには、 Get Motion Controller Data ノードおよび Break XRMotionControllerData ノードをブループリントに追加します。その際に、データの取得元となる Hand に関する情報を渡す必要があります。そうするには、 Motion Controller 変数に対して Get Motion Source を呼び出して、 [Left] または [Right] に設定されているかどうかを確認し、それを Get Motion Controller Data 関数の Hand 入力として渡します。

画像をクリックして拡大表示

プラグイン間での向き

OpenXR では、プラットフォーム間でのモーション コントローラーの挙動の基準が定められています。

OpenXR 規格が作成される前は SDK ごとに異なる挙動が実装されていた可能性があるので、モーション コントローラーの原点と向きがどのように表されているかがプラグイン間で食い違っている場合があります。以下の画像は、ランタイム時にモーション コントローラーの向きをどのように指定できるかの例 (Oculus VR プラグインと OpenXR プラグイン) を示しています。

Motion Controller コンポーネントには 3D ギズモ、および子コンポーネントとしてアタッチされている Oculus Quest 2 コントローラー モデルがあります。

  • 左側の画像は、Oculus VR プラグインを使用している場合のランタイム時の挙動を示しています。コントローラーの原点はジョイスティックの位置にあり、コントローラーの向きは Z 軸と X 軸の間を向いています。

  • 右側の画像は、OpenXR プラグインを使用している場合のランタイム時の挙動を示しています。コントローラーの原点はグリップ ボタンの位置にあり、コントローラーの向きは X 軸と平行です。

This image shows the Motion Controller Component's Transform, illustrated by the 3D Gizmo, relative to the Quest 2 controller model using the Oculus VR plugin at runtime

This image shows the Motion Controller Component's Transform, illustrated by the 3D Gizmo, relative to the Quest 2 controller model using the OpenXR plugin at runtime

ハンド トラッキング

現在、Unreal Engine でハンド トラッキングがサポートされているのは、HoloLens 2 と Oculus Quest の 2 つのプラットフォームです。これらのプラットフォームでユーザー入力のハンド トラッキングの使用を始める方法について、以下のセクションで説明します。

HoloLens 2

HoloLens 2 でのハンド トラッキングは、Microsoft OpenXR プラグインを介して利用できます。 Microsoft OpenXR プラグインで定義されているハンド トラッキング機能は、 OpenXR および XRMotionController の関数と互換性があります。ユーザーの手の視覚化および入力としての使用の詳細については、Microsoft の『 ハンド トラッキングのドキュメント 』を参照してください。

HoloLens hand tracking

Oculus Quest

Oculus Quest でのハンド トラッキングは、 Oculus VR プラグインを介して利用できます。Oculus Quest でのハンド トラッキングを OpenXR アプリで使用するには、 OpenXR Oculus VR の両方のプラグインが有効になっている必要があります。Oculus Quest でのハンド トラッキングの API は Oculus のカスタム コンポーネントで提供されています。ユーザーの手の視覚化および入力としての使用の詳細については、Oculus の『 ハンド トラッキングのドキュメント 』を参照してください。

Oculus Quest hand tracking

トレーニング ストリーム

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル