UE4.21で追加されたWindowsMixedRealityのサポートについて

[HoloLens Advent Calendar 2018](https://qiita.com/advent-calendar/2018/hololens)の17日目です。

UnrealEngine4.21.0より、WindowsMixedRealityHeadset(以後WinMRと表記)がネイティブサポートされました。
今まではUE4でWinMRのデバイスを使うとなると、
[Windows Mixed Reality for SteamVR on Steam](https://store.steampowered.com/app/719950/Windows_Mixed_Reality_for_SteamVR/)を使ってWinMRデバイスをSteamVR経由で認識させて使うか、
UWP用のUE4のカスタムエンジンをビルドして使う([参考](https://qiita.com/diberidarshi/items/084d6313de9a380bea3e))か、の2パターンぐらいでしか使えませんでした。
(こんな[UE4とWinMRの本](https://shop-0761.booth.pm/items/824341)もでてました。)

そういったちょっと特殊なことをやらないとUE4ではWinMRデバイスを使うこともできなかったのですが、最近ネイティブサポートされたので、その辺りで具体的に何ができるのか、適当に見てみようかと思います。

##環境
環境については、記事投稿時点での最新にしています。
(また、Windows Mixed Reality for SteamVR on Steamはアンインストール済みです。)

| | バージョン |
|-----|-----|
| Windows10 | Windows 10 October 2018 Update Version 1809 |
| UnrealEngine | 4.21.1 |
| VisualStudio2017 | 15.9.4 |

##公式の情報
https://docs.unrealengine.com/en-US/Platforms/VR/WMR
(情報ほぼなかった。)

##ひとまずVRテンプレートで動作確認
VRテンプレートでプロジェクトを作成します。
![UE4_WinMR1.png](https://qiita-image-store.s3.amazonaws.com/0/214053/b461c364-d220-cbd2-be0d-fe68472d7ebf.png)

プロジェクトが作成できたら、まずプラグインを有効にします。
Pluginsの「Built-In」→「Virtual Reality」から「Microsoft Windows Mixed Reality」を有効にします。そして、UE4を再起動します。
![UE4_WinMR2.png](https://qiita-image-store.s3.amazonaws.com/0/214053/d90b08b2-419c-2640-5c17-e45d6e342688.png)

「VirtualRealityBP」→「Map」→「MotionControllerMap」を開き、
MixedRealityポータルが起動している(or起動できる)状態で、VRプレビュー実行をすると、そのままWinMRデバイスでVRテンプレートがプレイできます。
![UE4_WinMR3.png](https://qiita-image-store.s3.amazonaws.com/0/214053/a17faa22-390d-9e4b-433e-dcfbc5ad1356.png)
![UE4_WinMR4.png](https://qiita-image-store.s3.amazonaws.com/0/214053/c9578512-22ae-8282-7a6f-c2941d2344e6.png)
![UE4_WinMR5.png](https://qiita-image-store.s3.amazonaws.com/0/214053/dca25d9e-5c4e-5d1b-fe01-32e0dd0f3445.png)

MixedRealityポータルを介して、UWPのアプリが起動した状態でプレイしているような感じになっていました。
Windowsボタンからホームに戻ると、「UE4Game_WindowsMR」というUWPアプリが起動している状態になっています。
![UE4_WinMR6.png](https://qiita-image-store.s3.amazonaws.com/0/214053/b888bf13-61f3-5748-abe5-0f19b9739f0e.png)

ちなみに、UWP向けのパッケージ化は相変わらずできませんが、
Windows向けにパッケージ化した実行ファイル(exe)を実行しても、同様にMixedRealityポータルからWinMRデバイスでプレイできるようになっていました。

##ブループリントから呼べるノード等
現状呼べそうなノードはこれらみたいです。
![UE4_WinMR7.png](https://qiita-image-store.s3.amazonaws.com/0/214053/7235f379-ed41-6ca3-cacb-5cfd6568f217.png)
![UE4_WinMR8.png](https://qiita-image-store.s3.amazonaws.com/0/214053/c51c39d5-8ad0-0cb6-ae68-7bb05bc6af62.png)

####入力以外のあれこれ

| ノード | 概要 |
|-----|-----|
| GetVersionString | 使用しているデバイス名(例:Samsung Windows Mixed Reality 800ZAA)を取得 |
| IsCurrentlyImmersive | 3Dアプリとして(VRモードで)実行されているかどうかを取得 |
| LockMouseToCenter | マウスポインタを画面中央に固定するかどうかを設定 |
| ToggleImmersive | 3Dアプリとして(VRモードで)実行されているかどうかを設定(3Dアプリとして実行されていない場合はMixedRealityポータルでデスクトップが表示され、Windows上で普通のWindowsアプリとして実行された状態になる) |

####入力のあれこれ

| ノード | 概要 |
|-----|-----|
| WindowsSpatialInput(L)TouchpadX | 左手コントローラーのタッチパッド上の触れているX座標(-1.0～1.0) |
| WindowsSpatialInput(L)TouchpadY | 左手コントローラーのタッチパッド上の触れているY座用(-1.0～1.0) |
| WindowsSpatialInput(R)TouchpadX | 右手コントローラーのタッチパッド上の触れているX座標(-1.0～1.0) |
| WindowsSpatialInput(R)TouchpadY | 右手コントローラーのタッチパッド上の触れているY座用(-1.0～1.0) |

| ノード | 概要 |
|-----|-----|
| WindowsSpatialInput(L)Menu | 左手コントローラーのメニューボタン押下 |
| WindowsSpatialInput(L)Touchpad | 左手コントローラーのタッチパッド押下 |
| WindowsSpatialInput(L)TouchpadIsTouched | 左手コントローラーのタッチパッド接触 |
| WindowsSpatialInput(L)TouchpadX | 左手コントローラーのタッチパッド上の触れているX座標(-1.0～1.0) |
| WindowsSpatialInput(L)TouchpadY | 左手コントローラーのタッチパッド上の触れているY座用(-1.0～1.0) |
| WindowsSpatialInput(R)Menu | 右手コントローラーのメニューボタン押下 |
| WindowsSpatialInput(R)Touchpad | 右手コントローラーのタッチパッド押下 |
| WindowsSpatialInput(R)TouchpadIsTouched | 右手コントローラーのタッチパッド接触 |
| WindowsSpatialInput(R)TouchpadX | 右手コントローラーのタッチパッド上の触れているX座標(-1.0～1.0) |
| WindowsSpatialInput(R)TouchpadY | 右手コントローラーのタッチパッド上の触れているY座用(-1.0～1.0) |

VRテンプレートが何も設定せず普通に操作できるため、ある程度の部分は共通となっていました。
MotionControllerコンポーネントでのトラッキング状態取得やトリガー等の(上記以外の)入力取得は従来のものでできるようです。
![UE4_WinMR9.png](https://qiita-image-store.s3.amazonaws.com/0/214053/66ecba2a-c99f-a804-75df-7634349f457b.png)

##さいごに
UWP出力ができるわけでもないので、メリットとしては、
公式のUE4オンリーで、WinMRデバイスが使えるぐらいしかなさそうです。
(デバイスがOculusRiftやHTCVIVEでいい場合は特にメリットなさそう。)
ただ、デバイスとしてWinMRのメリット(外部センサーが不要、動作要求スペックが低い等)はあるので、意味はあるかなという感じです。
(トリッキーな活用法としては、従来のWindowsアプリとWinMRの3Dアプリを行き来するアプリが作れますね。)

何故か公式の情報がセットアップ方法ぐらいしかありませんでしたが、基本的に今までのVR開発の手法が使えるので、WinMRデバイスしか持っていなくてもOculusRiftやHTCVIVEに対応したコンテンツを、UE4で作れそうですね。

---
明日は18日目、@SatoshiSugaiさんです。