我正在尝试将世界空间坐标转换为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
,因为中心点仍在屏幕上,并且无处可见在边缘附近。向右移动对象时也会发生同样的情况。
以像素为单位的屏幕尺寸是正确的,但是有些人认为屏幕像下面的图片一样过早截止。似乎红色虚线不是窗口的 edges 。我可以通过添加其他偏移量来解决此问题,但我不认为这是修复它的正确方法,并且想知道我要去哪里。
有人知道为什么坐标不正确吗?
修改
使用更新为每个对象(黑色矩形)计算世界矩阵
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);
我感觉这可能与投影矩阵有关,因为我目前正在使用2D渲染的透视投影。尽管我应该使用正交拼写,但是肯定不是问题吗?