Я пытаюсь преобразовать координаты мирового пространства в координаты экранного пространства для 2D-игры, чтобы я мог работать над столкновениями с краями окна.
Код, который я использую для преобразования координат мирового пространства в пространство экрана, ниже
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
, что является правильным.Однако проблема возникает, когда я перемещаю объект к краям экрана.
Когда я перемещаю объект влево, текущий экранКоордината пространства X для этой позиции равна 0.107788
, когда реально она должна быть значительно выше 0
, так как центральная точка все еще находится на экране и нигде рядом с краем.То же самое происходит при перемещении объекта вправо.
Размер экрана в пикселях правильный, но что-то думает, что экран имеет преждевременное обрезание, как на рисунке ниже.Кажется, что красные пунктирные линии - это края окна, когда их нет.Я могу исправить это, добавив дополнительное смещение, но я не верю, что это правильный способ исправить это, и хотел бы знать, где я ошибаюсь.
Кто-нибудь знает, почему координаты неверны?
Редактировать
Матрица мира рассчитывается для каждого объекта (черный прямоугольник) в обновлении с использованием
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-мерного рендеринга.Хотя я должен использовать орфографию, конечно, это не проблема?