Mixed Reality Toolkit - Unityの次期バージョンvNextのコンセプト



# 次期バージョンはHoloLens、Microsoft Immersive headsets以外のデバイスにも対応

モジュールそのものはこれからのようですが、Mixed Reality Toolkitの次期バージョンvNEXTについての情報がgitで公開され始めました！
資料によると現行のMRTKはMicrosoft HoloLensとWindows Mixed Realityヘッドセットを対象としたアプリケーションの開発を加速するための仕組みという位置づけです。
次期バージョンはツールキットの機能をさらに拡張し、Microsoft独自のMixed Reality設定以外のVR / AR / XRプラットフォームをサポートする機能を含む新しい機能を導入することを目的としています。
現時点で具体的に名前の挙がっている以下のものですが、XR領域で活用するデバイスをできるだけサポートしたいという思いがあるようです。

* Microsoft HoloLens
* Microsoft Immersive headsets (IHMD)
* Steam VR (HTC Vive / Oculus Rift)
* OpenXR platforms

資料を読んでいると大きくはこのサポートデバイスの拡張というほかに、かなりわかりやすいサンプルや資料を整備したいということが強調されています。
現在のライブラリのサンプルは文書などの説明がなく利用者が頑張るスタイルだったものを、すべてのサンプルに詳細な文書を付けるなどして提供したいとのことです。

## 資料について

資料はMixed Reality Toolkit - Unityの中の「MRTK-Version-Next」ブランチ内にあります。

https://github.com/Microsoft/MixedRealityToolkit-Unity/tree/MRTK-Version-Next

