Unreal での手の追跡Hand tracking in Unreal

概要Overview

ハンドトラッキングシステムは、ユーザーのてのひらとフィンガーを入力として使用します。The hand tracking system uses a person’s palms and fingers as input. コード内で使用するすべての指、パーム全体、およびハンドジェスチャの位置と回転を取得できます。You can get the position and rotation of every finger, the entire palm, and even hand gestures to use in your code.

手の形Hand Pose

手の形で、アクティブなユーザーの手と指を追跡し、それを入力として使用できます。これは、ブループリントと C++ を通じてアクセスできます。Hand pose lets you track the hands and fingers of the active user and use it as input, which you can access through Blueprints and C++. 詳細な技術情報については、Unreal の「 Windows. ..」 API を参照してください。You can find more technical details in Unreal's Windows.Perception.People.HandPose API. Unreal API は、Unreal エンジンとの間で同期されたティックを使用して、データを座標系として送信します。The Unreal API sends the data as a coordinate system, with ticks synchronized with the Unreal Engine.

ボーン階層についてUnderstanding the bone hierarchy

この EWMRHandKeypoint 列挙型は、手のボーン階層を記述します。The EWMRHandKeypoint enum describes the Hand’s bone hierarchy. ブループリントに記載されている各ハンドキーポイントを見つけることができます。You can find each hand keypoint listed in your Blueprints:

ハンドキーポイント BP

完全な C++ 列挙型を以下に示します。The full C++ enum is listed below:

enum class EWMRHandKeypoint : uint8
{
    Palm,
    Wrist,
    ThumbMetacarpal,
    ThumbProximal,
    ThumbDistal,
    ThumbTip,
    IndexMetacarpal,
    IndexProximal,
    IndexIntermediate,
    IndexDistal,
    IndexTip,
    MiddleMetacarpal,
    MiddleProximal,
    MiddleIntermediate,
    MiddleDistal,
    MiddleTip,
    RingMetacarpal,
    RingProximal,
    RingIntermediate,
    RingDistal,
    RingTip,
    LittleMetacarpal,
    LittleProximal,
    LittleIntermediate,
    LittleDistal,
    LittleTip
};

各列挙型のケースの数値は、 HandJointKind テーブルで確認できます。You can find the numerical values for each enum case in the Windows.Perception.People.HandJointKind table. 次の図は、一致する列挙型のケースを持つ完全なレイアウトを示しています。The entire hand pose layout with matching enum cases is shown in the image below:

手スケルトン

ハンドトラッキングのサポートSupporting Hand Tracking

手動追跡機能を追加することによって、ブループリントで 手動追跡を 使用することができます > Windows Mixed Reality:You can use hand tracking in Blueprints by adding Supports Hand Tracking from Hand Tracking > Windows Mixed Reality:

ハンドトラッキング BP

この関数は true 、デバイスでハンドトラッキングがサポートされている場合、および false ハンドトラッキングが使用できない場合にを返します。This function returns true if hand tracking is supported on the device and false if hand tracking is not available.

ハンドトラッキング BP のサポート

C++:C++:

WindowsMixedRealityHandTrackingFunctionLibrary.h を含めます。Include WindowsMixedRealityHandTrackingFunctionLibrary.h.

static bool UWindowsMixedRealityHandTrackingFunctionLibrary::SupportsHandTracking()

ハンドトラッキングの取得Getting Hand Tracking

GetHandJointTransform を使用して、空間データを手動で返すことができます。You can use GetHandJointTransform to return spatial data from the hand. データはすべてのフレームを更新しますが、フレーム内にいる場合は、返された値がキャッシュされます。The data updates every frame, but if you're inside a frame the returned values are cached. パフォーマンス上の理由から、この関数では大きなロジックを使用しないことをお勧めします。It's not recommended to have heavy logic in this function for performance reasons.

ハンドジョイント変換の取得

C++:C++:

static bool UWindowsMixedRealityHandTrackingFunctionLibrary::GetHandJointTransform(EControllerHand Hand, EWMRHandKeypoint Keypoint, FTransform& OutTransform, float& OutRadius)

