HoloLens チュートリアル (Holograms 101E - 2 Gaze)


## はじめに

「[HoloLens チュートリアル (Holograms 101E - 1 "Holo" world) - Qiita](http://qiita.com/Suna/items/c0efd88d151d087f9049)」の続きになります。
「[Holograms 101E: Introduction with Emulator](https://developer.microsoft.com/ja-jp/windows/holographic/holograms_101e)」の「[Chapter 2 - Gaze](https://developer.microsoft.com/JA-JP/WINDOWS/HOLOGRAPHIC/holograms_101e#chapter_2_-_gaze)」を試してみます。

## Gaze って何？

- [Gaze](https://developer.microsoft.com/JA-JP/WINDOWS/HOLOGRAPHIC/gaze)
- [gazeの意味 - 英和辞典 Weblio辞書](http://ejje.weblio.jp/content/gaze)

> 動詞
> (熱心にじっと)見つめる，熟視する
> 名詞
> [単数形で] 熟視，注視，凝視.

## チュートリアル「Gaze」

### Cursor オブジェクトの作成

![601.png](https://qiita-image-store.s3.amazonaws.com/0/20418/a6ea18b0-5fe9-e79c-dac1-8a8cf6fc5775.png "601.png")

- Project パネルから **「Holograms」** を選択
- **「Cursor」** をHierarchy パネルにドラッグ

![602b.png](https://qiita-image-store.s3.amazonaws.com/0/20418/26c53c3b-45cb-c8d7-c435-f8ddceb8f181.png "602b.png")

---

### C# スクリプトの作成・Cursor オブジェクトにアタッチ

![604.png](https://qiita-image-store.s3.amazonaws.com/0/20418/fa90d753-ec63-8640-7478-6c893312bcbb.png "604.png")

- Project パネルから 「Scripts」 を選択
- 右クリックを押下し、 **「Create」-「C# Script」** を選択
- 名前を「WorldCursor」に変更
- 作成した「WorldCursor」を、Hierarchy パネルの「Cursor」オブジェクトにドロップ
- 「WorldCursor」をダブルクリック (-> Visual Studio が起動)

---

### C# スクリプトの編集

![605.png](https://qiita-image-store.s3.amazonaws.com/0/20418/54e226a9-6d2e-ebfd-39a2-8c46ed5805b6.png "605.png")

```C#
using UnityEngine;

public class WorldCursor : MonoBehaviour
{
    private MeshRenderer meshRenderer;

    // Use this for initialization
    void Start()
    {
        // Grab the mesh renderer that's on the same object as this script.
        meshRenderer = this.gameObject.GetComponentInChildren<MeshRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        // Do a raycast into the world based on the user's
        // head position and orientation.
        var headPosition = Camera.main.transform.position;
        var gazeDirection = Camera.main.transform.forward;

        RaycastHit hitInfo;

        if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
        {
            // If the raycast hit a hologram...
            // Display the cursor mesh.
            meshRenderer.enabled = true;

            // Move thecursor to the point where the raycast hit.
            this.transform.position = hitInfo.point;

            // Rotate the cursor to hug the surface of the hologram.
            this.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
        }
        else
        {
            // If the raycast did not hit a hologram, hide the cursor mesh.
            meshRenderer.enabled = false;
        }
    }
}
```

- [GameObject.GetComponentInChildren
](https://docs.unity3d.com/jp/current/ScriptReference/GameObject.GetComponentInChildren.html)

> 深さ優先探索でゲームオブジェクトまたはゲームオブジェクトの子たちの type からコンポーネントを取得します。

- [Physics.Raycast](https://docs.unity3d.com/ja/current/ScriptReference/Physics.Raycast.html)

> シーンにあるすべてのコライダーに対して、 origin の位置から direction の方向に maxDistance の距離だけレイを投じます。

> bool レイが任意のコライダーと交わる場合は true、それ以外は false

- [Quaternion.FromToRotation](https://docs.unity3d.com/ja/current/ScriptReference/Quaternion.FromToRotation.html)

> 通常、ワールド空間で Transform を回転させ、座標の 1 つ、例えば、y 座標をターゲットの方向 toDirection に向かせるために使用します。

---

### Visual Studio のプロジェクト生成

![606b.png](https://qiita-image-store.s3.amazonaws.com/0/20418/d13dce76-c0af-c54e-ab0a-ad71a7ac54e5.png "606b.png")

- 「File」メニューから「Build Settings」を選択

![607.png](https://qiita-image-store.s3.amazonaws.com/0/20418/1ec89e4e-4569-43b8-6628-efd4a0423597.png "607.png")

- 「Build Settings」ウィンドウから「Build」ボタンを押下

![608.png](https://qiita-image-store.s3.amazonaws.com/0/20418/2aa32442-f6aa-d6c8-d9e1-6be7fc23852b.png "608.png")

- 「App」フォルダを作成し「フォルダーの選択」ボタンを押下
- 「App」フォルダ内の「Origami.sln」をダブルクリック

---

### ビルド・実行環境設定の確認、実行

![609.png](https://qiita-image-store.s3.amazonaws.com/0/20418/2445bc7d-edcb-d1a8-25e3-7514c3209f72.png "609.png")

- ソリューション構成 **「Release」**
- プラットフォーム **「X86」**
- 実行環境 **「HoloLens Emulator」**
- 「デバッグ」メニューから **「デバッグなしで開始」** を選択

---

### エミュレータ操作

![610.png](https://qiita-image-store.s3.amazonaws.com/0/20418/d9df3c05-68de-d37b-1f1c-b960b813c604.png "610.png")

![611.png](https://qiita-image-store.s3.amazonaws.com/0/20418/e1103757-10eb-706b-bbaa-a3fc961c7ca5.png "611.png")

- Cursor オブジェクトが、重なったオブジェクトの面に揃うように向きが変わっている？
- これだけだと、だから何なのかよく分からないな。