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 static Matrix4d operator *(Matrix4d left, Matrix4d right) { return(Matrix4d.Multiply(left, right)); }