関数パラメーターの内訳:Function parameter breakdown:

  • : ユーザーの左側または右側Hand – an be the left or right hand of the user
  • Keypoint –ハンドのボーンです。Keypoint – the bone of the hand.
  • Transform –ボーンの基本の座標と向きを調整します。Transform – coordinates and orientation of bone’s base. 次のボーンのベースを要求して、ボーンの終点の変換データを取得できます。You can request the base of the next bone to get the transform data for the end of a bone. 特別なヒントのボーンは、distal の終わりを示します。A special Tip bone gives end of distal.
  • Radius : ボーンのベースの半径。Radius — radius of the base of the bone.
  • 戻り値 -ボーンがこのフレームを追跡している場合は true、ボーンが追跡されていない場合は false。Return Value — true if the bone is tracked this frame, false if the bone is not tracked.

Live Link プラグインを使用して、手の形でアニメーションに公開されます。Hand poses are exposed to Animation using the Live Link plugin.

Windows Mixed Reality とライブリンクプラグインが有効になっている場合:If the Windows Mixed Reality and Live Link plugins are enabled:

  1. [ ウィンドウ > ライブリンク ] を選択して、ライブリンクエディターウィンドウを開きます。Select Window > Live Link to open the Live Link editor window.
  2. [ソース] をクリックし、[ Windows Mixed Reality ハンドトラッキングソース を有効にする]Click Source and enable Windows Mixed Reality Hand Tracking Source

ライブリンクのソース

ソースを有効にし、アニメーションのアセットを開くと、[プレビューシーン] タブの [アニメーション] セクションが表示されなくなります (詳細については、「ライブリンクのドキュメント」を参照してください。プラグインがベータ版であるため、プロセスは後で変更される可能性があります)。After you enable the source and open an animation asset, expand the Animation section in the Preview Scene tab too see additional options (the details are in Unreal’s Live Link documentation - as the plugin is in beta, the process may change later).

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

ハンドアニメーション階層は、の場合と同じ EWMRHandKeypoint です。The hand animation hierarchy is the same as in EWMRHandKeypoint. アニメーションは、 WindowsMixedRealityHandTrackingLiveLinkRemapAsset を使用して再ターゲットできます。Animation can be retargeted using WindowsMixedRealityHandTrackingLiveLinkRemapAsset:

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

また、エディターでサブクラス化することもできます。It can also be subclassed in the editor:

ライブリンクの再マップ

手メッシュデータへのアクセスAccessing Hand Mesh Data

手動メッシュ

手作業のメッシュデータにアクセスするには、次のことを行う必要があります。Before you can access hand mesh data, you'll need to:

  • Arsessionconfig 資産を選択し、 AR の設定-> 世界のマッピング 設定を展開して、[追跡された ジオメトリからメッシュデータを生成 する] チェックボックスをオンにします。Select your ARSessionConfig asset, expand the AR Settings -> World Mapping settings, and check Generate Mesh Data from Tracked Geometry.

既定のメッシュパラメーターを次に示します。Below are the default mesh parameters:

  1. 遮蔽にメッシュデータを使用するUse Mesh Data for Occlusion
  2. メッシュデータの競合を生成するGenerate Collision for Mesh Data
  3. メッシュデータの Nav メッシュを生成しますGenerate Nav Mesh for Mesh Data
  4. ワイヤーフレームでメッシュデータをレンダリングする–生成されたメッシュを示すデバッグパラメーターRender Mesh Data in Wireframe – debug parameter that shows generated mesh

これらのパラメーター値は、空間マッピングメッシュと手動メッシュの既定値として使用されます。These parameter values are used as the spatial mapping mesh and hand mesh defaults. これらは、任意のメッシュのブループリントまたはコードでいつでも変更できます。You can change them at any time in Blueprints or code for any mesh.

C++ API リファレンスC++ API Reference

EEARObjectClassificationを使用すると、すべての追跡可能なオブジェクトで手動メッシュ値を検索できます。Use EEARObjectClassification to find hand mesh values in all trackable objects.

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

