Mixed Realirt Toolkit V2 RC1を読み解く（概要編）

# ついにRC1がでたMixed Reality Toolkit - Unity V2
HoloLens 2にも対応した各種機能を追加したMRTK V2のリリース候補版が公開されました。

https://github.com/Microsoft/MixedRealityToolkit-Unity/releases/tag/v2.0.0-RC1

追加された機能などなど概要から簡単にチェックしてみました。基本的には以下の内容をベースに内容を整理しています。

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

やはりHoloLens 2向けの機能が非常に興味深いですね。

## 開発環境
RC1版の開発環境は以下の通りです。Unityは2018.3系ですね。

* Windows SDK 18362+
* Unity 2018.3+(ソースはUnity 2018.3.9f1で作成されている)
* Visual Studio 2017

## 機能について
大まかに以下の機能に分類され提供されています。★印が新機能です。
やはり、HoloLens 2向けの機能が気になるところなのでこの後調べてまた紹介したいと思います。

* Input System  
入力系のイベントシステム
* ★Articulated Hands + Gestures (HoloLens 2)   
全指ハンドトラッキング系機能（HoloLens 2向け)
* ★Eye Tracking (HoloLens 2)  
アイトラッキング系（HoloLens 2向け)
* Voice Commanding  
音声コマンド
* Gaze + Select (HoloLens)  
ゲイズ+選択(HoloLens 向け)
* Controller Visualization  
コントローラ表示（IHMD向け)
* Teleportation  
テレポート機能（IHMD向け)
* UI Controls  
便利なUI系機能（コントロール等）
* Solver and Interactions  
Solverシステム
* Spatial Understanding  
空間認識系機能
* ★Diagnostic Tool  
診断系ツール(ログ等の情報)

### 提供されるUI系機能

UI系の機能は既存から強化されています。強化されている内容から見るとHoloLens 2との制御違いなどもわかる（想像ですけど）のでそのあたりも少し触れていきたいと思います。
ただし、HoloLens 2はあくまで想像の域を出ていないですが・・・

