LoginSignup
2
3

More than 3 years have passed since last update.

OculusQuestでどこでもドアを実現してみる

Last updated at Posted at 2020-03-19

はじめに

XR Interaction Toolkitと、Pocket Portal VRというアセットを使用して、OculusQuestでどこでもドアを実現してみました。

Pocket Portal VR
Pocket Portal VRのアセットのページです。Pocket Portal VRは、作者がサポートできない状態とのことで、オープンソース化されています。

XR Interaction Toolkitは、Unity上でPackage Manegerからインストールできます。
また、XR Interaction ToolkitのサンプルシーンはXR-Interaction-Toolkit-Examplesから入手できます。

開発環境

Unity 2019.3.2f1
XR Interaction Toolkit 0.9.3
Oculus XR Plugin 1.2.0
Pocket Portal VR 2.3

修正したところ

Portal.csのRenderMonoを以下のように書き換えました。

Portal.cs
    private void RenderMono(Camera camera) {
        Transform trackingSpace = xrRig.cameraGameObject.transform;
        var leftEye = trackingSpace.localPosition + new Vector3(-camera.stereoSeparation / 2f, 0f, 0f);
        var RightEye = trackingSpace.localPosition + new Vector3(camera.stereoSeparation / 2f, 0f, 0f);


        if (camera.stereoTargetEye == StereoTargetEyeMask.Both || camera.stereoTargetEye == StereoTargetEyeMask.Left)
        {
            Vector3 leftPosition = xrRig.transform.TransformPoint(leftEye);
            Quaternion leftRot = xrRig.transform.rotation * trackingSpace.localRotation;
            RenderPlane(renderCam, leftTexture, leftPosition, leftRot, camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left));
            meshRenderer.material.SetTexture("_LeftTex", leftTexture);
        }

        if (camera.stereoTargetEye == StereoTargetEyeMask.Both || camera.stereoTargetEye == StereoTargetEyeMask.Right)
        {
            Vector3 rightPosition = xrRig.transform.TransformPoint(RightEye);
            Quaternion rightRot = xrRig.transform.rotation * trackingSpace.localRotation;
            RenderPlane(renderCam, rightTexture, rightPosition, rightRot, camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right));
            meshRenderer.material.SetTexture("_RightTex", rightTexture);
        }
    }

上記コード中で使用しているxrRigは、XR Interaction ToolkitのXRRigをstart時に取得しておきます。

xrRig = GameObject.FindObjectOfType<XRRig>();

左右カメラ視差をつくるためのオフセット設定は、どこでもドア(ポータル)をUnity NativeのVRで実現してみるを参考にさせていただきました。

Oculus Integrationとの組み合わせについて

Oculus Integrationとの組み合わせで動作させる場合、サンプルシーンRiftOVRDemoを試してみたところ、特にコードを修正しなくでもビルドはできるのですが、OculusQuestで動かしたときに両目でポータルの見える位置がずれてしまい立体視できない状態でした。コード修正で立体視できる状態にできないか試してみたのですがうまくいきませんでした・・対応方法をご存じの方がいましたら教えていただけると嬉しいです。
(2020/3/22追記)
シェーダーで左右のテクスチャ切り替えを変にトグルさせている処理が有効になっており、Portal.cs中で設定している箇所を以下のように無効に設定することで対処できました。

//#if USES_OPEN_VR
//        Shader.SetGlobalInt("OpenVRRender", 1);
//#else
        Shader.SetGlobalInt("OpenVRRender", 0);
//#endif

その他、Portal.csのRenderOpenVRを以下のように書き換えました。

Portal.cs
    private void RenderOpenVR(Camera camera) {
#if USES_OPEN_VR
        Transform trackingSpace = rig.centerEyeAnchor.transform;
        var leftEye = trackingSpace.localPosition + new Vector3(-camera.stereoSeparation / 2f, 0f, 0f);
        var RightEye = trackingSpace.localPosition + new Vector3(camera.stereoSeparation / 2f, 0f, 0f);

        if (camera.stereoTargetEye == StereoTargetEyeMask.Both || camera.stereoTargetEye == StereoTargetEyeMask.Left)
        {
            Vector3 leftPosition = rig.transform.TransformPoint(leftEye);
            Quaternion leftRot = rig.transform.rotation * trackingSpace.localRotation;
            RenderPlane(renderCam, leftTexture, leftPosition, leftRot, camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left));
            meshRenderer.material.SetTexture("_LeftTex", leftTexture);
        }

        if (camera.stereoTargetEye == StereoTargetEyeMask.Both || camera.stereoTargetEye == StereoTargetEyeMask.Right)
        {
            Vector3 rightPosition = rig.transform.TransformPoint(RightEye);
            Quaternion rightRot = rig.transform.rotation * trackingSpace.localRotation;
            RenderPlane(renderCam, rightTexture, rightPosition, rightRot, camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right));
            meshRenderer.material.SetTexture("_RightTex", rightTexture);
        }
#endif
    }

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3