public static bool WorldToScreenRel(Vector3 entityPosition, out Vector2 screenCoords) { var mView = Util.GetCameraMatrix(); mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var result = new SharpDX.Vector3(0, 0, 0); result.Z = (vForward.X * entityPosition.X) + (vForward.Y * entityPosition.Y) + (vForward.Z * entityPosition.Z) + vForward.W; result.X = (vRight.X * entityPosition.X) + (vRight.Y * entityPosition.Y) + (vRight.Z * entityPosition.Z) + vRight.W; result.Y = (vUpward.X * entityPosition.X) + (vUpward.Y * entityPosition.Y) + (vUpward.Z * entityPosition.Z) + vUpward.W; if (result.Z < 0.001f) { screenCoords = new Vector2(0, 0); return(false); } float invw = 1.0f / result.Z; result.X *= invw; result.Y *= invw; screenCoords = new Vector2(result.X, -result.Y); return(true); }
public static bool WorldToScreenRel(Vector3 entityPosition, out Vector2 screenCoords) { var mView = ScriptHookExtensions.GetCameraMatrix(); mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var result = new SharpDX.Vector3(0,0,0); result.Z = (vForward.X * entityPosition.X) + (vForward.Y * entityPosition.Y) + (vForward.Z * entityPosition.Z) + vForward.W; result.X = (vRight.X * entityPosition.X) + (vRight.Y * entityPosition.Y) + (vRight.Z * entityPosition.Z) + vRight.W; result.Y = (vUpward.X * entityPosition.X) + (vUpward.Y * entityPosition.Y) + (vUpward.Z * entityPosition.Z) + vUpward.W; if (result.Z < 0.001f) { screenCoords = new Vector2(0, 0); return false; } float invw = 1.0f / result.Z; result.X *= invw; result.Y *= invw; screenCoords = new Vector2(result.X, -result.Y); return true; }