システムによって追跡可能なオブジェクト (手メッシュを含む) が検出されると、次のデリゲートが呼び出されます。The following delegates are called when the system detects any trackable object, including a hand mesh.

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

デリゲートハンドラーが以下の関数シグネチャに従うことを確認します。Make sure your delegate handlers follow the function signature below:

void UARHandMeshComponent::OnTrackableAdded(UARTrackedGeometry* Added)

メッシュデータには、を使用してアクセスでき UARTrackedGeometry::GetUnderlyingMesh ます。You can access mesh data through the UARTrackedGeometry::GetUnderlyingMesh:

UMRMeshComponent* UARTrackedGeometry::GetUnderlyingMesh()

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

ブループリントを使用するには、次のようにします。In order to work with Hand Meshes in Blueprints:

  1. ARTrackableNotify コンポーネントをブループリントアクターに追加するAdd an ARTrackableNotify Component to a Blueprint actor

ARTrackable 通知

  1. [ 詳細 ] パネルにアクセスし、[ イベント ] セクションを展開します。Go to the Details panel and expand the Events section.

ARTrackable 通知2

  1. イベントグラフ内の次のノードを使用して、追跡したジオメトリの追加/更新/削除を上書きします。Overwrite On Add/Update/Remove Tracked Geometry with the following nodes in your Event Graph:

ARTrackable 通知で

手の線Hand Rays

SpatialPointerInteractionSourcePose API を公開する C++ とブループリントの両方で、ポインティングデバイスとしてハンドレイを使用できます。You can use a hand ray as a pointing device in both C++ and Blueprints, which exposes the Windows.UI.Input.Spatial.SpatialPointerInteractionSourcePose API.

すべての関数の結果がすべてのフレームに変更されるため、すべての関数が呼び出し可能になることに注意してください。It’s important to mention that since the results of all the functions change every frame, they're all made callable. 純粋関数と純粋でない関数、または呼び出し可能関数の詳細については、「関数のブループリントユーザー guid」を参照してください。For more information about pure and impure or callable functions, see the Blueprint user guid on functions

ブループリントを使用するには、 Windows Mixed Reality HMD で任意のアクションを検索します。To use Hand Rays in Blueprints, search for any of the actions under Windows Mixed Reality HMD:

ハンド光線 BP

C++ でこれらのファイルにアクセスするには、 WindowsMixedRealityFunctionLibrary.h 呼び出し元のコードファイルの先頭にを含めます。To access them in C++, include WindowsMixedRealityFunctionLibrary.h to the top of your calling code file.

列挙型Enum

また、[ Ehmdinputコントローラー] の下にある入力ケースにアクセスできます。このボタンは、ブループリントで使用できます。You also have access to input cases under EHMDInputControllerButtons, which can be used in Blueprints:

入力コントローラーボタン

C++ でのアクセスには、 EHMDInputControllerButtons 列挙型クラスを使用します。For access in C++, use the EHMDInputControllerButtons enum class:

enum class EHMDInputControllerButtons : uint8
{
    Select,
    Grasp,
//......
};

次に、該当する2つの列挙型ケースの内訳を示します。Below is a breakdown of the two applicable enum cases:

  • Select -ユーザーがトリガーした選択イベント。Select - User triggered Select event.
    • このイベントは、外気タップ、宝石、およびコミットによって HoloLens 2 でトリガーされます。または、 音声入力 を有効にした "選択" を言います。The event can be triggered in HoloLens 2 by air-tap, gaze and commit, or by saying “Select” with voice input enabled.
  • ユーザーによってトリガーされるイベントを 把握 します。Grasp - User triggered Grasp event.
    • このイベントは、ホログラムでユーザーの指を閉じることで、HoloLens 2 でトリガーできます。This event can be triggered in HoloLens 2 by closing the user’s fingers on a hologram.

次に示す列挙体を使用して、C++ でのハンドメッシュの追跡状態にアクセスでき EHMDTrackingStatus ます。You can access the tracking status of your hand mesh in C++ through the EHMDTrackingStatus enum shown below:

enum class EHMDTrackingStatus : uint8
{
    NotTracked,
    //......
    Tracked
};

