void UpdateDefaultExternalCamera()
    {
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC
        // always build a 1080p external camera
        const int   cameraPixelWidth  = 1920;
        const int   cameraPixelHeight = 1080;
        const float cameraAspect      = (float)cameraPixelWidth / cameraPixelHeight;


        string cameraName = "UnityExternalCamera";
        OVRPlugin.CameraIntrinsics cameraIntrinsics = new OVRPlugin.CameraIntrinsics();
        OVRPlugin.CameraExtrinsics cameraExtrinsics = new OVRPlugin.CameraExtrinsics();

        // intrinsics

        cameraIntrinsics.IsValid = OVRPlugin.Bool.True;
        cameraIntrinsics.LastChangedTimeSeconds = Time.time;

        float          vFov = defaultExternalCamera.fieldOfView * Mathf.Deg2Rad;
        float          hFov = Mathf.Atan(Mathf.Tan(vFov * 0.5f) * cameraAspect) * 2.0f;
        OVRPlugin.Fovf fov  = new OVRPlugin.Fovf();
        fov.UpTan   = fov.DownTan = Mathf.Tan(vFov * 0.5f);
        fov.LeftTan = fov.RightTan = Mathf.Tan(hFov * 0.5f);

        cameraIntrinsics.FOVPort = fov;
        cameraIntrinsics.VirtualNearPlaneDistanceMeters = defaultExternalCamera.nearClipPlane;
        cameraIntrinsics.VirtualFarPlaneDistanceMeters  = defaultExternalCamera.farClipPlane;
        cameraIntrinsics.ImageSensorPixelResolution.w   = cameraPixelWidth;
        cameraIntrinsics.ImageSensorPixelResolution.h   = cameraPixelHeight;

        // extrinsics

        cameraExtrinsics.IsValid = OVRPlugin.Bool.True;
        cameraExtrinsics.LastChangedTimeSeconds = Time.time;
        cameraExtrinsics.CameraStatusData       = OVRPlugin.CameraStatus.CameraStatus_Calibrated;
        cameraExtrinsics.AttachedToNode         = OVRPlugin.Node.None;

        Camera       mainCamera = Camera.main;
        OVRCameraRig cameraRig  = mainCamera.GetComponentInParent <OVRCameraRig>();
        if (cameraRig)
        {
            Transform trackingSpace     = cameraRig.trackingSpace;
            OVRPose   trackingSpacePose = trackingSpace.ToOVRPose(false);
            OVRPose   cameraPose        = defaultExternalCamera.transform.ToOVRPose(false);
            OVRPose   relativePose      = trackingSpacePose.Inverse() * cameraPose;
            cameraExtrinsics.RelativePose = relativePose.ToPosef();
        }
        else
        {
            cameraExtrinsics.RelativePose = OVRPlugin.Posef.identity;
        }

        if (!OVRPlugin.SetDefaultExternalCamera(cameraName, ref cameraIntrinsics, ref cameraExtrinsics))
        {
            Debug.LogError("SetDefaultExternalCamera() failed");
        }
#endif
    }
