HoloLensのアップデートに伴い、EnableDepthBufferというUnityアプリの機能が解禁されました。
どのような機能かと言うと、カメラDepthを利用して描画の安定性に大きく影響する安定化平面を設置するSetFocusPointをコードレスで利用できるようになるというものです。
これまで安定化平面の設置は、UnityのAPIであるSetFocusPointに設置したい位置、カメラから設置したい位置のベクトルの逆向きのベクトルを渡してあげる必要がありました。
まずは通常の安定化平面の動きを見てみます。安定化平面はデバイスポータルからその動きを確認できます。3D ViewからShow Stabilization Plane を有効にしましょう。赤く表示されているのが安定化平面です。デフォルトでは、カメラから等距離に配置されている様子が確認出来ます。
Mixed Reality Toolkit からは、この設置を簡単にしてくれるStabilizationModifierというスクリプトを提供しています。
StabilizationModifierによって安定化平面を設置する方法には3パターンがあります。
固定距離
最も単純なパターンです。カメラから常に一定の距離に安定化平面がある状態です。後述するRaycast問題の影響を受けませんが、オブジェクトがユーザから固定距離にある、ユーザが動かないことを前提とした利用になるため扱いづらい印象です。定位置
オブジェクトを指定し、常に安定化平面が一箇所にある状態です。単一のオブジェクトを見る場合には適しており、またRaycast問題を考慮する必要がありません。Raycast設定
オブジェクトがある位置をRaycastで取得し、シーン内に複数オブジェクトであっても対応できる方法であり、StabilizationPlaneModifierのデフォルトのモードでもあります。しかしながら、Raycastを利用する都合上Colliderの設定が必要であったり、近接しすぎるとカメラが安定化平面に埋まり、却って描画が不安定になるといった問題もあります。
開発者はこれらメリットデメリットを考慮してアプリケーションを開発する必要がありました。
そこでFocusPointをColliderなどを考慮することなく設置できるようになるのが,Enable Depth Buffer という機能です。Unity2017.3から使える本機能は,Player Settings -> XR Settings -> Windows Mixed Reality を展開すると,Enable Depth Buffer というトグルがあるので有効にしてください。
Cubeをいくつか配置しただけの簡単なシーンを用意して,3パターンの実験を行いました。
- Stabilization Modifier も Enable Depth Buffer も有効にしない
- Stabilization Modifier のみ
- Enable Depth Buffer のみ
結局
1.Stabilization Modifier も Enable Depth Buffer も有効にしない
通常の動きです。先に述べたように,カメラから等距離に配置されています。
これがStabilizationPlaneModifierもEnableDepthBufferも全部切った状態。固定距離でカメラに追従するように動きます。#HoloLens pic.twitter.com/5PiOnomiDl
— デコシ (@Ash_Yin) 2018年5月22日
2.Stabilization Modifier のみ 少々分かりづらいですが,Cubeの位置に合わせて平面が奥にいったり手前にいったり動いています。
まずはAPIを叩いて位置を調整した場合のStabilization Planeの素晴らしい動きをご覧ください。 #HoloLens pic.twitter.com/Xv2XEnjHFH
— デコシ (@Ash_Yin) 2018年5月22日
3.Enable Depth Buffer のみ 今回のメインテーマです。あらぶっております。実画面でもオブジェクトが小刻みに震えるなど実用は難しいという印象でした。
こちらがEnableDepthBufferを使ったStabilization Plane の不思議挙動です。 #HoloLens pic.twitter.com/g64rRife60
— デコシ (@Ash_Yin) 2018年5月22日
まとめると,MRTKのStabilizationPlaneModifierを使いましょう。今後のアップデートに期待。