Stabilization Planeとは何者なのか?
Unityで開発したアプリ内で頭を動かしたとき、オブジェクトが一緒にずれる(Swim)現象について調査している最中にStabilization Plane というワードを目にしました。が、あまり情報がないので調査してみました。
Stabilization Plane
翻訳記事 littlewing.hatenablog.com
- Virtualオブジェクトを安定化させる単一平面
- 自動的に選択・実行されるがフォーカスポイントを選択することで制御も可能
Unityで利用する
SetFocusPoint()を使う Focus point in Unity
Focus Pointの設定例の一つ
//安定化させたいオブジェクト public GameObject focusedObject; void Update() { /* Normally the normal is best set to be the opposite of the main camera's forward vector If the content is actually all on a plane (like text), set the normal to the normal of the plane and ensure the user does not pass through the plane (訳) 通常、法線はメインカメラの順方向ベクトルとは反対に設定することが最良です。 コンテンツが実際にすべて平面上にある場合(テキストのように)、法線を平面の法線に設定し、ユーザーが平面を通過しないようにします。 */ //カメラの逆方向ベクトルを取得する var normal = -Camera.main.transform.forward; //フォーカスしているオブジェクトの位置を取得 var position = focusedObject.transform.position; //フォーカスポイントを対象のオブジェクトに、法線をカメラの逆方向として設定する UnityEngine.VR.WSA.HolographicSettings.SetFocusPointForFrame(position, normal); }
実際に動かしてみる。
分かりやすいようにQuadを置いて可視化しています。(Quadは両面描画するようにShaderをちょこっといじっています)
Stabilization Planeのサンプルコードで挙動を可視化してみる。 #HoloLens pic.twitter.com/kmBkt0RbZD
— デコ・シ (@Ash_Yin) March 3, 2018
Best Practice
- 平面のコンテンツのみの場合、これらに安定化平面を設定する
- ワールドロックされた3つの小さな球がある場合は、ユーザーの視界内にあるすべての球の中心を安定化平面でカットする
- シーン中に異なる深度のコンテンツがある場合は、遠くのオブジェクトに合わせる
- ユーザーが見ているオブジェクトに一致するようにフレームごとに安定点を調整する
1番目はいいとして、コンテンツによっては、2-4番目を同時に行う必要がありそうです。
Things to Avoid
- 視界外のオブジェクトの安定化平面は忘れずに消すこと。安定化平面の法線はカメラの正面と反対側に設定していることを確認する。
- 安定化平面を極端に前後に素早く変更しない
- 安定化平面を一定の距離方向に設定したままにしない
- 安定化平面がユーザーを横切らないようにする
これらは排他な気がするのですがどうなんでしょう…??
最適解 ワールドロックされた3つの小さな球がある場合は、ユーザーの視界内にあるすべての球の中心を安定化平面でカットする 避ける事 安定化平面の法線はカメラの正面と反対側に設定していることを確認する
距離と自動配置のテスト
以上を踏まえていくつか挙動を探る実験をしてみたいと思います。
近距離(2m)、遠距離(10m)、遠近の両方の3パターンで調べます。
- Unity以外
- 何も設定しない
- フォーカスポイントを関係ないところに設定
- フォーカスポイントを適切に設定
Unity以外
わかりやすくHologramsでやってみます。
至近距離に置いた場合と遠距離に置いた場合の違いはあまり違いがないように思えます。
つまりブレるのはハードウェア由来ではなく、アプリ由来のようです。
何も設定しない
何も設定しない場合、自動で選択されます
- 近距離のみ配置 -> Swimしない
- 遠距離のみ配置 -> Swimする
- 同時配置 -> 近距離のみSwimしない
関係ないところ(100m地点)に設定
- 近距離のみ配置 -> Swimする
- 遠距離のみ配置 -> Swimする
- 同時配置 -> Swimする
適切に設定
- 近距離のみ配置 -> Swimしない
- 遠距離のみ配置 -> Swimしない
- 同時配置 -> 設定したほうのみSwimしない
また、Planeをカメラが横切った時はどの場合においても激しくSwimする現象を確認しました。
まとめ
Swimが起きたかどうかの判断は主観的なので、一部微妙な結果があるかもしれませんが、それでもStabilization Planeが安定的な表示のためには重要な役目を担っており、例えそれが至近距離であってもPlaneが通っていなければ明らかにSwimが起こるというのが今回の調査で分かりました。