这篇是因为上一篇https://blog.csdn.net/derbi123123/article/details/104643148已经写太多了,而且几何变换和这两者也没有太大关系,所以分开来写,这篇主要总结投影变换、视口变换的原理以及对应的OpenGL函数。
投影变换:
首先来看看投影的分类:
正投影也是平行投影的特殊形式,也就是投影方向与投影面垂直。
下面来看三个投影变换的函数:
核心库中的投影变换函数:
Frustum的意思是平截头体(也就是棱台体),说白了就是投影时被近平面和远平面截取视椎体得到的那一部分空间。所以我们也可以看出OpenGL中函数的命名都是尽量贴合生活用语的,便于我们理解。
正投影变换函数:
对应的参数可以参照下图。
实用库中的投影变换函数:
fovy就是下图中的Θ夹角,也就是视角,aspect是近平面的宽高比,zNear就是视点到近平面的距离,zFar就是视点到远平面的距离。
可以看出**glFrustum()
和gluPerspective()
他们的参数设置不同,最具体的不同就是前者不需要关于z轴对称,而后者必须关于z轴对称 ,因为方便也有方便的坏处,因为后者用视角和宽高比代替了上下左右四个边,简化了参数,但这就注定了它是一个绝对的空间,而不能像上下左右决定的位置可以随意变换。
最后再说一点,设置投影前别忘了glMatrixMode(GL_PROJECTION);
视口变换:
控制视口大小的函数:
我们参照下面的图片结合投影函数理解视口控制函数。
x,y是视口左下角在窗口中的下标,width、height定义视口的宽高。
投影函数决定了投影窗口的大小比例,glViewport()定义了视口的大小比例,二者共同决定了视口变换的效果,这里有一个细节要注意:
我们如下图设置投影函数和glViewport()的参数,让他们的长宽比例一致,这样无论视口怎么变,投影窗口的比例都和视口一致。
这里可以看https://editor.csdn.net/md/?articleId=104619415的第三点中的程序具体体会,其中的myReshape()如下
//窗口大小变化时的回调函数
void myReshape(GLsizei w, GLsizei h)
{
//设定视区
glViewport(0, 0, w, h);
//设定透视方式
glMatrixMode(GL_PROJECTION);
//初始化/重置矩阵为单位矩阵
glLoadIdentity();
gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 30.0);
// gluPerspective(60.0, 1.0, 1.0, 30.0); //调整窗口比例时物体会变形
}
我们可以看到 glViewport(0, 0, w, h);
和gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 30.0);
长宽比例一致,而下面还给出了调整窗口比例时物体比例会改变的设置参数。
大家可以看 加深理解。