Mixed Realityの開発を加速するMixed Reality Toolkit - Unityについて

#HoloToolkitからMixed Reality Toolkitへの名称変更が入りました。
HoloLensの開発を容易にするためにHoloToolkit-Unityというライブラリが公開されています。おそらく現状のHoloLensの開発ではほとんど必須といえるモジュールになります。今後このライブラリに大幅な変更がはいることになっています。これに合わせて今までHoloLens向けに提供されていたMixed Reality関連のライブラリの整理がすすみ体系化されています。

## 変更がなぜ入ったか

HoloToolkit - Unityの時はMixed RealityのデバイスとしてHoloLensがメインだったこともあり、基本的にはHoloLens用の要素が強いライブラリでした。ですが、Oculus等のVR系の発展、Windows Mixed Reality対応のimmersive HMDの登場等サポートするデバイスが増えたことでこれらにも共通で対応できるライブラリとして期待されることが多くなったことが背景と考えられます。

## Mixed Reality Toolkitの構成について

変更後の構成としては以下のようなものになります。HoloLensを含めたMixed Reality用のデバイスがWindows 10を対象としているためベースはWindwos 10 UWPになります。
その上に「Mixed Reality Toolkit」「Mixed Reality Companion Kit」の２つのライブラリが提供されています。
「Mixed Reality Toolkit - Unity」はこれらのライブラリの上で構成されることになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/e455615d-7a5f-1fa9-aed5-69a6c08e6a9c.png)

### Mixed Reality Toolkit
UWPと「Mixed Reality Toolkit - Unity」の中間に存在するライブラリになります。提供形式はDLLやExeとなっており、現時点では以下の機能が提供されています。
Sharingはデバイス間で情報を共有するために必要なモジュールやサーバーが提供されています。それ以外のライブラリについてもdll形式でUnityやUWP向けに提供されています。
基本的には言語はC++で記述されており、このライブラリを利用してUnityやUWP上ではC#で開発する形になります。

| 機能 | 簡単な説明 |
|:-:|:--|
| Spatial Mapping  | 空間マッピングの機能を提供する  |
| Spatial Understanding  | 空間認識の機能を提供する  |
| Sharing  |  Sharingを実現するためのモジュール及び、サーバ機能を提供する |
| Microphone Stream Selector | マイクデバイスへのアクセスを容易にする機能|
 