|機能|概要|HoloLens|IHMD|HoloLens2|
|:-:|:--|:--|:--|:--|
|![MRTK_Button_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/a10dd627-37f1-6883-f151-938e6baebd5e.png)<br/>Button|以前からあったタップすると反応するボタンですね。MTRK V2ではProfile 形式に代わっているので、押されるとメソッドを呼び出すUnity方式の処理になっています。HoloLens 2では直接押すという表現が可能になるため、そのための機能も搭載されています。ちなみにHoloLens 2のジェスチャーはHoloLensのそれと区別するためかMRTKでは"関節式"という表現が入ってます|Gaze(顔を向ける)でボタンを選択してエアタップより処理する|コントローラのポインターを充ててSelectボタンなどを押す|人差し指でボタンを直接押す（んだとおもいます）|
|![MRTK_BoundingBox_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/dc5b48d1-1fb4-199d-85aa-55451db0a819.png)<br/>Bounding Box|以前からあったBounding Boxです。３Dオブジェクトの回転、拡大縮小する機能です|Gazeで頂点や回転ポイントを選択、タップ＆ホールドで調整|コントローラのポインターで頂点や回転ポイントを選択、Selectボタン等をHoldして調整|頂点や回転をつまんで調整|
|![MRTK_Manipulation_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/ec65e26c-f042-b5e2-81c5-86cc4eef3ba4.png)<br/>Manipulation Handler|マニピュレーション機能。操作開始時を原点に相対値ででオブジェクトを操作するための仕組み。以前はTwoHandManipulateととして提供されていた機能です。MRTK V2になってからかなり機能強化されており、例えばボールを投げて飛ばすなどの実装がパラメータ定義だけでできるようです（使用見る限り）|タップ＆ホールドで調整|Selectボタン等をHoldして調整|つまんで調整|
|![MRTK_Slate_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/822f389a-cbe2-ba31-605b-5aaae2533ff7.png)<br/>Slate|いわゆる2Dアプリのウィンドウ形状のUIです。2Dアプリと同じ外観で右上に２ボタン、中央に１ボタンのメニューバーがあり、内部のコンテンツをスクロールで操作できるようになっています| - |-|-|
|![MRTK_SystemKeyboard_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/3b270aed-aeda-2a5b-acad-b14e2af756a8.png)<br/>System Keyboard|仮想キーボードです。何のキーが押されたかはイベントではなく、文字列情報として取得する形です。イメージとしては、HoloLensにもともと備わっているキーボードと同じシステムですね（たぶん）。キーボードの上に入力した文字がテキストボックスに出ているあれです。|-|-|-|
|![InteractableExamples.png](https://qiita-image-store.s3.amazonaws.com/0/152548/a3f7b468-347a-a447-3d6f-b18951c955e6.png)<br/>Interactable|これも依然あったものですね3Dオブジェクトに対して何らかの効果（例えばフォーカスがあるとコーヒーに湯気がでる等々）をつけるための機能です。|-|-|-|
|![MRTK_Solver_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/62fb2d1a-2fa2-f10e-bd57-54b5f1926987.png)<br/>Solver|これも以前からある機能ですね。利用者の状態から3Dオブジェクトの位置を決める際に使うための機能（tag-along,body-lock等）|-|-|-|
|![MRTK_ObjectCollection_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/428c62f2-da94-2b49-4368-75ea73f055ed.png)<br/>Object Collection|これも以前からあるオブジェクトを整列して並べるためのコレクションです。|-|-|-|
|![MRTK_Tooltip_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/3529ebae-cd2d-cdaf-edd7-81a0d0ee2aca.png)<br/>Tooltip|これも以前からある注釈をつける機能です。|-|-|-|
|![MRTK_AppBar_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/bcd666e3-68eb-5ede-e628-f57b9d57c40a.png)<br/>App Bar|Bounding Boxとセットで使用する。ボタンコマンドを表示するためのBarです。|-|-|-|
|![MRTK_Pointer_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/c035dfe5-e490-2a1c-2aa8-a75528e12fd8.png)<br/>Pointers|モーションコントローラや手の延長線上にでるポインターの機能です。HoloLensの場合はGazeなのでこの機能はありません。そしてHoloLens 2ではポインターが手首からでます。スパイダーマンですね。また、ポインターがオブジェクトにあたっているような状態であったりつかんでいる場合はそれがわかる形状に変化する機能も有しています。|-|モーションコントローラの正面方向にでる。|手首の根元付近から手の正面方向に出る。|
|![MRTK_FingertipVisualization_Main.png](https://qiita-image-store.s3.amazonaws.com/0/152548/62ede0df-16d9-167b-a328-2726ea7e3b26.png)<br/>Fingertip Visualization|HoloLens 2のみ。人差し指でオブジェクトを操作する際の可視化を行う機能です。オブジェクトとの距離間でUIが変化します。<br/>別途ハンドトラッキングを調べているのでそこと合わせるとわかりやすいです。ハンドトラッキングは大きく３つのグループの情報を扱います。「関節」「人差し指」「手のひら」の3つです。このうち人差し指だけ特別扱いされていてボタンを押すなどするときにはこの人差し指が基準になっているようです。おそらく全指トラッキング可能ななど誤ってボタンを押さないように意図的に人差し指でメインにしていると思われます。|-|-|人差し指で操作を行っている状態。|
|![mrtk_et_targetselect.png](https://qiita-image-store.s3.amazonaws.com/0/152548/593f1649-14d8-8bfd-2ed8-2ff56e9e47e4.png)<br/>Eye Tracking: Target Selection|HoloLens 2のみ。視線によるオブジェクトの選択のための仕組みです。MRTK V1の頃からあるGazeのフォーカスイベントを考え方は同じです。視線でオブジェクトにフォーカスが合うとイベントが発生します|-|-|視線でオブジェクトを選択する|
|![mrtk_et_navigation.png](https://qiita-image-store.s3.amazonaws.com/0/152548/4b2e776b-b3a0-04e0-6518-0948c3335636.png)<br/>Eye Tracking: Navigation|HoloLens 2のみ。視線によるオブジェクトの操作。中身を読み解いてる途中なので別途また資料は読み解くのですが、視線の動きでスクロールやオブジェクトの拡大縮小ができます。|-|-|視線でオブジェクトを操作する|
|![mrtk_et_heatmaps.png](https://qiita-image-store.s3.amazonaws.com/0/152548/dbad5bf0-5901-974c-2c5a-7356d99ee937.png)<br/>Eye Tracking: Heat Map|HoloLens 2のみ。視線のヒートマップとれるらしいですが詳細情報がないのでどういうものかはわからないです。|-|-|?|

### 魅力的な機能が満載なMRTK V2
HoloLens 2が手元にない中MRTK V2の機能を読みとくとHoloLens 2のもつポテンシャルをなんとなーく理解できるのですごく興味深いです。
まずはHand TrackingとEye Trackingについてドキュメントやサンプルを動かしつつ中身を読み解いていきたいと思います。