public static Viewport FromViewport2d(Viewport2d v) { Viewport ret = new Viewport(); ret.Height = v.Height; ret.MaxZ = (float)v.MaxZ; ret.MinZ = (float)v.MinZ; ret.Width = v.Width; ret.X = v.X; ret.Y = v.Y; return(ret); }
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 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; }