我有一个由4x4矩阵表示的空间点。我想获得该点的屏幕坐标。挑选似乎与我需要的完全相反。我使用屏幕坐标来确定绘制文本的位置。
目前我绘制的文字漂浮在远离点前面的空间中。我附上了放大和缩小的截图,以便更好地解释。正如您在屏幕截图中看到的那样,每个点之间的距离在放大时是相同的,当它应该更小时。
我错过了转型吗?世界坐标认为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));
答案 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);