Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在OpenGL中创建不同的投影,而不使用gluPerspective和glOrtho?_Opengl_Graphics_Glu - Fatal编程技术网

如何在OpenGL中创建不同的投影,而不使用gluPerspective和glOrtho?

如何在OpenGL中创建不同的投影,而不使用gluPerspective和glOrtho?,opengl,graphics,glu,Opengl,Graphics,Glu,我需要在OpenGL中绘制一个可以在不同投影中查看的场景。到目前为止,我一直在使用gluPerspective和glOrtho来创建不同的投影,但现在我需要在不使用这些函数的情况下进行。有没有办法做到这一点?您可以通过直接设置投影矩阵来实现。由于您使用了glupspective(),因此我假设您使用的是固定函数遗留OpenGL管道。对吗?我这样问是因为如果是这样,您可以将矩阵模式设置为投影矩阵(通过glMatrixMode(GL\u projection);直接加载或构造一个矩阵,调用glLoa

我需要在OpenGL中绘制一个可以在不同投影中查看的场景。到目前为止,我一直在使用gluPerspective和glOrtho来创建不同的投影,但现在我需要在不使用这些函数的情况下进行。有没有办法做到这一点?

您可以通过直接设置投影矩阵来实现。由于您使用了
glupspective()
,因此我假设您使用的是固定函数遗留OpenGL管道。对吗?我这样问是因为如果是这样,您可以将矩阵模式设置为投影矩阵(通过
glMatrixMode(GL\u projection);
直接加载或构造一个矩阵,调用
glLoadMatrix()
glTranslate()

如果您试图从固定函数管道中移开,并且这就是为什么您不能使用
glupperspective()
glOrtho()
的原因,那么您需要手动计算它并将结果矩阵传递给着色器

因此,如果您仍在使用固定函数管道,将告诉您如何设置投影矩阵,该投影矩阵由
glupperspective()
计算,但使用
glFrustum()

9.085如何调用glFrustum()以匹配对GLUPPERVICENT()的调用

glFrustum()调用的视野(fov)为:

fov*0.5=arctan((上下)*0.5/近)

由于gluPerspective()生成的对称投影的bottom==-top,因此:

top=tan(视野*0.5)*近
bottom=-top

注意:fov必须以弧度为单位,以上公式才能与C数学库一起使用。如果您已以度为单位输入fov(如调用gluPerspective()),请按如下方式计算top:

top=tan(视野*3.14159/360.0)*近

左侧和右侧参数只是顶部、底部和侧面的函数:

left=aspect*bottom
right=aspect*top

OpenGL参考手册(我从哪里得到这个?)

说明了如何根据上述信息计算投影矩阵。(我在这里放了一个摘录,但我不确定如何正确绘制矩阵。)同样,说明了如何手动构造正交投影矩阵


如果您使用的是现代渲染管道,您可以将上述信息与OpenGL数学库一起使用。glm将帮助您构建所需的矩阵,并且您可以将结果传递给着色器。

正如user1118321在其回答中所述,您可以自己创建任何投影矩阵并将其直接加载到OpenGL。但是对于nEWBEE,从那里开始是很困难的,所以在C++中,这样做是:< /P>
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);
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,//您还可以使用GLM库。