2011-05-15 128 views
3

我一直在試圖讓我的opengl引擎使用z軸作爲上軸,但無論我做什麼都不顯示。餘計算視圖矩陣是這樣的:OpenGL Z軸向上

float width = xymax - xmin; 
float height = xymax - ymin; 

float depth = zfar - znear; 
float q = -(zfar + znear)/depth; 
float qn = -2 * (zfar * znear)/depth; 

float w = 2 * znear/width; 
w = w/aspect; 
float h = 2 * znear/height; 

m[0] = w; 
m[1] = 0; 
m[2] = 0; 
m[3] = 0; 

m[4] = 0; 
m[5] = 0; 
m[6] = h; 
m[7] = qn; 

m[8] = 0; 
m[9] = q; 
m[10] = 0; 
m[11] = 0; 

m[12] = 0; 
m[13] = 0; 
m[14] = -1; 
m[15] = 0; 

之前,當我有Y軸爲向上(其工作得很好),碼是這樣的:

m[0] = w; 
m[4] = 0; 
m[8] = 0; 
m[12] = 0; 

m[1] = 0; 
m[5] = h; 
m[9] = 0; 
m[13] = 0; 

m[2] = 0; 
m[6] = 0; 
m[10] = q; 
m[14] = -1; 

m[3] = 0; 
m[7] = 0; 
m[11] = qn; 
m[15] = 0; 

每個對象/頂點是第一乘以一個簡單的翻譯矩陣:

1 0 0 xposition 
0 1 0 yposition 
0 0 1 zposition 
0 0 0 1 

,然後通過上面 產生的投影矩陣,我只是得到一個黑色的屏幕。有什麼我需要改變這個工作?

回答

1

這些看起來像投影矩陣中使用的矩陣,如果旋轉那個矩陣,會發生奇怪的事情,因爲您正在混淆OpenGL對傳入數據的期望。

相反,您必須在應用投影之前將旋轉應用於傳入矢量;或者換句話說,你從一個旋轉的矩陣開始,然後乘以投影。

現在,如果您使用固定功能流水線,只需使用工作變體,將其放入投影矩陣。如果你使用着色器,把它放入gl_ProjectionMatrix制服。有許多着色器算法需要世界空間頂點位置;投影和模型視圖合併是有問題的。

爲了您的模型視圖假設以下爲您的身份矩陣:

1 0 0 0 
0 0 1 0 
0 1 0 0 
0 0 0 1 

並繼續使用你的工作投影,並且在第二階段應用它。


什麼你也不過是盲目地交換所有非零Ÿ< - >ž項,這是錯誤的:

w 0 0 0 
0 h 0 0 
0 0 q qn 
0 0 -1 0 

正確的,這將一直換的Y和Z柱:

w 0 0 0 
0 q 0 0 
0 0 h -1 
0 0 qn 0 

現在,如果你r乘以上面給出的新「身份」,在你的工作投影你得到的就是這個。

+0

我不知道你在做什麼來獲得第三個矩陣,沒有列似乎交換,一切都只是重新排序。另外,什麼是r-乘法?我更新了關於渲染的更多信息 – zacaj 2011-05-15 16:02:22