Unreal での手の追跡

ハンド トラッキング システムでは、人の手のひらと指が入力として使用されます。 すべての指の位置と回転、手のひら全体、手のジェスチャに関するデータを使用できます。 Unreal 4.26 以降、ハンド トラッキングは Unreal HeadMountedDisplay プラグインに基づいており、すべての XR プラットフォームとデバイスで共通の API が使用されます。 機能は、Windows Mixed Reality と OpenXR のどちらのシステムでも同じです。

手のポーズ

手のポーズを使用すると、ユーザーの手と指を入力として追跡して使用できます。これには、ブループリントと C++ の両方でアクセスできます。 Unreal API によってデータが座標系として送信され、ティックは Unreal Engine と同期されます。

ジョイントオーバーレイハンドスケルトン付きハンドスケルトン画像

階層は EHandKeypoint 列挙型によって記述されます。

手のキーポイントのブループリント オプションの画像

このデータはすべて、[モーション コントローラー データの取得] 関数を使用してユーザーの手から取得できます。 その関数からは XRMotionControllerData 構造体が返されます。 次に、XRMotionControllerData 構造体を解析して手の関節の位置を取得し、各関節の位置にデバッグ座標系を描画するブループリント スクリプトのサンプルを示します。

チャネル関数による行トレースに接続された視線データ取得関数のブループリント

構造体が有効であるかどうかと、それが手であるかどうかを確認することが重要です。 そうしないと、位置、回転、半径配列へのアクセスで未定義の動作が発生する可能性があります。

手のポーズは、Live Link プラグインを使用してアニメーションに公開されます。

Windows Mixed Reality と Live Link プラグインが有効になっている場合:

  1. [ウィンドウ] > [Live Link] を選択して、Live Link エディター ウィンドウを開きます。
  2. [ソース] を選択して、[Windows Mixed Reality ハンド トラッキングのソース] を有効にします

ライブ リンク ソース

ソースを有効にしてアニメーション資産を開いた後、[プレビュー シーン] タブの [アニメーション] セクションを展開すると、追加のオプションが表示されます。

ライブ リンク アニメーション

手のアニメーション階層は、EWMRHandKeypoint の場合と同じです。 アニメーションのターゲットは WindowsMixedRealityHandTrackingLiveLinkRemapAsset を使用して変更できます。

ライブ リンク アニメーション 2

エディターでサブクラス化することもできます。

Live Link Remap

ハンド メッシュ

重要

ハンド メッシュには OpenXR が必要です。

Unreal マーケットプレ―スまたは GitHub から入手可能な Microsoft OpenXR プラグインを使用する必要があります。

追跡対象ジオメトリとしてのハンド メッシュ

重要

OpenXR でハンド メッシュを追跡対象ジオメトリとして取得するには、[有効にされた追跡ジオメトリ] を使用して [ハンド メッシュの使用を設定] を呼び出す必要があります。

このモードを有効にするには、[有効にされた追跡ジオメトリ] を使用して [ハンド メッシュの使用を設定] を呼び出す必要があります。

追跡ジオメトリ モードを有効にしたハンド メッシュ関数を設定するために接続されたイベントの再生開始のブループリント

Note

両方のモードを同時に有効にすることはできません。 1 つを有効にすると、もう一方は自動的に無効になります。

ハンド メッシュ データへのアクセス

ハンド メッシュ

ハンド メッシュ データにアクセスする前に、次のことを行う必要があります。

  • ARSessionConfig 資産を選択し、[AR 設定] -> [ワールド マッピング] 設定を展開し、[追跡対象ジオメトリからメッシュ データを生成する] をオンにします。

既定のメッシュ パラメーターを次に示します。

  1. オクルージョンにメッシュ データを使用する
  2. メッシュ データの衝突を生成する
  3. メッシュ データのナビゲーション メッシュを生成する
  4. ワイヤーフレームでのメッシュ データのレンダリング – 生成されたメッシュを示すデバッグ パラメーター

これらのパラメーター値は、空間マッピング メッシュとハンド メッシュの既定値として使用されます。 任意のメッシュのブループリントまたはコードで、いつでも変更できます。

C++ API リファレンス

追跡可能なすべてのオブジェクトのハンド メッシュ値を検索するには、EEARObjectClassification を使用します。

enum class EARObjectClassification : uint8
{
    // Other types
	HandMesh,
};

次のデリゲートは、ハンド メッシュを含む追跡可能なオブジェクトがシステムで検出されると呼び出されます。

class FARSupportInterface
{
    public:
    // Other params
	DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
	DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
	DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};

デリゲート ハンドラーでは次の関数シグネチャに従う必要があります。