예제 #2
0
    void Initialize()
    {
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC
        if (inited)
        {
            return;
        }

#if OVR_ANDROID_MRC
        if (!OVRPlugin.Media.GetInitialized())
        {
            return;
        }
#else
        if (!OVRPlugin.IsMixedRealityInitialized())
        {
            return;
        }
#endif

        OVRPlugin.ResetDefaultExternalCamera();
        Debug.LogFormat("GetExternalCameraCount before adding manual external camera {0}", OVRPlugin.GetExternalCameraCount());
        UpdateDefaultExternalCamera();
        Debug.LogFormat("GetExternalCameraCount after adding manual external camera {0}", OVRPlugin.GetExternalCameraCount());

        // obtain default FOV
        {
            OVRPlugin.CameraIntrinsics cameraIntrinsics;
            OVRPlugin.CameraExtrinsics cameraExtrinsics;
            OVRPlugin.GetMixedRealityCameraInfo(0, out cameraExtrinsics, out cameraIntrinsics);
            defaultFov = cameraIntrinsics.FOVPort;
        }

        inited = true;
#if OVR_ANDROID_MRC
        readyToSwitch = true;
#endif
#endif
    }
    // Update is called once per frame
    void Update()
    {
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC
        if (!inited)
        {
            Initialize();
            return;
        }

        if (!defaultExternalCamera)
        {
            return;
        }

#if OVR_ANDROID_MRC
        if (!OVRPlugin.Media.GetInitialized())
        {
            return;
        }
#else
        if (!OVRPlugin.IsMixedRealityInitialized())
        {
            return;
        }
#endif

        if (OVRInput.GetDown(OVRInput.Button.One))
        {
            if (currentMode == CameraMode.ThirdPerson)
            {
                currentMode = CameraMode.Normal;
            }
            else
            {
                currentMode = currentMode + 1;
            }

            Debug.LogFormat("Camera mode change to {0}", currentMode);
        }

        if (currentMode == CameraMode.Normal)
        {
            UpdateDefaultExternalCamera();
            OVRPlugin.OverrideExternalCameraFov(0, false, new OVRPlugin.Fovf());
            OVRPlugin.OverrideExternalCameraStaticPose(0, false, OVRPlugin.Posef.identity);
        }
        else if (currentMode == CameraMode.OverrideFov)
        {
            OVRPlugin.Fovf fov    = defaultFov;
            OVRPlugin.Fovf newFov = new OVRPlugin.Fovf();
            newFov.LeftTan  = fov.LeftTan * 2.0f;
            newFov.RightTan = fov.RightTan * 2.0f;
            newFov.UpTan    = fov.UpTan * 2.0f;
            newFov.DownTan  = fov.DownTan * 2.0f;

            OVRPlugin.OverrideExternalCameraFov(0, true, newFov);
            OVRPlugin.OverrideExternalCameraStaticPose(0, false, OVRPlugin.Posef.identity);

            if (!OVRPlugin.GetUseOverriddenExternalCameraFov(0))
            {
                Debug.LogWarning("FOV not overridden");
            }
        }
        else if (currentMode == CameraMode.ThirdPerson)
        {
            Camera camera = GetComponent <Camera>();
            if (camera == null)
            {
                return;
            }

            float          vFov = camera.fieldOfView * Mathf.Deg2Rad;
            float          hFov = Mathf.Atan(Mathf.Tan(vFov * 0.5f) * camera.aspect) * 2.0f;
            OVRPlugin.Fovf fov  = new OVRPlugin.Fovf();
            fov.UpTan   = fov.DownTan = Mathf.Tan(vFov * 0.5f);
            fov.LeftTan = fov.RightTan = Mathf.Tan(hFov * 0.5f);
            OVRPlugin.OverrideExternalCameraFov(0, true, fov);

            Camera       mainCamera = Camera.main;
            OVRCameraRig cameraRig  = mainCamera.GetComponentInParent <OVRCameraRig>();
            if (cameraRig)
            {
                Transform       trackingSpace     = cameraRig.trackingSpace;
                OVRPose         trackingSpacePose = trackingSpace.ToOVRPose(false);
                OVRPose         cameraPose        = transform.ToOVRPose(false);
                OVRPose         relativePose      = trackingSpacePose.Inverse() * cameraPose;
                OVRPlugin.Posef relativePosef     = relativePose.ToPosef();
                OVRPlugin.OverrideExternalCameraStaticPose(0, true, relativePosef);
            }
            else
            {
                OVRPlugin.OverrideExternalCameraStaticPose(0, false, OVRPlugin.Posef.identity);
            }

            if (!OVRPlugin.GetUseOverriddenExternalCameraFov(0))
            {
                Debug.LogWarning("FOV not overridden");
            }

            if (!OVRPlugin.GetUseOverriddenExternalCameraStaticPose(0))
            {
                Debug.LogWarning("StaticPose not overridden");
            }
        }
#endif
    }