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

时间:2015-01-26 14:39:43

标签: c# slimdx

我有一个由4x4矩阵表示的空间点。我想获得该点的屏幕坐标。挑选似乎与我需要的完全相反。我使用屏幕坐标来确定绘制文本的位置。

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

enter image description here enter image description here

我错过了转型吗?世界坐标认为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));

1 个答案:

答案 0 :(得分:1)

原来我是在暗示这一点。通过传递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);