【実機なしでも出来る】HoloLens 2 のチュートリアル 初級レベルの MRTK チュートリアル やってみました

# はじめに
[MRTKチュートリアル](https://docs.microsoft.com/ja-jp/windows/mixed-reality/develop/unity/tutorials/mr-learning-base-01)を行ったので情報をまとめました。

間違っている部分があればご指摘いただければ幸いです。

# 開発環境
- Windows 10 Enterprise
- Unity 2019.4.1f1
- MRTK 2.5.3

# 1~2章 はじめに&プロジェクトの初期化と最初のアプリケーションの配置
この章ではプロジェクトを始めるための準備+プロジェクト作成を行います。
チュートリアル通りに進めていれば特に引っかかる部分はありませんでした。

# 3章 プロジェクトの初期化と最初のアプリケーションの配置
プロファイルの設定を行います。
プロファイルは入れ子ツリーで構成要素を保持しており、defaultプロファイルは編集することができません。
なので設定を変えたい場合は一番上の階層のプロファイルから順番に新しいプロファイルを作成しなければいけません。
　　
　　

例: 3-5 空間認識メッシュの可視性を変更する

```
root　
　└ 空間認識 
　　　　└ メッシュオブザーバー
　　　　　　　　└ 表示オプション
```
```
root
　└ 空間認識
```

```
空間認識 
　　└ メッシュオブザーバー
```
```
メッシュオブザーバー
　　└ 表示オプション
```

詳細 [Mixed Reality Toolkit プロファイル設定ガイド](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/MixedRealityConfigurationGuide.html)

# 4章 シーンへのオブジェクトの配置
オブジェクトの配置、整列を行います。
整列にはGridObjectCollectionを使用します。

### GridObjectCollection
子オブジェクトを3D空間に整列する機能を持っています。
MR用アプリではUIを3D空間に配置する必要があるため、このコンポーネントがよく使用されます。
詳細 [Object Collection (オブジェクト コレクション)](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_ObjectCollection.html)

# 5章 ソルバーを使用した動的なコンテンツの作成
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">チュートリアルのソルバーやってみました<a href="https://t.co/Kko2UGPoAR">https://t.co/Kko2UGPoAR</a><a href="https://twitter.com/hashtag/HoloLens2?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens2</a> <a href="https://twitter.com/hashtag/MRTK?src=hash&amp;ref_src=twsrc%5Etfw">#MRTK</a> <a href="https://t.co/IqscZeyuS3">pic.twitter.com/IqscZeyuS3</a></p>&mdash; 原口昂弥 (@k_haraguchi55) <a href="https://twitter.com/k_haraguchi55/status/1377496665423183872?ref_src=twsrc%5Etfw">April 1, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ソルバーを使用して視点誘導、オブジェクトの操作を実装します。
視点誘導にはDirectionalIndicator、オブジェクトの操作にはTapToPlaceを使用します。

詳細 [Solver](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_Solver.html)
### DirectionalIndicator
追跡対象に設定したオブジェクトの方向を向くようにGameObjectの回転と位置を自動で調整してくれます。
ViewOffsetプロパティで追跡対象オブジェクトと視点がどれくらい離れたら誘導を表示するのかを設定することができます。
詳細 [DirectionalIndicator](https://hololabinc.github.io/MixedRealityToolkit-Unity/api/Microsoft.MixedReality.Toolkit.Experimental.Utilities.DirectionalIndicator.html)

### TapToPlace
オブジェクトを3D空間にそって操作できるようになります。
On Placing Started() はオブジェクトが選択されたときに登録された関数を呼び出します。
SurfaceNormalOffsetプロパティはオブジェクトを3D空間上に配置する場合の、地表とオブジェクトの距離を設定することができます。
詳細 [Tap To Place](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_TapToPlace.html)

#6章 ユーザー インターフェイスの作成
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MRTKチュートリアル6章のUIの作成をしました<a href="https://t.co/IQeYI0BgfG">https://t.co/IQeYI0BgfG</a><a href="https://twitter.com/hashtag/HoloLens2?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens2</a> <a href="https://twitter.com/hashtag/MRTK?src=hash&amp;ref_src=twsrc%5Etfw">#MRTK</a> <a href="https://t.co/YsPaK33h7R">pic.twitter.com/YsPaK33h7R</a></p>&mdash; 原口昂弥 (@k_haraguchi55) <a href="https://twitter.com/k_haraguchi55/status/1377543470546513920?ref_src=twsrc%5Etfw">April 1, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

3D空間上で固定されたボタン、ユーザーに追従するメニュー、ヒントを作成します。

ボタンにはGridObjectCollectionとInteractableを使用します。

### Interactable
オブジェクトに対する様々な入力に対してイベントを設定できます。
OnClick() はポインターでクリックされたときに登録している関数を実行します。
詳細 [Interactable](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_Interactable.html)

追従するメニューの作成にはRadialViewを使用します
### RadialView
追跡対象に設定したオブジェクトに追従します。
詳細 [Solver](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_Solver.html)

ヒントにはToolTipSpawnerとTooltipPrefabを使用します。
### ToolTipSpawner 
タップまたはフォーカスで設定したPrefabを作成します。
詳細 [ToolTip](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_Tooltip.html)　[ToolTipSpawner](https://hololabinc.github.io/MixedRealityToolkit-Unity/api/Microsoft.MixedReality.Toolkit.UI.ToolTipSpawner.html)

##7章 3D オブジェクトの操作
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MRTKチュートリアル7章の組み立て<a href="https://t.co/IQeYI0BgfG">https://t.co/IQeYI0BgfG</a><a href="https://twitter.com/hashtag/HoloLens2?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens2</a> <a href="https://twitter.com/hashtag/MRTK?src=hash&amp;ref_src=twsrc%5Etfw">#MRTK</a> <a href="https://t.co/MTFjskB4fB">pic.twitter.com/MTFjskB4fB</a></p>&mdash; 原口昂弥 (@k_haraguchi55) <a href="https://twitter.com/k_haraguchi55/status/1377561199345160194?ref_src=twsrc%5Etfw">April 1, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
3Dオブジェクトの操作、3D領域の操作を行います。
3Dオブジェクトの操作にはNearInteractionGrabbable、Object Manipulatorを使用します。

### NearInteractionGrabbable
コンポーネントしたオブジェクトを掴めるようにします。
詳細 [NearInteractionGrabbable](https://hololabinc.github.io/MixedRealityToolkit-Unity/api/Microsoft.MixedReality.Toolkit.Input.NearInteractionGrabbable.html)
### Object Manipulator
片手または両手を使ったオブジェクトの移動、スケール変更、回転を可能にします。
Two Handed Manipulation Typeプロパティで両手操作の移動、スケール、回転の有効･無効を切り替えることができます。
多関節ハンド入力に反応するようにするにはNearInteractionGrabbableが必要になります。
詳細 [Object Manipulator](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_ObjectManipulator.html)

3D領域の操作にはBoundsControl、NearInteractionGrabbable、Object Manipulatorを使用します。
### BoundsControl
対象オブジェクトをボックスで操作できるようにします。
詳細[BoundsControl](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_BoundsControl.html)

# 8章　視線追跡の使用
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MRTKチュートリアル8章の視線操作を実装しました<a href="https://t.co/Mmvz0geN27">https://t.co/Mmvz0geN27</a><a href="https://twitter.com/hashtag/HoloLens2?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens2</a> <a href="https://twitter.com/hashtag/MRTK?src=hash&amp;ref_src=twsrc%5Etfw">#MRTK</a> <a href="https://t.co/tukvNmJGdb">pic.twitter.com/tukvNmJGdb</a></p>&mdash; 原口昂弥 (@k_haraguchi55) <a href="https://twitter.com/k_haraguchi55/status/1377868948029415424?ref_src=twsrc%5Etfw">April 2, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ラベルに視線が向いている間。フォントサイズを大きくする機能を実装します。
EyeTrackingTargetを使用します。
### EyeTrackingTarget
オブジェクトに視線が向いた時のイベントを設定できます。
On Look At Start () は視線が向いたときに登録している関数を呼び出します。
On Look Away () は視線が外れたときに登録している関数を呼び出します。
詳細 [EyeTrackingTarget](https://hololabinc.github.io/MixedRealityToolkit-Unity/api/Microsoft.MixedReality.Toolkit.Input.EyeTrackingTarget.html)

# 9章 音声コマンドの使用
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MRTK の音声認識試しました！<br>日本語もサポートされていました。<br>漢字も使用できます。<a href="https://twitter.com/hashtag/MRTK?src=hash&amp;ref_src=twsrc%5Etfw">#MRTK</a> <a href="https://twitter.com/hashtag/HoloLens2?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens2</a> <a href="https://t.co/T2BHWSBViz">pic.twitter.com/T2BHWSBViz</a></p>&mdash; 原口昂弥 (@k_haraguchi55) <a href="https://twitter.com/k_haraguchi55/status/1381885172954456066?ref_src=twsrc%5Etfw">April 13, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
音声入力でメニューが使用できるようにします。
MixedRealityToolkitを使用して音声コマンドを作成し、SpeechInputHandlerでイベントを設定します。
ちなみに日本語も使えます。
詳細 [Speech](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/Input/Speech.html)

# まとめ
初級チュートリアルを行うことでMRTKの基本的な操作を学ぶことができました。
これから他のチュートリアルも進めていき、知識をより深めていきます。

## 参考
https://docs.microsoft.com/ja-jp/windows/mixed-reality/develop/unity/tutorials/mr-learning-base-01

https://hololabinc.github.io/MixedRealityToolkit-Unity/README.html