我需要在OpenGL中繪製一個可以在不同投影中查看的場景。到目前爲止,我一直在使用gluPerspective和glOrtho來創建不同的預測,但現在我需要在不使用這些函數的情況下進行。有沒有辦法做到這一點?如何在不使用gluPerspective和glOrtho的情況下在OpenGL中創建不同的投影?
回答
您可以直接設置投影矩陣。既然你使用了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將幫助您構建所需的矩陣,並且可以將結果傳遞給着色器。
正如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
- 1. 在沒有OpenGL的情況下複製OpenGL正投影行爲
- 2. 使Ant在不同情況下使用不同的構建類?
- 3. 如何在不使用Membership.CreateUser()的情況下創建用戶?
- 4. 如何在不使用OpenGL ES的情況下使UIImage變亮?
- 5. 如何在不同情況下使用不同的子類?
- 6. 如何在不使用Shadow DOM的情況下創建組件?
- 7. 如何在不使用String的情況下創建JSON對象?
- 8. OpenGL - 如何在不影響紋理的情況下在單個TRIANGLE_STRIP中跳轉?
- 9. 在不使用kibana的情況下在kibana中創建索引
- 10. 在OpenGL中使用gluPerspective
- 11. 如何初始化gluPerspective OpenGL投影類型?
- 12. 使用ScrollViews在不使用Interace Builder的情況下創建PageControl
- 13. 如何在不使用類的情況下使用MVC創意?
- 14. 如何在不創建GLSurfaceView的情況下檢測OpenGL功能(Android)
- 15. 如何在不使用鼠標的情況下在IntelliJ中創建新類?
- 16. 如何在不使用插件的情況下在WordPress中創建圖庫?
- 17. 如何在不使用d3dx9的情況下在DirectX 9中創建紋理?
- 18. 如何在不使用Javascript的情況下在HTML中創建菜單?
- 19. 如何在不共享源代碼的情況下創建和使用Android庫?
- 20. 如何在不關閉投影機的情況下全屏關閉視頻
- 21. 如何在不創建ZIP文件的情況下在Android中創建ZIP InputStream?
- 22. gluPerspective和glOrtho都沒有任何效果
- 23. 如何在不使用glBegin的情況下在OpenGL中繪製線
- 24. 在不影響其他對象的情況下移動對象(使用opengl)
- 25. 如何在不重用相同NSArray的情況下創建NSArrays的Objective-C NSDictionary?
- 26. 在不同情況下使用不同的Hibernate用戶類型
- 27. 使用LinqToXSD,如何在不投射的情況下獲取xml中的對象?
- 28. 使用C#在OpenGL中使用投影?
- 29. 如何在不使用空閒函數glutIdleFunc()的情況下在OpenGL中創建動畫?
- 30. 取在不同情況下
您也可以使用GLM庫。 – Grimmy 2014-10-02 15:00:05