从 DirectX 世界中的点确定屏幕坐标

Determine screen coordinates from point in DirectX world

我在 space 中有一个点,用 4x4 矩阵表示。我想获取该点的屏幕坐标。采摘似乎与我需要的完全相反。我正在使用屏幕坐标来确定在何处绘制文本。

目前我绘制的文字漂浮在 space 远在点的前面。我附上了 zoomed-in 和 zoomed-out 的屏幕截图以便更好地解释。正如您在屏幕截图中看到的那样,放大时每个点之间的距离是相同的,应该更小。

我是不是错过了转型?世界坐标将 0,0,0 视为网格的中心。我正在使用 SlimDX。

var viewProj = mMainCamera.View * mMainCamera.Projection;

//Convert 4x4 matrix for point to Vector4
var originalXyz = Vector3.Transform(Vector3.Zero, matrix);

//Vector4 to Vector3
Vector3 worldSpaceCoordinates = new Vector3(originalXyz.X, originalXyz.Y, originalXyz.Z);

//Transform point by view projection matrix
var transformedCoords = Vector3.Transform(worldSpaceCoordinates, viewProj);

Vector3 clipSpaceCoordinates = new Vector3(transformedCoords.X, transformedCoords.Y, transformedCoords.Z);
Vector2 pixelPosition = new Vector2((float)(0.5 * (clipSpaceCoordinates.X + 1) * ActualWidth),  (float)(0.5 * (clipSpaceCoordinates.Y + 1) * ActualHeight));

原来我想多了。只需传递 Vector3.Project 您的视口信息,即可将点投影到屏幕上。这是一个 3 行解决方案。

var viewProj = mMainCamera.View * mMainCamera.Projection;
var vp = mDevice.ImmediateContext.Rasterizer.GetViewports()[0];
var screenCoords = Vector3.Project(worldSpaceCoordinates, vp.X, vp.Y, vp.Width, vp.Height, vp.MinZ, vp.MaxZ, viewProj);