Beispiel #1
0
        /// <summary>
        /// Enable or disable the eye cameras according to the display mode
        /// of ViveSR_DualCameraRig.
        /// This part of code should be integrated into ViveSR_DualCameraRig.SetMode().
        /// </summary>
        private void EnableOrDisableCamerasAccordingToDisplayMode()
        {
            var currentDualCameraRigDisplayMode = ViveSR_DualCameraRig.Instance.Mode;

            if (currentDualCameraRigDisplayMode != previousDualCameraRigDisplayMode)
            {
                switch (currentDualCameraRigDisplayMode)
                {
                case DualCameraDisplayMode.VIRTUAL:
                    eyeCameraL.enabled = false;
                    eyeCameraR.enabled = false;
                    break;

                case DualCameraDisplayMode.REAL:
                    eyeCameraL.enabled = true;
                    eyeCameraR.enabled = true;
                    break;

                case DualCameraDisplayMode.MIX:
                    eyeCameraL.enabled = true;
                    eyeCameraR.enabled = true;
                    break;
                }

                previousDualCameraRigDisplayMode = currentDualCameraRigDisplayMode;
            }
        }
        public override void ExecuteToDo()
        {
            DualCameraDisplayMode targetMode = isOn ? DualCameraDisplayMode.VIRTUAL : DualCameraDisplayMode.MIX;

            StaticMeshScript.SwitchModeScript.SwithMode(targetMode);
            if (isOn)
            {
                ViveSR_Experience_Demo.instance.SubButtonScripts[SubMenuButton.EnableMesh_Dynamic].ForceExcute(false);
                ViveSR_Experience_Demo.instance.SubButtonScripts[SubMenuButton.EnableMesh_StaticMR].ForceExcute(false);

                StaticMeshScript.LoadMesh(true, true,
                                          () => {
                    ViveSR_Experience_Demo.instance.Rotator.RenderButtons(false);
                    SubMenu.RenderSubBtns(false);
                    disabled = true;
                    ViveSR_Experience_HintMessage.instance.SetHintMessage(hintType.onHeadSet, "[Enable Mesh]\nLoading...", false);
                },
                                          () => {
                    ViveSR_Experience_Demo.instance.Rotator.RenderButtons(true);
                    SubMenu.RenderSubBtns(true);
                    disabled = false;
                    ViveSR_Experience_HintMessage.instance.SetHintMessage(hintType.onController, "", false);
                    ViveSR_Experience_HintMessage.instance.SetHintMessage(hintType.onHeadSet, "Mesh Loaded!", true, 1f);
                    dartGeneratorMgr_static.gameObject.SetActive(true);
                    ViveSR_Experience_ControllerDelegate.triggerDelegate += HandleTrigger;
                });
            }
            else
            {
                StaticMeshScript.LoadMesh(false);
                dartGeneratorMgr_static.gameObject.SetActive(false);
                ViveSR_Experience_ControllerDelegate.triggerDelegate -= HandleTrigger;
                dartGeneratorMgr_static.DestroyObjs();
            }
        }
Beispiel #3
0
        public void SwithMode(DualCameraDisplayMode mode)
        {
            if (mode != currentMode)
            {
                currentMode = mode;
                ViveSR_DualCameraRig.Instance.SetMode(mode);
                ViveSR_DualCameraRig.Instance.Mode = mode;

                if (VRMode_bg != null)
                {
                    VRMode_bg.SetActive(mode == DualCameraDisplayMode.VIRTUAL);
                }

                if (setSkybox)
                {
                    SetSkybox(mode == DualCameraDisplayMode.VIRTUAL);
                }
            }
        }
Beispiel #4
0
        /// <summary>
        /// Decide whether real/virtual camera render or not.
        /// </summary>
        /// <param name="mode">Virtual, Real and Mix</param>
        public void SetMode(DualCameraDisplayMode mode)
        {
            if (OriginalCamera == null)
            {
                if (Camera.main == VirtualCamera)
                {
                    VirtualCamera.tag = "Untagged";
                }
                OriginalCamera    = Camera.main;
                VirtualCamera.tag = "MainCamera";
            }
            switch (mode)
            {
            case DualCameraDisplayMode.VIRTUAL:
                if (OriginalCamera != VirtualCamera && OriginalCamera != null)
                {
                    OriginalCamera.enabled = true;
                }
                EnableViveCamera(false);
                break;

            case DualCameraDisplayMode.REAL:
                if (OriginalCamera != VirtualCamera && OriginalCamera != null)
                {
                    OriginalCamera.enabled = false;
                }
                EnableViveCamera(true, DualCameraMode.REAL);
                break;

            case DualCameraDisplayMode.MIX:
                if (OriginalCamera != VirtualCamera && OriginalCamera != null)
                {
                    OriginalCamera.enabled = false;
                }
                EnableViveCamera(true, DualCameraMode.MIX);
                break;
            }
        }
