У меня есть эта функция, чтобы получить положение 2D пикселя из положения 3D координат.Xyz - это координаты перед преобразованием (от 1 до -1).Это архитектура модельного вида с камерой постоянно -3,5,0,0, смотрящей на 0,0,0, в то время как координаты объекта / сцены преобразуются с помощью горизонтального поворота по оси x и вертикального поворота по оси y и т. Д., Чтобы получить окончательный кадр.
Эта функция в основном используется для наложения 2D-текста поверх 3D-сцены.Где 2D-текст расположен относительно базовой 3D-сцены.
void My3D::Get2Dfrom3Dx(float x, float y, float z, float* psx, float* psy) {
XMVECTOR xmScreenCoord = XMLoadFloat3( (XMFLOAT3*) &screenCoord);
XMMATRIX xmWorldViewProjection = XMLoadFloat4x4( (XMFLOAT4X4*) &m_WorldViewProjection);
XMVECTOR result = XMVector3TransformCoord( xmScreenCoord, xmWorldViewProjection);
XMStoreFloat3( (XMFLOAT3*) &screenCoord, result);
screenCoord.x = ((screenCoord.x + 1.0f) / 2.0f) * m_nCurrWidth;
screenCoord.y = ((-screenCoord.y + 1.0f) / 2.0f) * m_nCurrHeight;
*psx = screenCoord.x;
*psy = screenCoord.y; }
Эта функция отлично работает, когда сцена полностью / в основном видна (угол между -4 и -1,5.)
У меня возникает неприятная проблема с отображением текста в зеркальном отображении в3D положение, где оно не должно быть.Это происходит, когда, например, я просматриваю изображение снизу (на 60+ градусов вверх под объектом) и масштабирую (перемещая расположение глаза ближе к -5,0,0.). Текст не должен быть виден так, как долженнаходиться за глазом (обратите внимание, что угол глаза не превышает 0,0,0, что действительно портит изображение), но каким-то образом вышеуказанная функция заставляет вычисленные координаты xy экрана показывать в области просмотра в ситуациях, когда они не должны этого делать.
Кажется, я думаю, что есть простое решение этого побочного эффекта, но не могу его найти.Надеюсь, кто-то уже видел эту 2d зеркальную проблему / эффект и знает простой твик.
Я понимаю, что мог бы пойти по более сложному пути определения того, находится ли вектор вида напротив целевой точки, и отфильтровать таким образом, но мне кажется, что должно быть более простое решение.
Опять же, камера постоянно находится на линии -3,5, 0, 0, скажем -,5,0,0, поскольку мир вокруг нее трансформируется.