デコシノニッキ

ホロレンジャーの戦いの記録

EnableDepthBufferで幸せになりたかった話

HoloLensのアップデートに伴い、EnableDepthBufferというUnityアプリの機能が解禁されました。
どのような機能かと言うと、カメラDepthを利用して描画の安定性に大きく影響する安定化平面を設置するSetFocusPointをコードレスで利用できるようになるというものです。 これまで安定化平面の設置は、UnityのAPIであるSetFocusPointに設置したい位置、カメラから設置したい位置のベクトルの逆向きのベクトルを渡してあげる必要がありました。

まずは通常の安定化平面の動きを見てみます。安定化平面はデバイスポータルからその動きを確認できます。3D ViewからShow Stabilization Plane を有効にしましょう。赤く表示されているのが安定化平面です。デフォルトでは、カメラから等距離に配置されている様子が確認出来ます。

f:id:haikage1755:20180523104511p:plain:w350

Mixed Reality Toolkit からは、この設置を簡単にしてくれるStabilizationModifierというスクリプトを提供しています。

www.tattichan.work

StabilizationModifierによって安定化平面を設置する方法には3パターンがあります。

  1. 固定距離
    最も単純なパターンです。カメラから常に一定の距離に安定化平面がある状態です。後述するRaycast問題の影響を受けませんが、オブジェクトがユーザから固定距離にある、ユーザが動かないことを前提とした利用になるため扱いづらい印象です。

  2. 定位置
    オブジェクトを指定し、常に安定化平面が一箇所にある状態です。単一のオブジェクトを見る場合には適しており、またRaycast問題を考慮する必要がありません。

  3. Raycast設定
    オブジェクトがある位置をRaycastで取得し、シーン内に複数オブジェクトであっても対応できる方法であり、StabilizationPlaneModifierのデフォルトのモードでもあります。しかしながら、Raycastを利用する都合上Colliderの設定が必要であったり、近接しすぎるとカメラが安定化平面に埋まり、却って描画が不安定になるといった問題もあります。

開発者はこれらメリットデメリットを考慮してアプリケーションを開発する必要がありました。
そこでFocusPointをColliderなどを考慮することなく設置できるようになるのが,Enable Depth Buffer という機能です。Unity2017.3から使える本機能は,Player Settings -> XR Settings -> Windows Mixed Reality を展開すると,Enable Depth Buffer というトグルがあるので有効にしてください。

f:id:haikage1755:20180523104922p:plain:w250

Cubeをいくつか配置しただけの簡単なシーンを用意して,3パターンの実験を行いました。

f:id:haikage1755:20180523110122p:plain:w350

  1. Stabilization Modifier も Enable Depth Buffer も有効にしない
  2. Stabilization Modifier のみ
  3. Enable Depth Buffer のみ

結局
1.Stabilization Modifier も Enable Depth Buffer も有効にしない 通常の動きです。先に述べたように,カメラから等距離に配置されています。

2.Stabilization Modifier のみ 少々分かりづらいですが,Cubeの位置に合わせて平面が奥にいったり手前にいったり動いています。

3.Enable Depth Buffer のみ 今回のメインテーマです。あらぶっております。実画面でもオブジェクトが小刻みに震えるなど実用は難しいという印象でした。

まとめると,MRTKのStabilizationPlaneModifierを使いましょう。今後のアップデートに期待。

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」