Beispiel #5
0
        private void ActivateNewSeeThrough()
        {
            newSeeThroughIsActive = true;

            // Get existing cameras.
            // Make the render planes invisible in these cameras.
            virtualCameraL              = ViveSR_DualCameraRig.Instance.VirtualCamera;
            frameCameraL                = ViveSR_DualCameraRig.Instance.DualCameraLeft;
            frameCameraR                = ViveSR_DualCameraRig.Instance.DualCameraRight;
            virtualCameraL.cullingMask &= ~(1 << renderPlaneLLayer);
            virtualCameraL.cullingMask &= ~(1 << renderPlaneRLayer);

            // Create `virtualCameraR` from `virtualCameraL`.
            // Set the target eye of them.
            // Make the render planes invisible in these cameras.
            if (virtualCameraR == null)
            {
                virtualCameraR      = Camera.Instantiate(virtualCameraL);
                virtualCameraR.name = "Camera (eye) (right)";
            }
            else
            {
                virtualCameraR.enabled = true;
                virtualCameraR.gameObject.SetActive(true);
            }
            virtualCameraL.stereoTargetEye = StereoTargetEyeMask.Left;
            virtualCameraR.stereoTargetEye = StereoTargetEyeMask.Right;
            virtualCameraL.cullingMask    &= ~(1 << renderPlaneLLayer);
            virtualCameraL.cullingMask    &= ~(1 << renderPlaneRLayer);
            virtualCameraR.cullingMask    &= ~(1 << renderPlaneLLayer);
            virtualCameraR.cullingMask    &= ~(1 << renderPlaneRLayer);

            // Create cameras that render the render planes to the screen.
            if (eyeCameraL == null)
            {
                eyeCameraL      = Camera.Instantiate(frameCameraL, Vector3.zero, Quaternion.identity, ViveSR_DualCameraRig.Instance.transform);
                eyeCameraL.name = "Eye Camera (left)";
                eyeCameraL.gameObject.hideFlags = HideFlags.HideInHierarchy;
            }
            else
            {
                eyeCameraL.enabled = true;
                eyeCameraL.gameObject.SetActive(true);
            }
            if (eyeCameraR == null)
            {
                eyeCameraR      = Camera.Instantiate(frameCameraR, Vector3.zero, Quaternion.identity, ViveSR_DualCameraRig.Instance.transform);
                eyeCameraR.name = "Eye Camera (right)";
                eyeCameraR.gameObject.hideFlags = HideFlags.HideInHierarchy;
            }
            else
            {
                eyeCameraR.enabled = true;
                eyeCameraR.gameObject.SetActive(true);
            }
            SetLocalTransformToIdentity(eyeCameraL.transform);
            SetLocalTransformToIdentity(eyeCameraR.transform);
            eyeCameraL.cullingMask = 1 << renderPlaneLLayer;
            eyeCameraR.cullingMask = 1 << renderPlaneRLayer;

            // Calculate the eye camera focal lengths.
            var eyeCameraLHalfVerticalFOV = 0.5f * eyeCameraL.fieldOfView * Mathf.Deg2Rad;
            var eyeCameraRHalfVerticalFOV = 0.5f * eyeCameraR.fieldOfView * Mathf.Deg2Rad;
            var eyeCameraLFocalLength     = 0.5f * (float)eyeCameraL.pixelHeight / Mathf.Tan(eyeCameraLHalfVerticalFOV);
            var eyeCameraRFocalLength     = 0.5f * (float)eyeCameraR.pixelHeight / Mathf.Tan(eyeCameraRHalfVerticalFOV);

            // Calculate the frame camera FOV.
            var frameCameraLHalfHorizontalFOV = Mathf.Atan(0.5f * (float)ViveSR_DualCameraImageCapture.UndistortedImageWidth / (float)ViveSR_DualCameraImageCapture.FocalLength_L);
            var frameCameraRHalfHorizontalFOV = Mathf.Atan(0.5f * (float)ViveSR_DualCameraImageCapture.UndistortedImageWidth / (float)ViveSR_DualCameraImageCapture.FocalLength_R);

            frameCameraLHalfVerticalFOV = Mathf.Atan(0.5f * (float)ViveSR_DualCameraImageCapture.UndistortedImageHeight / (float)ViveSR_DualCameraImageCapture.FocalLength_L);
            frameCameraRHalfVerticalFOV = Mathf.Atan(0.5f * (float)ViveSR_DualCameraImageCapture.UndistortedImageHeight / (float)ViveSR_DualCameraImageCapture.FocalLength_R);

            // Calculate the render texture width and height according to the FOV,
            // using the focal length of the eye cameras.
            var renderTextureLWidth  = (int)(2.0f * eyeCameraLFocalLength * Mathf.Tan(frameCameraLHalfHorizontalFOV));
            var renderTextureRWidth  = (int)(2.0f * eyeCameraRFocalLength * Mathf.Tan(frameCameraRHalfHorizontalFOV));
            var renderTextureLHeight = (int)(2.0f * eyeCameraLFocalLength * Mathf.Tan(frameCameraLHalfVerticalFOV));
            var renderTextureRHeight = (int)(2.0f * eyeCameraRFocalLength * Mathf.Tan(frameCameraRHalfVerticalFOV));

            // Create render planes.
            if (renderPlaneLQuad == null)
            {
                renderPlaneLQuad      = GameObject.CreatePrimitive(PrimitiveType.Quad);
                renderPlaneLQuad.name = "Render Plane (left)";
                renderPlaneLQuad.gameObject.hideFlags = HideFlags.HideInHierarchy;
                Destroy(renderPlaneLQuad.GetComponent <MeshCollider>());
                renderPlaneL = renderPlaneLQuad.AddComponent <ViveSR_Experience_FramePlane>() as ViveSR_Experience_FramePlane;
            }
            else
            {
                renderPlaneLQuad.SetActive(true);
            }
            if (renderPlaneRQuad == null)
            {
                renderPlaneRQuad      = GameObject.CreatePrimitive(PrimitiveType.Quad);
                renderPlaneRQuad.name = "Render Plane (right)";
                renderPlaneLQuad.gameObject.hideFlags = HideFlags.HideInHierarchy;
                Destroy(renderPlaneRQuad.GetComponent <MeshCollider>());
                renderPlaneR = renderPlaneRQuad.AddComponent <ViveSR_Experience_FramePlane>() as ViveSR_Experience_FramePlane;
            }
            else
            {
                renderPlaneRQuad.SetActive(true);
            }
            renderPlaneLQuad.transform.parent = ViveSR_DualCameraRig.Instance.TrackedCameraLeft.Anchor;
            renderPlaneRQuad.transform.parent = ViveSR_DualCameraRig.Instance.TrackedCameraRight.Anchor;
            renderPlaneLQuad.layer            = renderPlaneLLayer;
            renderPlaneRQuad.layer            = renderPlaneRLayer;

            // Create render textures.
            // Make the frame cameras and the virtual cameras render to the render textures.
            // Draw the render textures on the render planes.
            var renderTextureDepth = 24;

            if (renderTextureL == null)
            {
                renderTextureL      = new RenderTexture(renderTextureLWidth, renderTextureLHeight, renderTextureDepth);
                renderTextureL.name = "Render Texture L";
            }
            if (renderTextureR == null)
            {
                renderTextureR      = new RenderTexture(renderTextureRWidth, renderTextureRHeight, renderTextureDepth);
                renderTextureR.name = "Render Texture R";
            }
            frameCameraL.targetTexture   = renderTextureL;
            frameCameraR.targetTexture   = renderTextureR;
            virtualCameraL.targetTexture = renderTextureL;
            virtualCameraR.targetTexture = renderTextureR;
            renderPlaneL.SetMainTexture(renderTextureL);
            renderPlaneR.SetMainTexture(renderTextureR);

            // After setting cameras' target texture,
            // set the vertical FOV of the frame cameras and the virtual cameras.
            frameCameraL.fieldOfView   = 2.0f * frameCameraLHalfVerticalFOV * Mathf.Rad2Deg;
            frameCameraR.fieldOfView   = 2.0f * frameCameraRHalfVerticalFOV * Mathf.Rad2Deg;
            virtualCameraL.fieldOfView = 2.0f * frameCameraLHalfVerticalFOV * Mathf.Rad2Deg;
            virtualCameraR.fieldOfView = 2.0f * frameCameraRHalfVerticalFOV * Mathf.Rad2Deg;

            // Move the frame cameras and the virtual cameras to the anchors.
            frameCameraL.transform.parent   = ViveSR_DualCameraRig.Instance.TrackedCameraLeft.Anchor;
            frameCameraR.transform.parent   = ViveSR_DualCameraRig.Instance.TrackedCameraRight.Anchor;
            virtualCameraL.transform.parent = ViveSR_DualCameraRig.Instance.TrackedCameraLeft.Anchor;
            virtualCameraR.transform.parent = ViveSR_DualCameraRig.Instance.TrackedCameraRight.Anchor;

            // Set the local transform of the frame cameras, the virtual cameras,
            // and the anchors to identity.
            SetLocalTransformToIdentity(frameCameraL.transform);
            SetLocalTransformToIdentity(frameCameraR.transform);
            SetLocalTransformToIdentity(virtualCameraL.transform);
            SetLocalTransformToIdentity(virtualCameraR.transform);
            SetLocalTransformToIdentity(ViveSR_DualCameraRig.Instance.TrackedCameraLeft.Anchor);
            SetLocalTransformToIdentity(ViveSR_DualCameraRig.Instance.TrackedCameraRight.Anchor);

            // Initialize the render planes.
            renderPlaneL.SetCameraIntrinsics(
                (float)renderTextureL.width,
                (float)renderTextureL.height,
                (float)renderTextureL.width * 0.5f,
                (float)renderTextureL.height * 0.5f,
                eyeCameraLFocalLength);
            renderPlaneR.SetCameraIntrinsics(
                (float)renderTextureR.width,
                (float)renderTextureR.height,
                (float)renderTextureR.width * 0.5f,
                (float)renderTextureR.height * 0.5f,
                eyeCameraRFocalLength);

            // Store the ViveSR dual camera rig display mode.
            previousDualCameraRigDisplayMode = ViveSR_DualCameraRig.Instance.Mode;

            if (framePoseCorrectionIsEnabled)
            {
                // Set up parent objects for the frame camera roots in order to
                // add local transforms on the camera poses.
                frameCameraLRoot = ViveSR_DualCameraRig.Instance.TrackedCameraLeft;
                frameCameraRRoot = ViveSR_DualCameraRig.Instance.TrackedCameraRight;
                if (frameCameraLRootShifter == null)
                {
                    frameCameraLRootShifter = new GameObject("TrackedCamera Shifter (Left)");
                }
                if (frameCameraRRootShifter == null)
                {
                    frameCameraRRootShifter = new GameObject("TrackedCamera Shifter (Right)");
                }
                frameCameraLRootShifter.transform.parent = ViveSR_DualCameraRig.Instance.transform;
                frameCameraRRootShifter.transform.parent = ViveSR_DualCameraRig.Instance.transform;
                frameCameraLRoot.transform.parent        = frameCameraLRootShifter.transform;
                frameCameraRRoot.transform.parent        = frameCameraRRootShifter.transform;

                // Calculate the transformation from the wrong poses to the correct poses.
                // They will be used to set the local transform of the camera pose shifters.
                var frameCameraLToFrameHeadMatrix = Matrix4x4.Translate(new Vector3(
                                                                            ViveSR_DualCameraImageCapture.OffsetHeadToCamera[0],
                                                                            ViveSR_DualCameraImageCapture.OffsetHeadToCamera[1],
                                                                            ViveSR_DualCameraImageCapture.OffsetHeadToCamera[2]));
                var frameCameraRToFrameHeadMatrix = Matrix4x4.Translate(new Vector3(
                                                                            ViveSR_DualCameraImageCapture.OffsetHeadToCamera[3],
                                                                            ViveSR_DualCameraImageCapture.OffsetHeadToCamera[4],
                                                                            ViveSR_DualCameraImageCapture.OffsetHeadToCamera[5]));
                wrongFrameCameraLToCorrectFrameCameraLMatrix =
                    frameCameraLToFrameHeadMatrix.inverse *
                    wrongFrameHeadToCorrectFrameHeadMatrix *
                    frameCameraLToFrameHeadMatrix;
                wrongFrameCameraRToCorrectFrameCameraRMatrix =
                    frameCameraRToFrameHeadMatrix.inverse *
                    wrongFrameHeadToCorrectFrameHeadMatrix *
                    frameCameraRToFrameHeadMatrix;
            }
        }