Example #1
0
        /// <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.");
        }
Example #2
0
 public static global::SharpDX.Matrix Inverted(this global::SharpDX.Matrix m)
 {
     m.Invert();
     return(m);
 }