private Vector3 Unproject(Vector3 mouse, int width, int height) { if (modelview == Matrix4.Zero || projection == Matrix4.Zero) { return(Vector3.Zero); } Vector4 vec; vec.X = 2.0f * mouse.X / (float)width - 1; vec.Y = -(2.0f * mouse.Y / (float)height - 1); vec.Z = mouse.Z; vec.W = 1.0f; Matrix4 viewInv = Matrix4.Invert(modelview); Matrix4 projInv = Matrix4.Invert(projection); Vector4.Transform(ref vec, ref projInv, out vec); Vector4.Transform(ref vec, ref viewInv, out vec); if (vec.W > float.Epsilon || vec.W < -float.Epsilon) { vec.X /= vec.W; vec.Y /= vec.W; vec.Z /= vec.W; } return(new Vector3(vec.X, vec.Y, vec.Z)); }
private Vector3 ClickToWorld(Vector2 p) { var vec = new Vector4( p.X / (float)this.Width * 2f - 1f, -(p.Y / (float)this.Height * 2f - 1f), 0f, 1f); var viewInv = Matrix4.Invert(modelview); var projInv = Matrix4.Invert(projection); Vector4.Transform(ref vec, ref projInv, out vec); Vector4.Transform(ref vec, ref viewInv, out vec); return(new Vector3(vec.X, vec.Y, vec.Z)); }