/// <summary> /// OVRRender renderer /// </summary> protected override void Render() { int currentIndex = 0; if (this.IsConnected) { OVR.FrameTiming frameTiming = this.Hmd.GetFrameTiming(0); OVR.TrackingState trackingState = this.Hmd.GetTrackingState(frameTiming.DisplayMidpointSeconds); // Calculate the position and orientation of each eye. this.Oculus.CalcEyePoses(trackingState.HeadPose.ThePose, this.hmdToEyeViewOffsets, ref this.oculusEyePoses); trackingState.CameraPose.Position.ToVector3(out this.trackerCameraPose.Position); trackingState.CameraPose.Orientation.ToQuaternion(out this.trackerCameraPose.Orientation); currentIndex = this.eyeSwapTextureSet.CurrentIndex++; for (int eyeIndex = 0; eyeIndex < 2; eyeIndex++) { this.oculusEyePoses[eyeIndex].Position.ToVector3(out this.eyePoses[eyeIndex].Position); this.oculusEyePoses[eyeIndex].Orientation.ToQuaternion(out this.eyePoses[eyeIndex].Orientation); this.eyeTextures[eyeIndex].RenderTarget = (this.msaaSampleCount > 1) ? this.msaaRenderTarget : this.swapRenderTargets[currentIndex]; // Get eye projection OVR.ovrMatrix4f_Projection(this.eyeTextures[eyeIndex].FieldOfView, this.eyeTextures[eyeIndex].NearPlane, this.eyeTextures[eyeIndex].FarPlane, OVR.ProjectionModifier.RightHanded).ToMatrix(out this.eyePoses[eyeIndex].Projection); this.layerEyeFov.RenderPose[eyeIndex] = this.oculusEyePoses[eyeIndex]; } // Calc central position Vector3.Lerp(ref this.eyePoses[0].Position, ref this.eyePoses[1].Position, 0.5f, out this.eyePoses[2].Position); Quaternion.Lerp(ref this.eyePoses[0].Orientation, ref this.eyePoses[1].Orientation, 0.5f, out this.eyePoses[2].Orientation); } base.Render(); if (this.IsConnected) { if (this.msaaSampleCount > 1) { var rtManager = this.adapter.Graphics.RenderTargetManager as RenderTargetManager; var dxRt = rtManager.TargetFromHandle <DXRenderTarget>(this.msaaRenderTarget.TextureHandle); var dxSwapRt = rtManager.TargetFromHandle <DXRenderTarget>(this.swapRenderTargets[currentIndex].TextureHandle); this.context.ResolveSubresource(dxRt.Target, 0, dxSwapRt.Target, 0, Format.R8G8B8A8_UNorm_SRgb); } // Submit frame to HMD this.Hmd.SubmitFrame(0, this.ovrLayers); if (this.ShowHMDMirrorTexture) { // Show mirror texture into BackBuffer this.device.ImmediateContext.CopyResource(this.mirrorTexture, this.backBuffer); } } }
/// <summary> /// /// </summary> public override void Prepare() { double displayMidpoint = hmd.GetPredictedDisplayTime(frameIndex); OVR.TrackingState trackingState = hmd.GetTrackingState(displayMidpoint); eyePoses = new OVR.Posef[2]; ////////////////// Get Eye poses ////////////////////////////////////////////////////////////////////////// var leftEyeRenderDesc = hmd.GetRenderDesc(OVR.EyeType.Left, hmd.DefaultEyeFov[0]); var rightEyeRenderDesc = hmd.GetRenderDesc(OVR.EyeType.Right, hmd.DefaultEyeFov[1]); var eyeRenderDescs = new [] { leftEyeRenderDesc, rightEyeRenderDesc }; OVR.Vector3f[] hmdToEyeOffset = { leftEyeRenderDesc.HmdToEyeOffset, rightEyeRenderDesc.HmdToEyeOffset }; hmd.GetEyePoses(frameIndex, 1, hmdToEyeOffset, eyePoses, out sampleTime); /////////////////////////////////////////////////////////////////////////////////////////////////////////// var left = new OculusRiftSensors.Eye { Position = eyePoses[0].Position.ToVector3(), Rotation = eyePoses[0].Orientation.ToQuaternion(), }; var right = new OculusRiftSensors.Eye { Position = eyePoses[1].Position.ToVector3(), Rotation = eyePoses[1].Orientation.ToQuaternion(), }; var leftProj = oculus.Matrix4f_Projection(eyeRenderDescs[0].Fov, 0.1f, 1000.0f, OVR.ProjectionModifier.None).ToMatrix(); leftProj.Transpose(); var rightProj = oculus.Matrix4f_Projection(eyeRenderDescs[1].Fov, 0.1f, 1000.0f, OVR.ProjectionModifier.None).ToMatrix(); rightProj.Transpose(); left.Projection = leftProj; right.Projection = rightProj; OculusRiftSensors.LeftEye = left; OculusRiftSensors.RightEye = right; OculusRiftSensors.HeadPosition = trackingState.HeadPose.ThePose.Position.ToVector3(); OculusRiftSensors.HeadRotation = trackingState.HeadPose.ThePose.Orientation.ToQuaternion(); }
public static void StartTracking(RhinoDoc rhinoDocument) { OVR.TrackingState trackingState = OculusTracking._hmd.GetTrackingState(0.0); Transform rollPitchYaw = OculusTracking.Matrix(new Quaternion((double)trackingState.HeadPose.ThePose.Orientation.W, (double)trackingState.HeadPose.ThePose.Orientation.X, (double)trackingState.HeadPose.ThePose.Orientation.Y, (double)trackingState.HeadPose.ThePose.Orientation.Z)); Transform plane = Transform.PlaneToPlane(Plane.WorldZX, Plane.WorldXY); OculusTracking._startPos = UserInput.StartPos; UserInput.MovementAndOrientation(ref OculusTracking._startPos, ref OculusTracking._startDir, rollPitchYaw, plane, rhinoDocument); OVR.Posef[] outEyePoses = new OVR.Posef[2]; OculusTracking._oculus.CalcEyePoses(trackingState.HeadPose.ThePose, OculusTracking._hmdToEyeViewOffsets, ref outEyePoses); for (int index = 0; index < 2; ++index) { Point3d point3d1; point3d1 = new Point3d((double)outEyePoses[index].Position.X, (double)outEyePoses[index].Position.Y, (double)outEyePoses[index].Position.Z); Transform transform = OculusTracking.Matrix(new Quaternion((double)outEyePoses[index].Orientation.W, (double)outEyePoses[index].Orientation.X, (double)outEyePoses[index].Orientation.Y, (double)outEyePoses[index].Orientation.Z)); Vector3d vector3d1 = (OculusTracking._startDir * (plane * (transform * new Vector3d(0.0, 0.0, -1.0)))); Vector3d vector3d2 = (OculusTracking._startDir * (plane * (transform * new Vector3d(0.0, 1.0, 0.0)))); Point3d point3d2 = (OculusTracking._startPos + (OculusTracking._startDir * (plane * point3d1))); OculusTracking._camLoc[index] = point3d2; OculusTracking._camDir[index] = vector3d1; OculusTracking._camUp[index] = vector3d2; } }