首页 > 解决方案 > 当对象在世界空间中移动时,XMVector3Project 给出偏移值

问题描述

我正在尝试将世界空间坐标转换为 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);

我感觉这可能与投影矩阵有关,因为我目前正在使用透视投影进行 2d 渲染。虽然我应该使用正字法,但这肯定不是问题吗?

在此处输入图像描述

标签: directx-11coordinate-transformation

解决方案


推荐阅读