我需要在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