/// <summary> /// Un-projects a 2D screen point. /// </summary> /// <param name="viewport">The viewport.</param> /// <param name="pointIn">The input point.</param> /// <param name="pointNear">The point at the near clipping plane.</param> /// <param name="pointFar">The point at the far clipping plane.</param> /// <returns>The ray.</returns> public static Ray UnProject(this Viewport3DX viewport, Vector2 point2d)//, out Vector3 pointNear, out Vector3 pointFar) { var camera = viewport.Camera as ProjectionCamera; if (camera != null) { var p = new Vector3((float)point2d.X, (float)point2d.Y, 1); //var wvp = GetViewProjectionMatrix(viewport); //Vector3 r = Vector3.Unproject(p, 0f, 0f, (float)viewport.ActualWidth, (float)viewport.ActualHeight, 0f, 1f, wvp); //r.Normalize(); var vp = GetScreenViewProjectionMatrix(viewport); var vpi = Matrix.Invert(vp); Vector3 zn, zf; p.Z = 0; Vector3.TransformCoordinate(ref p, ref vpi, out zn); p.Z = 1; Vector3.TransformCoordinate(ref p, ref vpi, out zf); Vector3 r = zf - zn; r.Normalize(); if (camera is PerspectiveCamera) { return(new Ray(camera.Position.ToVector3(), r)); } else if (camera is OrthographicCamera) { return(new Ray(zn, r)); } } throw new HelixToolkitException("Unproject camera error."); }
public static global::SharpDX.Matrix Inverted(this global::SharpDX.Matrix m) { m.Invert(); return(m); }