夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MagicLeap2でCameraのNearClipの下限が解除できない問題の解消

本日はMagicLeap2開発枠です。

〇MagicLeap2のNearClip

 今回はアプリを作成したもののNearClipが大きく、オブジェクトに近づくことができない問題がありました。

 通常カメラのインスペクタービューからNearClipを調整できますが、0.37以下の値を入力した場合はアプリ実行後に外部スクリプトから動的に変更したとしても強制的に0.37にされるということがありました。

今回はこの問題を解消していきます。

〇環境

・Unity2022.2.8  現在ML2の開発にはUnity2022.2以降が必要です。

・MixedRealityToolkit v2.8

〇NearClipとは?

Unityをはじめとする多くのCGレンダリングでは視錐台と呼ばれる概念があります。

docs.unity3d.com

これはオブジェクトが描画される領域に関する概念で、オブジェクトを描画する最小距離をNear Clip Plane(NearClip)、オブジェクトが描画される最大距離をFar Clip Plane(FarClip)となります。

HoloLensやMagicLeap2、MetaQuestなどのxRデバイスではユーザー自身がカメラ位置になるため、オブジェクトに物理的に近づくこともできます。

 この際にオブジェクトに頭がめり込んでしまい体験を損なうことがあり、UXを維持する意味でNearClipは非常に重要なパラメータになります。

 しかしながら今回のように値が大きすぎる場合ホログラムに近づくことができず逆にストレスに感じることがあります。

〇原因と解消

原因はMagicLeapCamera.csコンポーネントのLateUpdate関数で推奨される最低のニアクリップより小さい場合最低値に戻される処理が働いています。

public void ValidateNearClip()
{
  var nearClip = camera.nearClipPlane;//現在のニアクリップを取得
  var min = RenderingSettings.minNearClipDistance;//レンダリング設定で定義されたニアクリップ
  if ( nearClip < min)
  {
    if (enforceNearClip)
    {
       camera.nearClipPlane = min
    }
  }
}

これによってスクリプトで外部コンポーネントから動的にニアクリップを変更しても戻されていました。

ここではenforceNearClipが有効になっている場合この処理が働いていますが、MRTKで定義する場合動的にカメラが生成されるため気が付くことができていませんでした。

ValidateNearClip()は筆者にとって不要であったためここをコメントアウトすることで強制的にNearClipが変更されることはなくなります。

本日は以上です。

MagicLeap2はドキュメントも少ないので快適が難しいですが、これからも進めていきます。