Exemplo 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);
            }
        }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
        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);
        }