次に、該当する2つの列挙型ケースの内訳を示します。Below is a breakdown of the two applicable enum cases:

  • Nottracked –-ハンドは表示されませんNotTracked –- the hand isn’t visible
  • 追跡 –ハンドは完全に追跡されます。Tracked –- the hand is fully tracked

構造体Struct

PointerPoseInfo 構造体は、次のような手作業のデータに関する情報を提供します。The PointerPoseInfo struct can give you information on the following hand data:

  • Origin –ハンドオリジンOrigin – origin of the hand
  • 方向 –ハンドの方向Direction – direction of the hand
  • アップ (手動)Up – up vector of the hand
  • 方向 -方向の四元数Orientation – orientation quaternion
  • ステータスの追跡 -現在の追跡状態Tracking Status – current tracking status

これには、次に示すように、ブループリントを使用してアクセスできます。You can access this through Blueprints, as shown below:

ポインターのポーズ情報 BP

C++ の場合:Or with C++:

struct FPointerPoseInfo
{
    FVector Origin;
    FVector Direction;
    FVector Up;
    FQuat Orientation;
    EHMDTrackingStatus TrackingStatus;
};

機能Functions

次に示すすべての関数は、継続的な監視を可能にするすべてのフレームに対して呼び出すことができます。All of the functions listed below can be called on every frame, which allows continuous monitoring.

  1. ポインターの取得の詳細 情報は、現在のフレームにおけるハンドレイの方向に関する完全な情報を返します。Get Pointer Pose Info returns complete information about the hand ray direction in the current frame.

建築Blueprint:

ポインターの表示情報の取得

C++:C++:

static FPointerPoseInfo UWindowsMixedRealityFunctionLibrary::GetPointerPoseInfo(EControllerHand hand);
  1. Grasped は、現在のフレームに Grasped がある場合に true を返します。Is Grasped returns true if the hand is grasped in the current frame.

建築Blueprint:

Grasped BP

C++:C++:

static bool UWindowsMixedRealityFunctionLibrary::IsGrasped(EControllerHand hand);
  1. Select 押さ れた場合、ユーザーが現在のフレームで select をトリガーした場合は true を返します。Is Select Pressed returns true if the user triggered Select in the current frame.

建築Blueprint:

選択された BP (BP)

C++:C++:

static bool UWindowsMixedRealityFunctionLibrary::IsSelectPressed(EControllerHand hand);
  1. 現在のフレームでイベントまたはボタンがトリガーされた場合、ボタンがクリックされる と true が返されます。Is Button Clicked returns true if the event or button is triggered in the current frame.

建築Blueprint:

ボタンが BP をクリックしました

C++:C++:

static bool UWindowsMixedRealityFunctionLibrary::IsButtonClicked(EControllerHand hand, EHMDInputControllerButtons button);
  1. コントローラー追跡状態の取得 は、現在のフレームの追跡状態を返します。Get Controller Tracking Status returns the tracking status in the current frame.

建築Blueprint:

コントローラー追跡ステータス BP の取得

C++:C++:

static EHMDTrackingStatus UWindowsMixedRealityFunctionLibrary::GetControllerTrackingStatus(EControllerHand hand);

ジェスチャGestures

Hololens 2 では、空間ジェスチャを追跡できます。これは、これらのジェスチャを入力としてキャプチャできることを意味します。The Hololens 2 can track spatial gestures, which means you can capture those gestures as input. ジェスチャの詳細については、「 HoloLens 2 の基本的な使用方法 」を参照してください。You can find more details about gestures are the HoloLens 2 Basic Usage document.

のブループリント関数は、呼び出し元のコードファイルにを追加することで、 Windows Mixed Reality 空間入力 と C++ 関数の下に WindowsMixedRealitySpatialInputFunctionLibrary.h あります。You can find the Blueprint function in under Windows Mixed Reality Spatial Input, and the C++ function by adding WindowsMixedRealitySpatialInputFunctionLibrary.h in your calling code file.

キャプチャジェスチャ

列挙型Enum

建築Blueprint:

ジェスチャの種類

C++:C++:

