从 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);
我在 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);