public Vector3d TransformPickPointToWorldSpace(Vector2d ptCursor, double backBufferWidth, double backBufferHeight) { Vector3d vPickRayOrig; Vector3d vPickRayDir; Vector3d v = new Vector3d(); v.X = (((2.0f * ptCursor.X) / backBufferWidth) - 1) / (RenderContext.Projection.M11);// / (backBufferWidth / 2)); v.Y = (((2.0f * ptCursor.Y) / backBufferHeight) - 1) / (RenderContext.Projection.M22);// / (backBufferHeight / 2)); v.Z = 1.0f; Matrix3d m = Matrix3d.MultiplyMatrix(RenderContext.View, RenderContext.World); m.Invert(); vPickRayDir = new Vector3d(); vPickRayOrig = new Vector3d(); // Transform the screen space pick ray into 3D space vPickRayDir.X = v.X * m.M11 + v.Y * m.M21 + v.Z * m.M31; vPickRayDir.Y = v.X * m.M12 + v.Y * m.M22 + v.Z * m.M32; vPickRayDir.Z = v.X * m.M13 + v.Y * m.M23 + v.Z * m.M33; vPickRayDir.Normalize(); return vPickRayDir; }
public static Vector2d GetUVFromInnerPoint(Vector3d ul, Vector3d ur, Vector3d ll, Vector3d lr, Vector3d pnt) { ul.Normalize(); ur.Normalize(); ll.Normalize(); lr.Normalize(); pnt.Normalize(); double dUpper = LineToPoint(ul, ur, pnt); double dLower = LineToPoint(ll, lr, pnt); double dVert = dUpper + dLower; double dRight = LineToPoint(ur, lr, pnt); double dLeft = LineToPoint(ul, ll, pnt); double dHoriz = dRight + dLeft; return Vector2d.Create(dLeft / dHoriz, dUpper / dVert); }
private bool IsLeftOfHalfSpace(Vector3d pntA, Vector3d pntB, Vector3d pntTest) { pntA.Normalize(); pntB.Normalize(); Vector3d cross = Vector3d.Cross(pntA, pntB); double dot = Vector3d.Dot(cross, pntTest); return dot > 0; }
public void MakeNormal() { Vector3d a = A.Position.Copy(); Vector3d b = B.Position.Copy(); Vector3d c = C.Position.Copy(); a.Normalize(); b.Normalize(); c.Normalize(); double x = a.X + b.X + c.X; double y = a.Y + b.Y + c.Y; double z = a.Z + b.Z + c.Z; Normal = Vector3d.Create(x / 3, y / 3, z / 3); Normal.Normalize(); }