2014-10-02 81 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
相关问题