public virtual void Update(Device device) { this.viewPort = device.Viewport; Vector3d p = Quaternion4d.QuaternionToEulerV3D(m_Orientation); if (!double.IsNaN(p.Y)) { this._latitude.Radians = p.Y; } if (!double.IsNaN(p.X)) { this._longitude.Radians = p.X; } if (!double.IsNaN(p.Z)) { this._heading.Radians = p.Z; } m_Orientation = Quaternion4d.EulerToQuaternion(_longitude.Radians, _latitude.Radians, _heading.Radians); ComputeProjectionMatrix(viewPort); ComputeViewMatrix(); Matrix proh = (Matrix)ConvertDX.FromMatrix4d(m_ProjectionMatrix); device.Transform.Projection = proh; device.Transform.View = (Matrix)ConvertDX.FromMatrix4d(m_ViewMatrix); //TODO JHJ 默认就是单位矩阵 //device.Transform.World = (Matrix)ConvertDX.FromMatrix4d(m_WorldMatrix); ViewFrustum.Update( Matrix4d.Multiply(m_WorldMatrix, Matrix4d.Multiply(m_ViewMatrix, m_ProjectionMatrix))); // Old view range (used in quadtile logic) double factor = (this._altitude) / this._worldRadius; if (factor > 1) { viewRange = Angle.FromRadians(Math.PI); } else { viewRange = Angle.FromRadians(Math.Abs(Math.Asin((this._altitude) / this._worldRadius)) * 2); } // True view range if (factor < 1) { trueViewRange = Angle.FromRadians(Math.Abs(Math.Asin((this._distance) / this._worldRadius)) * 2); } else { trueViewRange = Angle.FromRadians(Math.PI); } }
public void Unproject(object viewport, Matrix4d projection, Matrix4d view, Matrix4d world) { //Microsoft.DirectX.Vector3 test = ConvertDX.FromVector3d(this); //test.Unproject(viewport, ConvertDX.FromMatrix4d(projection), ConvertDX.FromMatrix4d(view), ConvertDX.FromMatrix4d(world)); Viewport2d vp = ConvertDX.ToViewport2d((Microsoft.DirectX.Direct3D.Viewport)viewport); // Convert from viewport coordinates this.X = (this.X - vp.X) / vp.Width; this.Y = (vp.Height + vp.Y - this.Y) / vp.Height; // Make x/y range from -1 to 1 this.X = this.X * 2.0 - 1.0; this.Y = this.Y * 2.0 - 1.0; Matrix4d m = Matrix4d.Invert(world * view * projection); double w = 1.0; MultiplyMatrix(m, ref w); this.X /= w; this.Y /= w; this.Z /= w; }
public void Project(object viewport, Matrix4d projection, Matrix4d view, Matrix4d world) { //Microsoft.DirectX.Vector3 test = ConvertDX.FromVector3d(this); //test.Project(viewport, ConvertDX.FromMatrix4d(projection), ConvertDX.FromMatrix4d(view), ConvertDX.FromMatrix4d(world)); Viewport2d vp = ConvertDX.ToViewport2d((Microsoft.DirectX.Direct3D.Viewport)viewport); Matrix4d m = world * view * projection; double w = 1.0; MultiplyMatrix(m, ref w); this.X /= w; this.Y /= w; this.Z /= w; // Make x/y range from 0 to 1 this.X = this.X * 0.5 + 0.5; this.Y = this.Y * 0.5 + 0.5; // Convert to to viewport coordinates (Y is inverted) this.X = this.X * vp.Width + vp.X; this.Y = vp.Height - this.Y * vp.Height + vp.Y; }
public static Matrix4d OrthoRH(float width, float height, float znearPlane, float zfarPlane) { Matrix4d test = ConvertDX.ToMatrix4d(Microsoft.DirectX.Matrix.OrthoRH(width, height, znearPlane, zfarPlane)); return(test); }