void UARHandMeshComponent::OnTrackableAdded(UARTrackedGeometry* Added)

メッシュ データには、UARTrackedGeometry::GetUnderlyingMesh を使用してアクセスできます。

UMRMeshComponent* UARTrackedGeometry::GetUnderlyingMesh()

ブループリント API リファレンス

ブループリントでハンド メッシュを操作するには:

  1. ブループリント アクターに ARTrackableNotify コンポーネントを追加します。

ARTrackable Notify

  1. [詳細] パネルに移動し、[イベント] セクションを展開します。

ARTrackable Notify 2

  1. イベント グラフ内の次のノードで、追加/更新/削除時の追跡対象ジオメトリを上書きします。

ARTrackable Notify の場合

OpenXR でのハンド メッシュの視覚化

ハンド メッシュを視覚化する場合は、Epic の XRVisualization プラグインを Microsoft OpenXR プラグインと共に使用する方法をお勧めします。

次に、ブループリント エディターで、パラメーターとして [有効にされた XRVisualization] を使用して Microsoft OpenXR プラグイン[ハンド メッシュの使用を設定] 関数を使用する必要があります。

有効な xrvisualization モードでハンド メッシュ関数を使用するように設定するために接続されたイベントの再生開始のブループリント

レンダリング プロセスを管理するには、XRVisualization から [モーション コントローラーのレンダリング] を使用する必要があります。

レンダリング モーション コントローラー関数に接続されたモーション コントローラー データ関数の取得のブループリント

結果は次のようになります。

実際の人間の手に重ね合わせられたデジタルハンドの画像

カスタム シェーダーを使用したハンド メッシュの描画などのより複雑な操作が必要な場合は、メッシュを追跡対象ジオメトリとして取得する必要があります。

手の光線

手のポーズの取得は、オブジェクトをつかんだりボタンを押したりするような密接な対話式操作で機能します。 ただし、ユーザーから離れたところにあるホログラムを操作する必要がある場合があります。 これは、C++ とブループリントの両方でポインティング デバイスとして使用できるハンド レイで実現できます。 手から遠くの地点への光線を描画し、Unreal レイ トレースを利用すると、手の届かないホログラムを選択できます。

重要

すべての関数の結果はフレームごとに変わるので、それらはすべて呼び出し可能になります。 純粋関数と非純粋関数または呼び出し可能関数の詳細については、ブループリントのユーザー ガイドで「関数」を参照してください。

ハンド レイのデータを取得するには、前のセクションの [モーション コントローラー データの取得] 関数を使用する必要があります。 返される構造体には、ハンド レイの作成に使用できる 2 つのパラメーター [目標の位置][目標の回転] が含まれています。 これらのパラメーターでは、肘で指示された光線を形成します。 これらを使用して、指されているホログラムを見つける必要があります。

次に、ハンド レイがウィジェットにヒットするかどうかを判断し、カスタム ヒット結果を設定する例を示します。

モーション コントローラー データの取得関数のブループリント

ジェスチャ

HoloLens 2 では空間ジェスチャを追跡します。つまり、これらのジェスチャを入力としてキャプチャできます。 ジェスチャの追跡は、サブスクリプション モデルに基づいています。 [ジェスチャの構成] 関数を使用して、追跡するジェスチャをデバイスに指示する必要があります。ジェスチャの詳細については、HoloLens 2 の基本的な使用方法に関するドキュメントを参照してください。

Windows Mixed Reality

ジェスチャ機能を構成するために接続されたイベントの開始再生のブループリント

次に、次のイベントをサブスクライブするためのコードを追加する必要があります。

Windows 空間入力ホールド、タップ、および左操作ジェスチャのブループリント詳細パネルの Windows 空間入力タップ ジェスチャ オプションのスクリーンショット

OpenXR

OpenXR では、ジェスチャ イベントは入力パイプラインを使用して追跡されます。 ハンド対話を使用すると、デバイスでは長押しジェスチャを自動的に認識できますが、他は認識しません。 OpenXRMsftHandInteraction [選択] および [つかむ] マッピングという名前です。 サブスクリプションを有効にする必要はありません。次のように、[プロジェクト設定]/[エンジン]/[入力] でイベントを宣言する必要があります。

OpenXR アクション マッピングのスクリーンショット

次の開発チェックポイント

用意されている Unreal 開発体験に従っている場合、MRTK コア構成要素を探索している段階にいます。 ここから、次の構成要素を続けることができます。

または、Mixed Reality プラットフォームの機能と API に移動します。

いつでも Unreal 開発チェックポイントに戻ることができます。