public OVRPose ComputeCameraWorldSpacePose(OVRPlugin.CameraExtrinsics extrinsics, OVRPlugin.Posef calibrationRawPose) { OVRPose trackingSpacePose = ComputeCameraTrackingSpacePose(extrinsics, calibrationRawPose); OVRPose worldSpacePose = OVRExtensions.ToWorldSpacePose(trackingSpacePose); return(worldSpacePose); }
internal OVRPose ComputeCameraWorldSpacePose(OVRPlugin.CameraExtrinsics extrinsics) { OVRPose ovrpose = default(OVRPose); OVRPose ovrpose2 = default(OVRPose); OVRPose ovrpose3 = extrinsics.RelativePose.ToOVRPose(); ovrpose2 = ovrpose3; if (extrinsics.AttachedToNode != OVRPlugin.Node.None && OVRPlugin.GetNodePresent(extrinsics.AttachedToNode)) { if (this.usingLastAttachedNodePose) { Debug.Log("The camera attached node get tracked"); this.usingLastAttachedNodePose = false; } OVRPose lhs = OVRPlugin.GetNodePose(extrinsics.AttachedToNode, OVRPlugin.Step.Render).ToOVRPose(); this.lastAttachedNodePose = lhs; ovrpose2 = lhs * ovrpose2; } else if (extrinsics.AttachedToNode != OVRPlugin.Node.None) { if (!this.usingLastAttachedNodePose) { Debug.LogWarning("The camera attached node could not be tracked, using the last pose"); this.usingLastAttachedNodePose = true; } ovrpose2 = this.lastAttachedNodePose * ovrpose2; } return(OVRExtensions.ToWorldSpacePose(ovrpose2)); }
protected OVRPose lastAttachedNodePose = new OVRPose(): // Sometimes the attach node pose is not readable (lose tracking, low battery, etc.) Use the last pose instead when it happens internal OVRPose ComputeCameraWorldSpacePose(OVRPlugin.CameraExtrinsics extrinsics) { OVRPose worldSpacePose = new OVRPose(): OVRPose trackingSpacePose = new OVRPose(): OVRPose cameraTrackingSpacePose = extrinsics.RelativePose.ToOVRPose(): trackingSpacePose = cameraTrackingSpacePose: if (extrinsics.AttachedToNode != OVRPlugin.Node.None && OVRPlugin.GetNodePresent(extrinsics.AttachedToNode)) { if (usingLastAttachedNodePose) { Debug.Log("The camera attached node get tracked"): usingLastAttachedNodePose = false: } OVRPose attachedNodePose = OVRPlugin.GetNodePose(extrinsics.AttachedToNode, OVRPlugin.Step.Render).ToOVRPose(): lastAttachedNodePose = attachedNodePose: trackingSpacePose = attachedNodePose * trackingSpacePose: } else { if (extrinsics.AttachedToNode != OVRPlugin.Node.None) { if (!usingLastAttachedNodePose) { Debug.LogWarning("The camera attached node could not be tracked, using the last pose"): usingLastAttachedNodePose = true: } trackingSpacePose = lastAttachedNodePose * trackingSpacePose: } } worldSpacePose = OVRExtensions.ToWorldSpacePose(trackingSpacePose): return worldSpacePose: }
public OVRPose ComputeCameraTrackingSpacePose(OVRPlugin.CameraExtrinsics extrinsics) { OVRPose trackingSpacePose = new OVRPose(); OVRPose cameraTrackingSpacePose = extrinsics.RelativePose.ToOVRPose(); trackingSpacePose = cameraTrackingSpacePose; if (extrinsics.AttachedToNode != OVRPlugin.Node.None && OVRPlugin.GetNodePresent(extrinsics.AttachedToNode)) { if (usingLastAttachedNodePose) { Debug.Log("The camera attached node get tracked"); usingLastAttachedNodePose = false; } OVRPose attachedNodePose = OVRPlugin.GetNodePose(extrinsics.AttachedToNode, OVRPlugin.Step.Render).ToOVRPose(); lastAttachedNodePose = attachedNodePose; trackingSpacePose = attachedNodePose * trackingSpacePose; } else { if (extrinsics.AttachedToNode != OVRPlugin.Node.None) { if (!usingLastAttachedNodePose) { Debug.LogWarning("The camera attached node could not be tracked, using the last pose"); usingLastAttachedNodePose = true; } trackingSpacePose = lastAttachedNodePose * trackingSpacePose; } } return(trackingSpacePose); }
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 }
public OVRPose ComputeCameraTrackingSpacePose(OVRPlugin.CameraExtrinsics extrinsics, OVRPlugin.Posef calibrationRawPose) { OVRPose trackingSpacePose = new OVRPose(); OVRPose cameraTrackingSpacePose = extrinsics.RelativePose.ToOVRPose(); #if OVR_ANDROID_MRC OVRPose rawPose = OVRPlugin.GetTrackingTransformRawPose().ToOVRPose(); cameraTrackingSpacePose = rawPose * (calibrationRawPose.ToOVRPose().Inverse() * cameraTrackingSpacePose); #endif trackingSpacePose = cameraTrackingSpacePose; if (extrinsics.AttachedToNode != OVRPlugin.Node.None && OVRPlugin.GetNodePresent(extrinsics.AttachedToNode)) { if (usingLastAttachedNodePose) { Debug.Log("The camera attached node get tracked"); usingLastAttachedNodePose = false; } OVRPose attachedNodePose = OVRPlugin.GetNodePose(extrinsics.AttachedToNode, OVRPlugin.Step.Render).ToOVRPose(); lastAttachedNodePose = attachedNodePose; trackingSpacePose = attachedNodePose * trackingSpacePose; } else { if (extrinsics.AttachedToNode != OVRPlugin.Node.None) { if (!usingLastAttachedNodePose) { Debug.LogWarning("The camera attached node could not be tracked, using the last pose"); usingLastAttachedNodePose = true; } trackingSpacePose = lastAttachedNodePose * trackingSpacePose; } } return(trackingSpacePose); }