2014-10-02 80 views

回答

1

您可以直接設置投影矩陣。既然你使用了gluPerspective(),我假設你正在使用固定功能的傳統OpenGL流水線。那是對的嗎?我問,因爲如果是這樣,你可以通過glMatrixMode(GL_PROJECTION);設置矩陣模式的投影矩陣(和直接加載或構建與像glLoadMatrix()glTranslate()呼叫矩陣等

如果你想從固定移開,功能全的管道,這就是爲什麼你不能使用gluPerspective()glOrtho(),那麼你需要手動計算,並最終生成的基質傳遞到您的着色器。

所以,如果你還在使用固定管線,section 9.085 of the OpenGL FAQ告訴你如何設置gluPerspective()計算的投影矩陣,但使用glFrustum()

9.085如何調用與gluPerspective()相匹配的glFrustum()?

視場的glFrustum()調用的(FOV)爲:

fov*0.5 = arctan ((top-bottom)*0.5/near)

由於底部== -top爲對稱的投影那gluPerspective()產生,那麼:

top = tan(fov*0.5) * near bottom = -top

注意:fov必須用弧度表示上述公式與C數學庫一起使用。如果您在度comnputed您的FOV(如調用gluPerspective()),然後計算頂部如下:

top = tan(fov*3.14159/360.0) * near

左邊和右邊的參數僅僅是頂部,底部和方面的功能:

left = aspect * bottom right = aspect * top

OpenGL的參考手冊(?我在哪裏得到這個)顯示了兩種功能產生的矩陣。

man page for glFrustum()解釋瞭如何從上述信息中計算投影矩陣。 (我在這裏放了一個摘錄,但我不知道如何正確繪製矩陣。)同樣,man page for glOrtho解釋瞭如何手動構建正交投影矩陣。

如果您使用現代渲染流水線,您可以使用OpenGL數學庫glm的上述信息。 glm將幫助您構建所需的矩陣,並且可以將結果傳遞給着色器。

0

正如user1118321在他的回答中所述,您可以自己創建任何投影矩陣並將其直接加載到OpenGL。但對於新手可能很難從那裏走所以在C++中是這樣完成的:

double M[16]= 
{ 
1.0,0.0,0.0,0.0, 
0.0,1.0,0.0,0.0, 
0.0,0.0,1.0,0.0, 
0.0,0.0,0.0,1.0, // <- this line is for projections 
}; 
glMatrixMode(GL_PROJECTION) 
glLoadMatrixd(M); 
  • 其中M爲您的投影矩陣...將其更改爲任何你需要
  • 提防OpenGL的矩陣在面向列
  • 看這裏:transform matrix anatomy
相關問題