2015-08-08 70 views
0

如果我在屏幕X/Y上選擇顯示器上的某個點,我如何根據投影和視圖矩陣獲得三維空間中的點?如何確定後臺緩衝區上某點的XYZ座標

例如,我想將對象置於深度並使其位於屏幕座標10,10。所以當我更新它的世界矩陣時,它將在屏幕上以10,10呈現。

我認爲這是相當簡單的,因爲我有我的相機矩陣,但我不確定如何「倒轉」正常過程。

DirectXTk XMMath會是最好的,但我毫無疑問可以從任何線性代數系統(OpenGL,D3DX等)中進行排序。

+0

您的問題陳述尚未確定。有一個完整的_line_點將被映射到某個(x,y)屏幕空間點。古典的「unprojecting」使用來自z緩衝區的深度值來徹底顛倒過程。如果你不在意,你當然可以假設一些z值。 – derhass

+0

是的,我很樂意假設Z等於後面的buifer。這就是我所說的「深入反對」的意思,儘管這並不十分清楚。 – Dave

+0

@Dave在此時讀取了深度緩衝區,它將位於範圍** [0.0,1.0] **中,您必須撤消深度範圍和透視分區。這可能是唯一不完全簡單的事情。但是我認爲任何關於「未投射」的討論都可能會涵蓋這一點。在您可以取消投影之前,您需要NDC空間中的所有內容,除了矩陣之外,還需要包含視口/深度範圍。 –

回答

0

我實際上想要做的是在後面的剪裁平面上找到一個隨機點,在那裏我可以開始一個物體,然後沿着它的投影線直線漂移到相機。所以我想繼續在我看來仍然在外層空間中選擇點(在我的情況下沒有創建外部點),並開始在這個點上的外星船隻(或其他)。

正如我在評論中所討論的那樣,您通常需要四件事來做到這一點。

  1. 模型視圖(GL)或視圖(D3D /普通)矩陣
  2. 投影矩陣
  3. 視口
  4. 深度範圍(讓我們假定默認,[0,1]

你要做的是在世界空間中定位一個位於窗口空間中特定x,y座標的遠剪裁平面上的點。您正在尋找的點是<x,y,1>z = 1對應於窗口空間中的遠平面)

考慮到這一點,你需要變換回NDC空間

  • 的細節實際上是API的依賴,因爲D3D的NDC的定義是OpenGL的不同 - 他們不要的範圍達成一致Z(D3D = [0,1],GL = [-1,1]

一旦在NDC空間中,您可以應用逆投影矩陣轉換回視圖空間。

  • 這些是齊次座標,除以W是必要的。

從視空間,應用反向視圖矩陣到達世界空間中滿足您的條件的點。


大多數數學函數庫都有一個函數UnProject (...),它可以爲你做所有這些。我建議使用它,因爲你標記了這個問題D3D和OpenGL,並且這些轉換的細節取決於API。

即使你從來沒有實現過,你最好知道它們是如何工作的。我認爲你錯過的關鍵是視口,我有一個解答這個步驟的解釋here

相關問題