public virtual void ComputeViewMatrix() { double lat1 = _latitude.Degrees; double lon1 = _longitude.Degrees; EyeDiff.X = SMath.DegreesToRadians(_latitude.Degrees - lat1); EyeDiff.Y = SMath.DegreesToRadians(_longitude.Degrees - lon1); ReferenceCenter = SMath.SphericalToCartesianV3D( _latitude.Degrees, _longitude.Degrees, WorldRadius); if (World.Settings.Project == Projection.OrthoGraghics) { //lat1 = 0; //lon1 = 0; EyeDiff.X = 0; EyeDiff.Y = 0; } Vector3d defaultPosition = SMath.SphericalToCartesianV3D(lat1, lon1, _worldRadius); m_ViewMatrix = Matrix4d.LookAtRH( defaultPosition, Vector3d.Empty, cameraUpVector); //TODO JHJ 这是干什么的 有什么用 m_ViewMatrix *= Matrix4d.Translation(0, 0, _worldRadius); m_ViewMatrix *= Matrix4d.RotationYawPitchRoll(-EyeDiff.Y, EyeDiff.X, 0); m_ViewMatrix *= Matrix4d.Translation(0, 0, -_worldRadius); m_ViewMatrix *= Matrix4d.RotationYawPitchRoll( 0, -_tilt.Radians, this._heading.Radians); m_ViewMatrix *= Matrix4d.Translation(0, 0, (-this._distance)); if (World.Settings.Project == Projection.Perspective) { m_ViewMatrix *= Matrix4d.RotationZ(this._bank.Radians); } else { m_ViewMatrix *= Matrix4d.RotationZ(this._bank.Radians); } // Extract camera position Matrix4d cam = Matrix4d.Invert(m_ViewMatrix); _position = new Vector3d(cam[3, 0], cam[3, 1], cam[3, 2]); }
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; }