0

我在 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 作为世界。但没有成功。谁能帮帮我吗?

4

1 回答 1

1

对于您提供的信息,这是一个不小的问题。

屏幕上的一个 2D 点不能映射到场景中的一个 3D 点。每个二维点映射到一整条射线。因此,如果您在特定的 2D 位置绘制一个圆,则该圆可以放置在场景中的各个位置。这可能就是为什么你会得到一些奇怪的结果。

如果移动相机,光线可能会变得“更明显”。即它不会映射到单个 2D 点,而是映射到 2D 射线。而你的圆被放置在这条射线的某个地方。你看,没有办法用提供的信息得到圆圈的新位置。你只能说它在某条射线上的某个地方。

但也许你可以指定圆的位置。也许它被放置在一个物体上,一个虚拟平面上或类似的东西上。那么这个问题是可以解决的。

首先,您必须找到圆的 3D 位置。使用XMVector3Unproject两次。一次 Z 坐标为 0,一次为 1。这将为您提供一个非常靠近相机的点和一个远离相机的点。这是你的光芒。然后,您必须计算圆在该射线上的位置。例如,通过将射线与平面相交。这个 3D 位置可以XMVector3Project使用新的相机参数投影回屏幕 ( ) 并定义新的圆位置。

是的,您可能应该将身份矩阵定义为世界矩阵。

于 2012-10-22T20:58:40.190 回答