Ejemplo n.º 1
0
        /// <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);
                }
            }
        }
Ejemplo n.º 2
0
        /// <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();
        }
Ejemplo n.º 3
0
        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;
            }
        }