MRが楽しい

MRやVRについて学習したことを書き残す

UWPプロジェクトをHoloLensとWindowsMRで起動する

本日は hololens の技術調査枠です。
再び hololens の記事の割合を増やしていきます。(勿論モデリングも続けます)
今回は Unity2017.2 で WindowsMR 向けのビルドを試してみます。

合わせて最新の MixedRealityToolkit の機能も紹介します。
github.com

新規プロジェクトを作成します。
f:id:bluebirdofoz:20171112013140j:plain

HoloToolkit-Unity-v1.2017.2.0.unitypackage をインポートします。
f:id:bluebirdofoz:20171112013153j:plain

インポートすると、これまでの HoloToolKit 同様、Toolkit メニューが表示されるようになります。
まずは基本設定を行う Configure を開きます。
f:id:bluebirdofoz:20171112013213j:plain

・Apply Mixed Reality Project Settings
UWP向けのビルド設定が自動で実施されます。チェックを行い、Apply をクリックします。
f:id:bluebirdofoz:20171112013225j:plain
基本的にデフォルトのチェックのままでよいでしょう。
各種設定はクリックすると、下部に説明文が表示されます。

・Apply Mixed Reality Scene Settings
シーンの基本構成が自動で反映されます。チェックを行い、Apply をクリックします。
f:id:bluebirdofoz:20171112013258j:plain
メインカメラが MixedRealityCamera.prefab に差し変わる、入力操作のスクリプトが設定されるなどの変更が行われます。
この辺りをカスタマイズしたい場合はチェックを付けずに自作する方法もあります。
しかし、恐らくはこれらの prefab について理解を深めてカスタマイズした方が効率的でしょう。

・Apply UWP Capability Settings
アプリで利用する機能の許可設定を行います。チェックを行い、Apply をクリックします。
f:id:bluebirdofoz:20171112013404j:plain
HoloToolKit のときと大きな違いはありません。
カメラを利用する場合は webcam 、Spatial Mapping を利用する場合は Spatial Perception のチェックが必要などです。

設定を実施すると、以下のような状態になっています。
f:id:bluebirdofoz:20171112013426j:plain

試すプロジェクトはそのままでもよいのですが。
やはり何もないのは寂しいのでUnityちゃんが登場するアプリにします。
f:id:bluebirdofoz:20171112013439j:plain

ではいつもの手順通り、シーンを保存してビルドを行います。
f:id:bluebirdofoz:20171112013455j:plain

UnityChan のスクリプトで二箇所エラーが発生しましたが、今回は利用しない機能なのでコメントアウトで対処しています。
・AutoBlink.cs

//using System.Security.Policy;

・SpringManager.cs

//var prop = springBones [0].GetType ().GetField (fieldName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
(中略)
//prop.SetValue (springBones [i], baseValue * scale);

VisualStudio のプロジェクトが生成されたら、まずは hololens 側にインストールしてみます。
Relese, x86 を設定して、ビルド先に hololens を指定してインストールを行います。
f:id:bluebirdofoz:20171112013509j:plain

hololens で起動できました。
f:id:bluebirdofoz:20171112013517j:plain
このとき、一つ注目する点としてユニティちゃんの背景がきちんと透過されている事を覚えておきます。

次に WindowsMR が利用できる PC にインストールしてみます。
Relese, x64 を設定して、ビルド先に PC を指定してインストールを行います。
f:id:bluebirdofoz:20171112013534j:plain

ヘッドセットを付けると……動いた!
f:id:bluebirdofoz:20171112013548j:plain
なお、Unityちゃんは地中に埋まってます。

ここで注目なのが、WindwosMR のアプリでは hololens で表示されていなかった背景や床が表示されているという点です。
手順の通り、プロジェクトは一切書き換えていません。
プロジェクトのシーン設定で配置した MixedRealityCameraParent がアプリ実行時に自動で判断してくれています。

ざっと確認ですが、おそらくこの MixedRealityCameraManager.cs というスクリプトです。
f:id:bluebirdofoz:20171112013818j:plain
・MixedRealityCameraManager.cs

#if UNITY_WSA
#if UNITY_2017_2_OR_NEWER
            if (!HolographicSettings.IsDisplayOpaque)
#endif
                {
                    CurrentDisplayType = DisplayType.Transparent;
                    ApplySettingsForTransparentDisplay();
                    if (OnDisplayDetected != null)
                    {
                        OnDisplayDetected(DisplayType.Transparent);
                    }
                    return;
                }
#endif
            }

            CurrentDisplayType = DisplayType.Opaque;
            ApplySettingsForOpaqueDisplay();
            if (OnDisplayDetected != null)
            {
                OnDisplayDetected(DisplayType.Opaque);
            }
        }

必要な個所さえ処理を分けておけば一つのプロジェクトで hololens と WindowsMR 向けの実装ができます。
別々のビルドは不要です。これは便利。


因みに、Unityちゃんが地中に埋まっているのはUnityちゃんの立ち位置を -1.5 mに設定しているためです。
これは hololens の場合、起動カメラ位置が人の頭の高さであるための対処です。
WindowMR 側では起動位置が 0 mではないのかな。
現実での衝突/転倒回避のため、自動的に補正しているとか?この辺りは要調査です。