Определить координаты экрана из точки в мире 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));

person Brandon    schedule 26.01.2015    source источник


Ответы (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);
person Brandon    schedule 26.01.2015