示例#1
0
        void project_to_target()
        {
            PolyCurveSO sourceSO = targets[0];
            DCurve3     curve    = sourceSO.Curve;
            int         N        = curve.VertexCount;

            for (int i = 0; i < N; ++i)
            {
                Vector3f v  = (Vector3f)curve[i];
                Vector3f vW = SceneTransforms.TransformTo(v, sourceSO, CoordSpace.ObjectCoords, CoordSpace.WorldCoords);
                vW       = (Vector3f)ProjectionTarget.Project(vW);
                curve[i] = SceneTransforms.TransformTo(vW, sourceSO, CoordSpace.WorldCoords, CoordSpace.ObjectCoords);
            }
        }
示例#2
0
        /// <summary>
        /// This computes projected position w/ proper constraints/etc.
        /// Does not modify mesh.
        /// </summary>
        protected virtual Vector3d ComputeProjectedVertexPos(int vID, out bool bModified)
        {
            bModified = false;

            if (vertex_is_constrained(vID))
            {
                return(Mesh.GetVertex(vID));
            }
            if (VertexControlF != null && (VertexControlF(vID) & VertexControl.NoProject) != 0)
            {
                return(Mesh.GetVertex(vID));
            }

            Vector3d curpos    = mesh.GetVertex(vID);
            Vector3d projected = ProjectionTarget.Project(curpos, vID);

            bModified = true;
            return(projected);
        }
示例#3
0
 public static Vector4 Project(Matrix4 viewMatrix, Matrix4 projectionMatrix, Vector3 viewportCoordinates, Rectangle viewport, ProjectionTarget projectionTarget = ProjectionTarget.World)
 {
     return(Project(ref viewMatrix, ref projectionMatrix, ref viewportCoordinates, viewport, projectionTarget));
 }
示例#4
0
        public static Vector4 Project(ref Matrix4 viewMatrix, ref Matrix4 projectionMatrix, ref Vector3 viewportCoordinates, Rectangle viewport, ProjectionTarget projectionTarget = ProjectionTarget.World)
        {
            // Calculate 'Normalised Device Coordinates'
            // Range: x, y, z [-1:1]
            var x = (2.0f * viewportCoordinates.X) / viewport.Width - 1.0f;
            var y = 1.0f - (2.0f * viewportCoordinates.Y) / viewport.Height;
            var z = viewportCoordinates.Z;

            var normalisedDeviceCoordinates = new Vector3(x, y, z);

            // Calculate Homogenous Clip Coordinates
            // Range: x, y, z, w [-1:1]
            var homogenousClipCoordinates = new Vector4(normalisedDeviceCoordinates.X, normalisedDeviceCoordinates.Y, normalisedDeviceCoordinates.Z, 1.0f);

            if (projectionTarget == ProjectionTarget.Clip)
            {
                return(homogenousClipCoordinates);
            }

            // Calculate View Coordinates
            var     viewCoordinates = default(Vector4);
            Matrix4 inverseProjectionMatrix;

            Matrix4.Invert(ref projectionMatrix, out inverseProjectionMatrix);
            Vector4.Transform(ref homogenousClipCoordinates, ref inverseProjectionMatrix, out viewCoordinates);
            //viewCoordinates = new Vector4(viewCoordinates.X, viewCoordinates.Y, homogenousClipCoordinates.Z, 0.0f);

            if (projectionTarget == ProjectionTarget.View)
            {
                return(viewCoordinates);
            }

            // Calculate World Coordinates
            var     worldCoordinate = default(Vector4);
            Matrix4 inverseViewMatrix;

            Matrix4.Invert(ref viewMatrix, out inverseViewMatrix);
            Vector4.Transform(ref viewCoordinates, ref inverseViewMatrix, out worldCoordinate);

            if (projectionTarget == ProjectionTarget.WorldHomogenous)
            {
                return(worldCoordinate);
            }

            var perspectiveDivisor = 1.0f / worldCoordinate.W;

            worldCoordinate.X *= perspectiveDivisor;
            worldCoordinate.Y *= perspectiveDivisor;
            worldCoordinate.Z *= perspectiveDivisor;
            worldCoordinate.W *= perspectiveDivisor;

            return(worldCoordinate);
        }
示例#5
0
        public static Vector4 Project(Matrix4 viewMatrix, Matrix4 projectionMatrix, Vector2 viewportCoordinates, float depth, Rectangle viewport, ProjectionTarget projectionTarget = ProjectionTarget.World)
        {
            var viewportNormalisedCoordinates = new Vector3(viewportCoordinates.X, viewportCoordinates.Y, depth);

            return(Project(ref viewMatrix, ref projectionMatrix, ref viewportNormalisedCoordinates, viewport, projectionTarget));
        }
示例#6
0
 public static Vector3 UnProject(this Camera camera, Vector3 worldCoordinates, ProjectionTarget projectionTarget = ProjectionTarget.NormalisedDeviceCoordinates)
 {
     return(Maths.UnProject(camera.ViewProjectionMatrix, worldCoordinates, (Rectangle)camera.Viewport, projectionTarget));
 }
示例#7
0
        public static Vector3 UnProject(Matrix4 viewProjectionMatrix, Vector3 worldCoordinates, Rectangle viewport, ProjectionTarget projectionTarget = ProjectionTarget.NormalisedDeviceCoordinates)
        {
            var normalisedCoordinate = new Vector4(worldCoordinates, 1);
            var matrix = viewProjectionMatrix;

            var screenCoordinates = Vector4.Transform(normalisedCoordinate, matrix);

            screenCoordinates.X /= screenCoordinates.W;
            screenCoordinates.Y /= screenCoordinates.W;
            screenCoordinates.Z /= screenCoordinates.W;
            screenCoordinates.W /= screenCoordinates.W;

            screenCoordinates.Z = -1;

            if (projectionTarget == ProjectionTarget.NormalisedDeviceCoordinates)
            {
                return(new Vector3(screenCoordinates.X, screenCoordinates.Y, screenCoordinates.Z));
            }

            var halfWidth  = viewport.Width / 2;
            var halfHeight = viewport.Height / 2;

            var x = screenCoordinates.X * halfWidth + halfWidth;
            var y = -screenCoordinates.Y * halfHeight + halfHeight;
            var z = screenCoordinates.Z;

            return(new Vector3(x, y, z));
        }
示例#8
0
 public static Vector3 Project(this Camera camera, Vector2 viewportCoordinates, float depth, ProjectionTarget projectionTarget = ProjectionTarget.World)
 {
     //  map depth to -1 to 1
     depth = Maths.Clamp <float>(depth, 0, 1) * 2 - 1;
     return(Project(camera.ViewMatrix, camera.ProjectionMatrix, new Vector3(viewportCoordinates.X, viewportCoordinates.Y, depth), (Rectangle)camera.Viewport, projectionTarget).Xyz);
 }
示例#9
0
 public T WithDefaultMemberTarget(ProjectionTarget defaultMemberTarget)
 {
     DefaultMemberTarget = defaultMemberTarget;
     return((T)this);
 }