Unity
AR
VR
MR
HoloLens
HoloLensDay 23

HoloLens MRDesignLabs ジェスチャーを可視化する

HoloLens アドベントカレンダー23日目の記事です!

HoloLensを操作する際のジェスチャーって慣れてないとかなり難しいですよね。
MRDesignLabs LunarModuleというサンプルには、ホログラムが表示される領域を表示したり、ジェスチャー操作を説明したり、スキャンを誘導したりと、アプリ起動時に必要な技術が詰まっています。

今回、サンプルのHandCoachを用いて、3Dの手のホログラムを自分の手に合わせて表示するようにしてみました。

開発環境

実装

Unityを立ち上げ新規プロジェクトを作成してください。
ダウンロードしたMRDesignLabs_Unity_LunarModuleのAssetsフォルダの中身をProjectビューに持ってきてください。

handcoach01.PNG

Main Cameraを削除し、MRDesignLab->HUX->Interface->HoloLensをHierarchyビューに持ってきます。

handcoach02.PNG

空のGameObjetを作成し、名前をHandCoachDisplayとします。

HandCoachDisplayの下に、MRDesignLab_LunarModule->Prefabs->HandCoachを2つ持ってきて、それぞれLeftHandCoachとRightHandCoachとします。

handcoach03.PNG

InspectorビューのHandCoachの設定は次のように、それぞれ片手だけ表示、人差し指を挙げた状態になるように設定します。
handcoach04.PNG

HandCoachDisplayのInspectorビューでHandCoachDisplay.csスクリプトを作成します。
スクリプトの中身は次のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HUX;
using HUX.Interaction;

public class HandCoachDisplay : MonoBehaviour {

    public HandCoach leftHandCoach;
    public HandCoach rightHandCoach;
    private float MinConfidence = 0.01f;
    private Vector3 OffsetLeft = new Vector3(0.18f, -1.34f, -0.2f);
    private Vector3 OffsetRight = new Vector3(-0.18f, -1.34f, -0.2f);
    private Vector3 Offset = new Vector3(0.0f, -1.34f, 0.6f);

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        UpdateHand(leftHandCoach, InputSources.Instance.hands.GetHandState(InputSourceHands.HandednessEnum.Left, MinConfidence), OffsetLeft);
        UpdateHand(rightHandCoach, InputSources.Instance.hands.GetHandState(InputSourceHands.HandednessEnum.Right, MinConfidence), OffsetRight);
    }

    private void UpdateHand(HandCoach handObject, InputSourceHands.CurrentHandState handState, Vector3 handOffset)
    {

        if (handState == null)
        {

            handObject.LeftGesture = HandCoach.HandGestureEnum.Ready;
            handObject.RightGesture = HandCoach.HandGestureEnum.Ready;

            handObject.transform.position = Veil.Instance.HeadTransform.position;
            handObject.transform.rotation = Veil.Instance.HeadTransform.rotation;
            handObject.transform.Translate(Offset);
        }
        else
        {
            if (handState.Pressed)
            {
                handObject.LeftGesture = HandCoach.HandGestureEnum.None;
                handObject.RightGesture = HandCoach.HandGestureEnum.None;
            }
            else
            {
                handObject.LeftGesture = HandCoach.HandGestureEnum.Ready;
                handObject.RightGesture = HandCoach.HandGestureEnum.Ready;
            }

            handObject.transform.position = handState.Position;
            handObject.transform.rotation = Veil.Instance.HeadTransform.rotation;
            handObject.transform.Translate(handOffset);

        }
    }
}

LeftHandCoachとRightHandCoachをアタッチすれば完成です。

実行動画はこちらです。
HandCoach

動画では、MRDesignLab_LunarModule->Prefabs->HandInputDisplayも追加しています。
InputSources.Instance.hands.GetHandStateで左手・右手の認識をしているのですが、ある方向で右手と左手が逆に認識されるバグがあるようです。

参考記事