2012-10-17 87 views
0

我在Direct3D画布上有一个背景图像。我正在背景上的特定位置绘制一个圆圈。画布放大/使用相机(使用世界/视图/投影)平移后,背景被更新。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

为什么你需要重画圆圈?如您所说,背景将根据相机移动进行更新,因此背景上的圆圈将自动更新(放大/缩小)。 – zdd

+0

@zdd圆形的颜色和纹理需要用新的缩放系数进行更改。 – Liton

+0

然后将其绘制为之前的位置并更改颜色和纹理,因为您正在移动相机,相机只会改变视图,不会改变圆的方向。你不需要为它计算新的中心。 – zdd

回答

1

这是您提供的信息的一个不平凡的问题。

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

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

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

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

是的,你应该定义身份矩阵作为世界矩阵。