最新の情報は[Mixed Reality ToolkitのREADME.md](https://github.com/Microsoft/MixedRealityToolkit/blob/master/README.md)を確認してください。

### Mixed Reality Companion Kit

直接アプリケーション開発で使用するライブラリではないですが、Mixed Realityの体験を支援する機能が提供されています。

| 機能 | 簡単な説明 |
|:-:|:--|
| Holographic Remoting Host| UWPアプリケーションなどからHoloLensにリモートでViewを提供するための機能です。Unityでいう「Holographic Emulation」に相当する機能をUWPで作ることができます。  |
| KinectIPD  |IPD（瞳孔間距離）を測定し、オプションでHoloLensデバイス上のIPDを自動的に設定できるユーティリティです。  |
|MixedRemoteViewCompositor  |  HoloLensのViewをリモートで見ることができる機能を提供する。 |
|SpectatorView| Spectator Viewに関する機能を提供する|
|Windows Mixed Reality Commander (Formerly, HoloLens Commander)| ブラウザで利用できるDevice Portalの機能をUWP化したものです。複数台のHoloLensを含むWindows PCデバイスの管理が行えます。|

最新の情報は[Mixed Reality CompanionKitのREADME.md](https://github.com/Microsoft/MixedRealityCompanionKit/blob/master/README.md)を確認してください。

### Mixed Reality Toolkit - Unity
Unityのアセット形式で提供されるMixed Reality向けのライブラリです。中身としては現状HoloToolkit-Unityと同じで今後は色々と機能拡張される形です（今後のロードマップを参照）。なお破壊的なアップデートの話（後述）もありますが、内容を見る限りいくつかのクラス名変更と名前空間変更がメインで使い方がまるっきり変わるようなことはないようです。

### MRDesignLabs_Unityについて
構成にはないのですがMixed Reality Designチームが提供しているサンプルや調査目的で公開されているMRDesignLabs_Unityというのもあります。こちらはMixed RealityのUXについての便利な機能が提供されています。
MRDesignLabsで提供されている内容については別途投稿しているので興味があれば参照してください。

* [Mixed Reality Design Labsのサンプルをとりあえず動かしてみる - Periodic Table of the Elements](http://qiita.com/miyaura/items/f4d81a222dcb27c828da)
* [HoloLensで試すMRDesignLabs - 空セットアップとBounding Boxの利用](http://qiita.com/miyaura/items/cf0ebc41733a4b31e137)
* [HoloLensで始めるMRDesignLabs - ObjectCollection、各種ボタン、イベント制御を使う](http://qiita.com/miyaura/items/15294d34f4a109355d4d)
* [HoloLensで始めるMRDesignLabs - Fitbox、Progress、HelpText、Dialog](http://qiita.com/miyaura/items/fd3a5525335c706b4a1f)
* [HoloLensではじめるMRDesignLabs - MRDesignLabs_Unity_LunarModuleの遊び方](http://qiita.com/miyaura/items/2ecbebe005dcb070c1db)
* [HoloLensで始めるMRDesignLabs - 両手ジェスチャー入力の実装](http://qiita.com/miyaura/items/d44e50f4cb422fdf0500)


## 今後のロードマップ

ロードマップの詳細は[Mixed Reality Toolkit - UnityのREADME.md](https://github.com/Microsoft/MixedRealityToolkit-Unity/blob/master/README.md)に記載があります。
以下はREADME.mdからの引用です。

### Masterブランチの計画
| Target Unity release  | Release timeframe | Master release tag | Toolkit release features |
| --------------------- | ----------------- | ------------------ | ------------------------ |
| 2017.1.0              | 2017/8月初旬    | v1.2017.1.0        | <ul><li>Unityのβ版のための修正</li><li> テキスト入力用3Dキーボードの追加</li></ul>|
| <Font color="Red">2017.2.0</font>              | <font color="Red">2017/9月末</font>      | <font color="Red">v1.2017.2.0</font>        | <ul><li><font color="Red">Windows Mixed Realityサポート(xR名前空間)に伴うマスタの修正</font></li><li><font color="Red">Dev_Unity_2017.2.0のマスターへの取込み</font></li><li><font color="Red">ToolkitのHoloLens と　immersive headsetsへの両対応</font></li><li><font color="Red">Windows Mixed Realityモーションコントローラのサポート</font></li></ul>|
| 2017.3.0              | 2017/12月末      | v1.2017.3.0        | <ul><li>360 video player prefabsの提供</li><li>foveated rendering(中心窩レンダリング)[^1] prefabsの提供</li></ul> |

[^1]: foveated rendering(中心窩レンダリング)は人の視野の感覚に近い形でレンダリングをすることでパフォーマンスを向上する仕組み。人の視野については注視部分を中心とした領域（鮮明に見えている部分）と周辺視力（何となく見えている）の2つの領域があり、この考え方に合わせてVR等のレンダリングを行う。注視付近は今まで通りの高解像度レンダリングだが、周辺領域はレンダリングの密度を落としてクオリティを下げることで全体のレンダリング性能を向上するためのアプローチです。NVIDIAが昨年この辺りの研究や調査を行っています(参考資料:[Perceptually-Based Foveated Virtual Reality](http://research.nvidia.com/publication/perceptually-based-foveated-virtual-reality))

### Dev_Unity_2017.2.0の計画と状況

| Target Unity release  | Release timeframe | Branch release tag | Branch pre-release features | Status |
| --------------------- | ----------------- | ------------------ | --------------------------- | --------------------------- |
| MRTP9                 | 2017/7月末     | v1.Dev.MRTP9       | <ul><li>HoloLens と　immersive headsetsの両方に対するWindows Mixed Realityのサポート</li><li>Gamepadのサポート</li<li>Windows Mixed Realityモーションコントローラのサポート</li></ul> | [対応完了:v1.Dev.MRTP9](https://github.com/Microsoft/HoloToolkit-Unity/releases/tag/v1.Dev.MRTP9) |
| MRTP13                | 2017/8月初旬    | v1.Dev.MRTP13      | <ul><li>WUドライバから読み込むglTF形式でのWindows Mixed Realityモーションコントローラのレンダリング</li></ul> | [対応完了: v1.Dev.MRTP13](https://github.com/Microsoft/HoloToolkit-Unity/releases/tag/v1.Dev.MRTP13) |
| <font color="red">2017.2.0</font>              | <font color="red">2017/8月中旬</font>      | <font color="red">v1.Dev.2017.2.0</font>    | <font color="red">xR名前空間やその他の破壊的変更に対する対応</font> | <font color="red">対応中</font> |
| 2017.2.0              | 2017/9月末      | v1.Dev.2017.2.1    | masterブランチへのマージ | 未着手 |


## 破壊的アップデートの内容
現状HoloToolkit-Unity破壊的なアップデートの第1弾としてリポジトリ名の変更が完了しています(MixedRealityToolkit-Unityへの名称変更)。今回はリポジトリ名の変更のみで内部構成についてはHolotoolkitのままとなっています。現在進行中でクラス名、名前空間の変更が入ることになっています。