我在Direct3D画布上有背景图像。我在背景上的特定位置画一个圆圈。使用相机(使用世界/视图/投影)缩放/平移画布后,将更新背景。
现在问题是,我找不到图像上的先前位置来重绘圆圈。我正在使用以下函数(DirectX 11.1)来查找坐标。但它不起作用。
XMVECTOR Camera::Unproject(Windows::Foundation::Rect viewPort, Windows::Foundation::Point location)
{
XMFLOAT3 worldPosition(location.X, location.Y, 0.0f);
XMVECTOR worldVector = XMLoadFloat3(&worldPosition);
return XMVector3Unproject(worldVector, viewPort.X, viewPort.Y, viewPort.Width, viewPort.Height, 0.0f, 1.0f, this->Projection(), this->View(), this->World());
}
我甚至尝试过将XMMatrixIdentity作为世界。但没有成功。 有人可以帮帮我吗?
答案 0 :(得分:1)
这是您提供的信息的一个非常重要的问题。
屏幕上的2D点无法映射到场景中的一个3D点。每个2D点都映射到整个光线。因此,如果在特定的2D位置上绘制圆,则可以将圆放置在场景中的各个位置。这可能就是为什么你会得到一些奇怪的结果。
如果移动相机,光线可能会“更加明显”。即它不会映射到单个2D点,而是2D射线。你的圆圈放在这条光线的某个地方。你看,没有办法用提供的信息获得圆圈的新位置。你只能说它在某个光线上的某个地方。
但也许您可以指定圆圈的位置。也许它被放置在一个物体上,一个虚拟的飞机上或类似的东西上。那么这个问题就可以解决了。
首先,您必须找到圆的3D位置。使用XMVector3Unproject
两次。一旦z坐标为0,一次为1.这将给你一个非常接近相机的点和一个很远的点。这是你的光芒。然后,您必须计算该光线上圆的位置。例如。通过将光线与平面相交。可以使用新的相机参数将此3D位置投影回屏幕(XMVector3Project
)并定义新的圆位置。
是的,您应该将Identity矩阵定义为世界矩阵。