XMVector3Project在对象在世界空间中移动时给出偏移值

时间:2018-12-18 16:44:16

标签: directx-11 coordinate-transformation

我正在尝试将世界空间坐标转换为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,因为中心点仍在屏幕上,并且无处可见在边缘附近。向右移动对象时也会发生同样的情况。

以像素为单位的屏幕尺寸是正确的,但是有些人认为屏幕像下面的图片一样过早截止。似乎红色虚线不是窗口的 edges 。我可以通过添加其他偏移量来解决此问题,但我不认为这是修复它的正确方法,并且想知道我要去哪里。

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);

我感觉这可能与投影矩阵有关,因为我目前正在使用2D渲染的透视投影。尽管我应该使用正交拼写,但是肯定不是问题吗?

enter image description here

0 个答案:

没有答案