如果我在屏幕X/Y上選擇顯示器上的某個點,我如何根據投影和視圖矩陣獲得三維空間中的點?如何確定後臺緩衝區上某點的XYZ座標
例如,我想將對象置於深度並使其位於屏幕座標10,10。所以當我更新它的世界矩陣時,它將在屏幕上以10,10呈現。
我認爲這是相當簡單的,因爲我有我的相機矩陣,但我不確定如何「倒轉」正常過程。
DirectXTk XMMath會是最好的,但我毫無疑問可以從任何線性代數系統(OpenGL,D3DX等)中進行排序。
如果我在屏幕X/Y上選擇顯示器上的某個點,我如何根據投影和視圖矩陣獲得三維空間中的點?如何確定後臺緩衝區上某點的XYZ座標
例如,我想將對象置於深度並使其位於屏幕座標10,10。所以當我更新它的世界矩陣時,它將在屏幕上以10,10呈現。
我認爲這是相當簡單的,因爲我有我的相機矩陣,但我不確定如何「倒轉」正常過程。
DirectXTk XMMath會是最好的,但我毫無疑問可以從任何線性代數系統(OpenGL,D3DX等)中進行排序。
我實際上想要做的是在後面的剪裁平面上找到一個隨機點,在那裏我可以開始一個物體,然後沿着它的投影線直線漂移到相機。所以我想繼續在我看來仍然在外層空間中選擇點(在我的情況下沒有創建外部點),並開始在這個點上的外星船隻(或其他)。
正如我在評論中所討論的那樣,您通常需要四件事來做到這一點。
你要做的是在世界空間中定位一個位於窗口空間中特定x,y座標的遠剪裁平面上的點。您正在尋找的點是<x,y,1>
(z = 1對應於窗口空間中的遠平面)。
考慮到這一點,你需要變換回NDC空間
一旦在NDC空間中,您可以應用逆投影矩陣轉換回視圖空間。
從視空間,應用反向視圖矩陣到達世界空間中滿足您的條件的點。
大多數數學函數庫都有一個函數UnProject (...)
,它可以爲你做所有這些。我建議使用它,因爲你標記了這個問題D3D和OpenGL,並且這些轉換的細節取決於API。
即使你從來沒有實現過,你最好知道它們是如何工作的。我認爲你錯過的關鍵是視口,我有一個解答這個步驟的解釋here。
您的問題陳述尚未確定。有一個完整的_line_點將被映射到某個(x,y)屏幕空間點。古典的「unprojecting」使用來自z緩衝區的深度值來徹底顛倒過程。如果你不在意,你當然可以假設一些z值。 – derhass
是的,我很樂意假設Z等於後面的buifer。這就是我所說的「深入反對」的意思,儘管這並不十分清楚。 – Dave
@Dave在此時讀取了深度緩衝區,它將位於範圍** [0.0,1.0] **中,您必須撤消深度範圍和透視分區。這可能是唯一不完全簡單的事情。但是我認爲任何關於「未投射」的討論都可能會涵蓋這一點。在您可以取消投影之前,您需要NDC空間中的所有內容,除了矩陣之外,還需要包含視口/深度範圍。 –