Определить координаты экрана от точки в мире DirectX
У меня есть точка в пространстве, представленная матрицей 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));
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);