2012-02-25 73 views
0

我想從世界空間轉換到屏幕空間。但是,由於我使用的庫處理矩陣,我只能檢索世界的頂點,視圖和投影矩陣;我無法自行檢查。下面是一個例子矩陣:如何將世界空間起源轉變爲屏幕空間?

(1.65879, -0.000909163, -1.4656, -1721.39) 
(1.20199, -1.64605, 1.36146, 3048.55) 
(0.450536, 0.75107, 0.510306, 9264.52) 
(0.444465, 0.740951, 0.50343, 9339.69) 

我曾假定在屏幕空間中找到的對象的位置將是變換原點的一個簡單的事情[在點(0,0,0)]由該值。然而,這是明顯的錯誤:

D3DMATRIX matrix; 
D3DXVECTOR4 position; 
D3DXVECTOR4 input; 
D3DVIEWPORT9 viewport; 

GetVertexShaderConstantF(0, (float *)&matrix, 4); 
GetViewport(&viewport); 

input.x = 0.0f; 
input.y = 0.0f; 
input.z = 0.0f; 
input.w = 1.0f; 

D3DXVec4Transform(&position, &input, (D3DXMATRIX *)&matrix); 
float x = ((position.x/position.w) * 0.5f + 0.5f) * viewport.Width + viewport.X; 
float y = (1.0f - ((position.y/position.w) * 0.5f + 0.5f)) * viewport.Height + viewport.Y; 

此方法只返回450,375的結果(+/-幾小數),與視口是兩倍大小;基本上,它給出了視口的死角。

我在做什麼錯誤在上面的代碼片段? (我注意到,我只是試圖調試一個我沒有源代碼的程序,因此,當着色器接收到它的輸入時,這是我可以截取模型位置的唯一一個點屏幕空間)。

回答

1

GetVertexShaderConstantF(0, (float *)&matrix, 4); 

你必須調用

D3DXMatrixTranspose(&matrix, &matrix); 

因爲的DirectX在着色器代碼和列主要的使用行爲主的矩陣(或周圍的其他方法,我不現在不記得了)。

相關問題