## 開発環境
開発環境は現時点では現行の最新版で特に変更はないようですが、ライブラリの整備はこれからなのでこの辺りも変わるかもしれないですね。
![image](https://qiita-image-store.s3.amazonaws.com/0/152548/aaa48922-1d71-4186-e1d7-ece7d43ad9b5.png)

## Mixed Reality Toolkit のアーキテクチャ– Multi-VR

新しいアーキテクチャは現在のMixed Reality Toolkitを再構築して以下のような構造を提供するようです。

![image](https://qiita-image-store.s3.amazonaws.com/0/152548/e13008b9-63a0-5dc0-ea0c-ba4d5801e95f.png)

解説によると最上位層の「MRTK User Abstraction layer」がコンポーネントやスクリプト群で開発者は基本的にこの層を部品として活用します。その次の「MRTK Interface Layer」は入力系（ジェスチャー、コントローラ）とデバイスの操作（トラッキング等）の情報をインターフェースにより抽象化するレイヤーになっています。この層は各デバイスの制御を抽象化して上位層のライブラリの汎用性を高めるための層といえると思います。
「MRTK Constructs」実際に稼働するデバイス/入力方式の特定、特定したデバイスに対応するSDKのロードなどを担う層です。ここで各デバイス固有のSDKに処理を振り分ける形ですね。
最後の「Device Abstraction Layer」は各デバイスから提供されるSDKとMRTKをつなぐためのブリッジになる層です。
各層に対する指針は以下の通りです。

### Device Abstraction Layer

MRTKに準拠するようにXRデバイス準拠のSDKの制御をブリッジするように実装する層になります。資料には「理想的にはベンダーのSDKを直接使用するスクリプトレベルにする必要がある」と記載があります。これはデバイスの制御に対して制約事項を排除するには、できるだけ低層のSDKを使う方がいいというところからきてるのだと思います。

### MRTK Constructs

この層は、複数のVRデバイスを抽象化したシステムを調整するための層です。「Device Abstraction Layer」側のSDKと最上位の「MRTK User Abstraction layer」のSDKの両方に公開する拡張可能なルールを定義しています。
この層を用意することで、それぞれの層に対してデバイス依存やSDK依存の状況を作らないようにするのが目的だと考えられます。

### MRTK Interface Layer
この層は、VRデバイスおよびコントローラからの入力をマッピングおよび調整するための拡張可能なブリッジを提供するとともに、VRシステム（触覚等）へのフィードバックに抽象化されたメカニズムを提供します。また、SDKで使用するために合成できるプリセットの相互作用も定義されています。
この層は現在のInputManager周りで制御されている機能で実現されている機能が近いですね。

### MRTK User Abstraction layer

開発するときに最もよく使う層です。今のMRTKと同じでPrefabやコンポーネントが提供される予定です。「ドラッグアンドドロップできる使いやすいコンポーネント/スクリプトのセットを通じて提供する必要がある」と記載があるので後からコード修正がいらない機能を目指すようです。当然ですが、それをもとに開発者が独自のコンポーネントを構築し、組み込むことも可能です。

## Mixed Reality Toolkit SDKについて

現在のMRTKの例/実装はあまりに複雑だというのが１つの課題として挙がっていました。特にサンプルコードが難解で、サンプル自体が実態に合っていないという意見がそこそこあったようです。

現在、目指しているMRTKのSDKはほぼノンコーディングでアプリケーションを構築できるようにするアプローチをとろうとしています。具体的なアプリ構築の例として以下の手順で開発できることを挙げています。もちろん細かい部分はこれからと同じように開発は必要だと思いますが、プロトタイピングまでの時間を大幅に短縮することはできそうです。

1. 3Dシーンを構築する
1. MRTKがプロジェクトに追加される。
1. 歩行可能エリアを定義する簡単な方法を追加する（歩行、フリーテレポート、または制限付きテレポート等）
1. シーン内のオブジェクトの選択を有効にし、インタラクション（ピックアップ、プッシュ、スローなど）用に設定する
1. アニメーションインタラクションを有効にします（例：ドアを開く
1. 受動的な処理を可能にしプレイヤーの制御に応じて作用する処理を構築する
1. スピーチ/ジェスチャー/フォーカス/コントローラーサービスをすばやく追加

これらを実現するために以下のコンポーネント群を提供する予定になっているようです。いずれのコンポーネントもコード修正を極力排除した追加法オフになるようにするというアプローチが前提になるようです。

### Scene elements

シーンで必ず使うカメラや入力系の管理コンポーネント要素です。例えば次のような要素はMRTKで既にコンポーネントを追加するだけでHoloLens/Immersive HMDの区別なく配置できます。次期バージョンではこの対象デバイスが増えていくわけですね。

* Camera (current MRCP)
* Managers (focus / gaze / controllers / motion controllers / etc)
* Controllers (scene object collections, interactions)

### Interaction controls

シーン内でのユーザの移動や操作方法に関するコンポーネント要素です。アプリケーションに対する入力に対する制御系の機能ですね。

* Locomotion / Teleportation control
* Locomotion / Teleportation boundaries / targets
* Speech commands
* Gestures
* Pointers / Hands

### Reaction Controls

Interaction controlsでの要素の結果シーン内の他のオブジェクト要素に何らかの作用を起こすためのコンポーネント要素です。Grabbingのようにコントローラでつかむと物を持ち上げられるなど、ユーザ操作に対する反応に関するものが中心になる機能です。

* Grabbing
* Pushing
* Opening
* Pointer targets
* Buttons / UX
* Hot Zones (reaction-based events from either the player or an interaction control collision)
* Highlighting

### UX Systems

ユーザフレンドリーなUXを実現を支援するためのコンポーネント要素です。MRDesignLabsの中でもあった、オブジェクトを整列、メニューや補助系の機能がここに入るものを思われます。

* Menu Systems (Grid / Radial)
* Layout components (Grid / Radial / Curved / Layered)
* Controller systems (menu overlays for hands / controllers)
* Tooltips
* Fade Assist
* This is not an extensive list and subject to debate.

## サンプルはこのような感じになるようですよ！

こういう形でカテゴリ毎にサンプルを台に乗せてショーケース的にすることも考えられているようです。

![image](https://qiita-image-store.s3.amazonaws.com/0/152548/4cb37177-cbd9-9796-8b2f-eb1543afa330.png)

現行のMRTKでもモーションコントローラのGrabbingサンプルについてはこのような形のサンプルです。他のサンプルよりもわかりやすいのでこういう形になっている方が手間もかからなくて使いやすそうです。

## 最後に
ざっと読んでみた感じ、対象デバイスを広げる事とSDKとして再整備してより使いやすくというのが次期バージョンの大きな目的のようです。
特に対象デバイスにはOpenXRが入っているので整備が進めばかなりの領域でMRTKを活用した開発を可能になるのかもしれないです。