夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

HoloLens 2でHandTrackingによる手の検出を行う

本日はMRTKの調査枠です。

〇HandTracking

HoloLens 2ではHandTrackingによりユーザーの両手を検知して、その動きをアプリ内の操作に反映することができます。

 これは右手、左手それぞれを区別して認識できます。Unity内では[Right_HandRight(Clone)]としてオブジェクトが生成されますが、手が認識できない(Lostした)場合はオブジェクトが破棄されます。

f:id:Holomoto-Sumire:20200729093110j:plain

 再度認識できた場合再びオブジェクトが生成されます。

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

f:id:Holomoto-Sumire:20200704223511g:plain

 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を左右のうち指定した手から要求されたジョイントのポーズを取得しようとします。

microsoft.github.io

ここでは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]のログが表示されす。

f:id:Holomoto-Sumire:20200729101811j:plain

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