本日は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]のログが表示されす。
以上で手の検出が行えました。