VRコンテンツでのUI表示


VRにてUIを表示する際に、Cameraの設定はOrthographicでいいかなと思いましたが、どうやらVRコンテンツでは(google VRでは?)カメラの設定をOrthographicではなく、Perspectiveに設定するしかないようです。
Post Processingを使っている場合はその影響が出ないように、UI専用のCameraを作成しそちらをPerspectiveにし、そちらにCanvasのRenderModeをWorldSpaceに設定し、そのカメラの子オブジェクトにしました。
PerspectiveなCameraへUIをスケールを使ってフィットさせる方法は

#if !UNITY_EDITOR
float screenW = Screen.width/2f;
#else
float screenW = Screen.width;
#endif

float screenH = Screen.height;

RectTransform rect = this.uiCanvas.GetComponent<RectTransform>();
rect.sizeDelta = new Vector2(screenW, screenH);
this.uiCanvas.renderMode = RenderMode.WorldSpace;
this.uiCanvas.worldCamera = this.vrUICamera;
this.uiCanvas.transform.SetParent(this.vrUICamera.transform, false);

float pos = this.vrUICamera.nearClipPlane + 0.01f;
this.uiCanvas.transform.position = this.vrUICamera.transform.position + this.vrUICamera.transform.forward * pos;
float ratio = Mathf.Tan(this.vrUICamera.fieldOfView * Mathf.Deg2Rad * 0.5f) * pos * 2f / rect.sizeDelta.y; // Canvasをスクリーンサイズに合わせた際に、指定の位置でのカメラにフィットする倍率の計算
this.uiCanvas.transform.localScale = Vector3.one * ratio;

スケールではなく奥行きを合わせる場合は

#if !UNITY_EDITOR
float screenW = Screen.width/2f;
#else
float screenW = Screen.width;
#endif

float screenH = Screen.height;

RectTransform rect = this.uiCanvas.GetComponent<RectTransform>();
rect.sizeDelta = new Vector2(screenW, screenH);
this.uiCanvas.renderMode = RenderMode.WorldSpace;
this.uiCanvas.worldCamera = this.vrUICamera;
this.uiCanvas.transform.SetParent(this.vrUICamera.transform, false);

float frustumHeight = rect.sizeDelta.x / this.vrUICamera.aspect;
float distance = frustumHeight * 0.5f / Mathf.Tan(this.vrUICamera.fieldOfView * 0.5f * Mathf.Deg2Rad); // Canvasのサイズがぴったりに奥行きの計算

// カメラのクリップ距離を調整
if (distance < this.vrUICamera.nearClipPlane)
	this.vrUICamera.nearClipPlane = distance - 0.1f;
else if (distance > this.vrUICamera.farClipPlane)
	this.vrUICamera.farClipPlane = distance + 1f;
this.uiCanvas.transform.localPosition = new Vector3(0f, 0f, distance);

参考)
Unity | カメラからの距離で求める錐台のサイズ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です