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

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

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

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

# 開発環境
- Unity 2017.1.2f1
- Visual Studio 2017 (15.2)
- [MRDesignLabs_Unity_LunarModule](https://github.com/Microsoft/MRDesignLabs_Unity_LunarModule)

# 実装

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

![handcoach01.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/b7b5f028-ebe3-9353-ac92-5edb79f9f2e8.png)

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

![handcoach02.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/b9a585a3-3757-cb29-3783-2fc179e08893.png)

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

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

![handcoach03.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/5d0b7acd-0a4d-abae-dd40-911154f48f8b.png)

InspectorビューのHandCoachの設定は次のように、それぞれ片手だけ表示、人差し指を挙げた状態になるように設定します。
![handcoach04.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/64f8c766-d9f1-26e2-9955-d5adfb9cd10c.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](https://i.ytimg.com/vi/MCn78hNzDxs/2.jpg?time=1514811050180)](https://youtu.be/MCn78hNzDxs)

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

# 参考記事
- [HoloLensではじめるMRDesignLabs - MRDesignLabs_Unity_LunarModuleの遊び方](https://qiita.com/miyaura/items/2ecbebe005dcb070c1db)
- [HoloLensで始めるMRDesignLabs - 両手ジェスチャー入力の実装](https://qiita.com/miyaura/items/d44e50f4cb422fdf0500)
- [HoloLensではじめるMRDesignLabs - HandCoachを使いこなす](https://qiita.com/miyaura/items/de4682de8ae59862f6da)