2012-10-17 129 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)並定義新的圓形位置。

是的,你應該定義身份矩陣作爲世界矩陣。