本日はMRTKの調査枠です。
〇HandTracking
HoloLens 2ではHandTrackingによりユーザーの両手を検知して、その動きをアプリ内の操作に反映することができます。
これは右手、左手それぞれを区別して認識できます。Unity内では[Right_HandRight(Clone)]としてオブジェクトが生成されますが、手が認識できない(Lostした)場合はオブジェクトが破棄されます。

再度認識できた場合再びオブジェクトが生成されます。
このため例えば[Surface]のアプリのようにユーザーの手に合わせてオブジェクトを追尾、生成する場合生成、破棄の条件を分けなくてはNullが発生してしまいます。

MRTKではこれを抑えるためにいくつかのインターフェースが提供されており、手の検出などを行える仕組みが提供されています。
〇HandJointUtilsクラス
HandJointUtilsクラスは手に関する情報を取得するクラスになります。
NamespaceはMicrosoft.MixedReality.Toolkit.Inputになります。
今回は次のようなスクリプトを用意しました。
if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose))
{
Debug.Log("detect")
}
else
{
Debug.Log("Lost");
}
HandJointUtils.TryGetJointPose(TrackedHandJoint joint, Handedness handedness, out MixedRealityPose pose)は指定したjointを左右のうち指定した手から要求されたジョイントのポーズを取得しようとします。
ここではIndexTip(=人差し指)をRight(=右手)から取得しています。
これがTrue、つまり取得できるなら右手が認識できているという状態です。
if文で認識している状態とそうではない状態で条件分けします。
今回はこれをUpdate関数内で使用しました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;
public class HandFinder : MonoBehaviour
{
// Update is called once per frame
void Update()
{
if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose))
{
Debug.Log("detect");//右手が認識されている
}
else
{
Debug.Log("Lost");//左手が認識されている
}
}
}
これを適当なゲームオブジェクトにアタッチして実行します。
デフォルトの場合エディタ上で右手を表示させるためにはスペースキーを使用します。 スペースキーを押して右手が表示されている間[detect]のログが表示されす。

以上で手の検出が行えました。