123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- #if UNITY_ANDROID && !UNITY_EDITOR
- #define OVR_ANDROID_MRC
- #endif
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class OVRMixedRealityCaptureTest : MonoBehaviour {
- bool inited = false;
- enum CameraMode
- {
- Normal = 0,
- OverrideFov,
- ThirdPerson,
- }
- CameraMode currentMode = CameraMode.Normal;
- public Camera defaultExternalCamera;
- OVRPlugin.Fovf defaultFov;
- // Use this for initialization
- void Start () {
- #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || OVR_ANDROID_MRC
- if (!defaultExternalCamera)
- {
- Debug.LogWarning("defaultExternalCamera undefined");
- }
- #if !OVR_ANDROID_MRC
- // On Quest, we enable MRC automatically through the configuration
- if (!OVRManager.instance.enableMixedReality)
- {
- OVRManager.instance.enableMixedReality = true;
- }
- #endif
- #endif
- }
- 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.Posef calibrationRawPose;
- OVRPlugin.GetMixedRealityCameraInfo(0, out cameraExtrinsics, out cameraIntrinsics, out calibrationRawPose);
- defaultFov = cameraIntrinsics.FOVPort;
- }
- inited = true;
- #endif
- }
- 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
- }
- // 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
- }
- }
|