2010-09-08 202 views
6

我正在嘗試使用透視相機矩陣將一系列3D點投影到屏幕上。我沒有世界空間(或者認爲它是一個單位矩陣),我的相機沒有相機空間(或者認爲它是一個單位矩陣),我的物體空間確實有4x4矩陣。使用透視相機矩陣將3D點投影到2D屏幕空間

我拍攝所述物體矩陣和由照相機透視矩陣,用以下的方法生成的相乘:

Matrix4 createPerspectiveMatrix(Float fov, Float aspect, Float near, Float far) 
{ 
    Float fov2 = (fov/2) * (Math.PI/180); 
    Float tan = Math.tan(fov2); 
    Float f = 1/tan; 

    return new Matrix4 ( 
     f/aspect, 0, 0, 0, 
     0, f, 0, 0, 
     0, 0, -((near+far)/(near-far)), (2*far*near)/(near-far), 
     0, 0, 1, 0 
    ); 
} 

我然後取我的點[X,Y,Z,1]和乘以該通過透視矩陣和對象矩陣的相乘乘法。

接下來的部分是我陷入困境的地方,我非常確定我需要在-1和1或0和1的範圍內獲得這些點,並且在有第一組數值,然後我將屏幕寬度和高度分別乘以屏幕座標x和y值,或者將屏幕高度/ 2和寬度/ 2乘以這些值,並將相同的值添加到相應的點。

任何一步一步告訴我如何實現這一目標,或者我可能會出現錯誤的任何這將是大規模讚賞! :D

祝大家好!

P.S.在身份/翻譯矩陣的例子,在我的模型我的矩陣格式是:

[1, 0, 0, tx, 
0, 1, 0, ty, 
0, 0, 1, tz, 
0, 0, 0, 1 ] 
+0

那麼,這是否有效? :) – Stringer 2010-09-26 01:13:04

+0

不好意思把死人和所有......但在你的'createPerspectiveMatrix'代碼中,不應該'matrix.m32 = 1.0'和'matrix.m33 = 0.0'?如果這原本是爲了「填充」身份矩陣,那麼這些值似乎在您的代碼中被交換。 – RectangleEquals 2014-06-06 20:05:23

+0

謝謝,因爲我問了這個問題,我寫了Zest3D http://www.zest3d.com,所以我想通了。 :) – 2014-06-08 03:23:48

回答

5

你的問題是,你忘了執行透視除法。

透視分區意味着你可以用你的w分量來劃分你的點的x,y和z分量。 這是必需的從均相4D改變你的點空間歸一化設備座標系統(NDCS),其中每個分量x,Y或Z -1和1,或0和1

後介於這個轉換,你可以做你的視口轉換(通過屏幕寬度乘以點,heigth等)。

有這個轉換管道的Foley的書一個很好的觀點(計算機圖形學:原理和用C練習),你可以在這裏看到:

http://www.ugrad.cs.ubc.ca/~cs314/notes/pipeline.html