Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
 public static Matrix4d operator *(Matrix4d left, Matrix4d right)
 {
     return(Matrix4d.Multiply(left, right));
 }