XMVector3Project, дающий значения смещения, когда объект перемещается в мировом пространстве - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь преобразовать координаты мирового пространства в координаты экранного пространства для 2D-игры, чтобы я мог работать над столкновениями с краями окна.

enter image description here

Код, который я использую для преобразования координат мирового пространства в пространство экрана, ниже

float centerX = boundingBox.m_center.x;
XMVECTORF32 centerVector = { centerX, 0.0f, 0.0f, 0.0f };


Windows::Foundation::Size screenSize = m_deviceResources->GetLogicalSize();
//the matrices are passed in transposed, so reverse it
DirectX::XMMATRIX projection = XMMatrixTranspose(XMLoadFloat4x4(&m_projectionMatrix));
DirectX::XMMATRIX view = XMMatrixTranspose(XMLoadFloat4x4(&m_viewMatrix));
worldMatrix = XMMatrixTranspose(worldMatrix);

XMVECTOR centerProjection = XMVector3Project(centerVector, 0.0f, 0.0f, screenSize.Width, screenSize.Height, 0.0f, 1.0f, projection, view, worldMatrix);

float centerScreenSpace = XMVectorGetX(centerProjection);

std::stringstream ss;
ss << "CENTER SCREEN SPACE X: " << centerScreenSpace << std::endl;
OutputDebugStringA(ss.str().c_str());

У меня ширина окна 1262.Объект расположен в (0.0, 0.0, 0.0), и текущая координата X пространства экрана для этой позиции равна 631, что является правильным.Однако проблема возникает, когда я перемещаю объект к краям экрана.

enter image description here

Когда я перемещаю объект влево, текущий экранКоордината пространства X для этой позиции равна 0.107788, когда реально она должна быть значительно выше 0, так как центральная точка все еще находится на экране и нигде рядом с краем.То же самое происходит при перемещении объекта вправо.

Размер экрана в пикселях правильный, но что-то думает, что экран имеет преждевременное обрезание, как на рисунке ниже.Кажется, что красные пунктирные линии - это края окна, когда их нет.Я могу исправить это, добавив дополнительное смещение, но я не верю, что это правильный способ исправить это, и хотел бы знать, где я ошибаюсь.

enter image description here

Кто-нибудь знает, почему координаты неверны?

Редактировать

Матрица мира рассчитывается для каждого объекта (черный прямоугольник) в обновлении с использованием

XMMATRIX world = XMMatrixIdentity();
XMMATRIX scaleMatrix = XMMatrixScaling(m_scale.x, m_scale.y, m_scale.z);
XMMATRIX rotationMatrix = XMMatrixRotationY(0.0f);
XMMATRIX translationMatrix = XMMatrixTranslation(m_position.x, m_position.y, m_position.z);
world = XMMatrixTranspose(scaleMatrix * rotationMatrix * translationMatrix);

//update the object's world with new data
m_sprite->SetWorld(world);

У меня такое ощущение, что это может быть связано с матрицей проекции, так как в настоящее время я использую перспективную проекцию для 2-мерного рендеринга.Хотя я должен использовать орфографию, конечно, это не проблема?

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...