2012-12-19 46 views
0

我有一個正交投影,我嘗試從屏幕空間中取消投射一個點。DirectX不可預知的麻煩

以下是視圖和投影矩陣:

var w2 = ScreenWidthInPixels/2; 
var h2 = ScreenHeightInPixels/2; 

view = Matrix.LookAtLH(new Vector3(0, 0, -1), new Vector3(0, 0, 0), 
         Vector3.UnitY); 
proj = Matrix.OrthoOffCenterLH(-w2, w2, -h2, h2, 0.1f, 10f); 

這裏是我unproject一個點p,該點在屏幕像素爲單位:

var m = Vector3.Unproject(p, 0, 0, ScreenWidthInPixels, ScreenHeightInPixels, 
        0.1f, 10f, // znear and zfar 
        view *proj); 

我的代碼不能正常工作,矩陣m僅包含Nan。 當我嘗試翻轉view * proj時,我得到一個只有零的矩陣。

所以我懷疑我的問題與正交投影矩陣有關。

這裏是我的問題:

  • 能問題由下溢引起由於OrthoOffCenterLH投影大的價值?
  • 我需要通過哪些參數x,y,width,heightUnproject(...)
  • Unproject(...)中參數minZmaxZ有什麼意義?
  • 難道我通過p.ZUnproject(...)

回答

3

不幸的是,SharpDX文檔現在不在線。所以我的解釋可能基於我發現代碼的舊版本。

該問題是否由於OrthoOffCenterLH投影中值較大而導致下溢引起的?

什麼值大?我認爲屏幕寬度和高度要小於2000.這絕對不是很大。不要擔心這一點。

對於Unproject(...)中的x,y,width,height,我需要傳遞哪些參數?

這些是視口的尺寸。這是必要的,因爲視圖和投影矩陣將矢量轉換成剪輯空間。 x和y通常爲[-1,1],z爲[0,1]。首先需要將位置從屏幕空間轉換爲剪輯空間。這就是這些價值觀的目的。

Unproject(...)中minZ和maxZ參數有什麼意義?

這是如何編碼輸入矢量的z分量。它也用於標準化屏幕空間的座標。一般情況下,你可以將它保留在0和1處。

在Unproject(...)中爲p.Z傳遞的內容是否重要?

是的,當然。此參數指定視錐/立方體中的深度。如果通過minZ,則會得到正面上該點的未投影座標。如果您通過maxZ,您將獲得背面的位置。兩者之間的每個值都會導致兩者之間的座標。這是因爲2D點映射到整個3D點。

結論是,Unproject方法應該使用正交投影矩陣。在你的情況下,得到的view*proj只是縮放和平移的簡單組合,應該是完全可逆的。你確定產生的逆僅包含零嗎?如果是這樣,那麼請將原始矩陣添加到您的問題中。也許還有其他事情正在發生。

+0

謝謝你的非常詳盡的答案! – thumbmunkeys