enum class ESpatialInputAxisGestureType : uint8
{
    None = 0,
    Manipulation = 1,
    Navigation = 2,
    NavigationRails = 3
};

機能Function

ジェスチャのキャプチャを有効または無効にするには、関数を使用 CaptureGestures します。You can enable and disable gesture capture with the CaptureGestures function. 有効なジェスチャによって入力イベントが発生した場合、この関数はジェスチャキャプチャが成功した場合はを返し、エラーが発生した場合はを返し true false ます。When an enabled gesture fires input events, the function returns true if gesture capture succeeded, and false if there's an error.

建築Blueprint:

キャプチャジェスチャ BP

C++:C++:

static bool UWindowsMixedRealitySpatialInputFunctionLibrary::CaptureGestures(
    bool Tap = false, 
    bool Hold = false, 
    ESpatialInputAxisGestureType AxisGesture = ESpatialInputAxisGestureType::None, 
    bool NavigationAxisX = true, 
    bool NavigationAxisY = true, 
    bool NavigationAxisZ = true);

次に示すのは、[ブループリント] と [C++: キーイベント] で確認できる主要なイベントです。 The following are key events, which you can find in Blueprints and C++: Key Events

主要イベント2

const FKey FSpatialInputKeys::TapGesture(TapGestureName);
const FKey FSpatialInputKeys::DoubleTapGesture(DoubleTapGestureName);
const FKey FSpatialInputKeys::HoldGesture(HoldGestureName);

const FKey FSpatialInputKeys::LeftTapGesture(LeftTapGestureName);
const FKey FSpatialInputKeys::LeftDoubleTapGesture(LeftDoubleTapGestureName);
const FKey FSpatialInputKeys::LeftHoldGesture(LeftHoldGestureName);

const FKey FSpatialInputKeys::RightTapGesture(RightTapGestureName);
const FKey FSpatialInputKeys::RightDoubleTapGesture(RightDoubleTapGestureName);
const FKey FSpatialInputKeys::RightHoldGesture(RightHoldGestureName);

const FKey FSpatialInputKeys::LeftManipulationGesture(LeftManipulationGestureName);
const FKey FSpatialInputKeys::LeftManipulationXGesture(LeftManipulationXGestureName);
const FKey FSpatialInputKeys::LeftManipulationYGesture(LeftManipulationYGestureName);
const FKey FSpatialInputKeys::LeftManipulationZGesture(LeftManipulationZGestureName);

const FKey FSpatialInputKeys::LeftNavigationGesture(LeftNavigationGestureName);
const FKey FSpatialInputKeys::LeftNavigationXGesture(LeftNavigationXGestureName);
const FKey FSpatialInputKeys::LeftNavigationYGesture(LeftNavigationYGestureName);
const FKey FSpatialInputKeys::LeftNavigationZGesture(LeftNavigationZGestureName);


const FKey FSpatialInputKeys::RightManipulationGesture(RightManipulationGestureName);
const FKey FSpatialInputKeys::RightManipulationXGesture(RightManipulationXGestureName);
const FKey FSpatialInputKeys::RightManipulationYGesture(RightManipulationYGestureName);
const FKey FSpatialInputKeys::RightManipulationZGesture(RightManipulationZGestureName);

const FKey FSpatialInputKeys::RightNavigationGesture(RightNavigationGestureName);
const FKey FSpatialInputKeys::RightNavigationXGesture(RightNavigationXGestureName);
const FKey FSpatialInputKeys::RightNavigationYGesture(RightNavigationYGestureName);
const FKey FSpatialInputKeys::RightNavigationZGesture(RightNavigationZGestureName);

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

私たちが用意した Unreal 開発チェックポイント体験に従っている場合、読者は MRTK コア構成要素を探索している段階にいます。If you're following the Unreal development checkpoint journey we've laid out, you're in the midst of exploring the MRTK core building blocks. ここから、次の構成要素に進むことができます。From here, you can proceed to the next building block:

または、Mixed Reality プラットフォームの機能と API に移動します。Or jump to Mixed Reality platform capabilities and APIs:

いつでも Unreal 開発チェックポイントに戻ることができます。You can always go back to the Unreal development checkpoints at any time.