OpenGL中的glPushMatrix()方法和glPopMatrix()方法的意义

opengl中图形绘制后,往往需要一系列的变换来达到用户的目的,而这种变换实现的原理是又通过矩阵进行操作的。opengl中的变换一般包括视图变换、模型变换、投影变换等,在每次变换后,opengl将会呈现一种新的状态(这也就是我们为什么会称其为状态机)。

首先我们要知道,对于矩阵的操作都是对于矩阵栈的栈顶来操作的。当前矩阵即为矩阵栈的栈顶元素,而对当前矩阵进行平移、旋转等的变换操作也同样是对栈顶矩阵的修改。所以我们在变换之前调用glPushMatrix()的话,就会把当前状态压入第二层,不过此时栈顶的矩阵也与第二层的相同。

当经过一系列的变换后,栈顶矩阵被修改,此时调用glPopMatrix()时,栈顶矩阵被弹出,且又会恢复为原来的状态。
函数的作用过程可以用下图描述,更为直观。


OpenGL中的glPushMatrix()方法和glPopMatrix()方法的意义_第1张图片
过程图解

如上图,从第一个图状态1到第二个图状态2调用了glPushMatrix()方法,此时矩阵栈的第一个和第二个的状态是一样的,但是平移、旋转等方法都是对栈顶元素操作的,在经过平移,旋转之后栈顶的状态1变为状态2,此时对状态2再进行某些绘制,在调用glPopMatrix()弹栈,就相当于在状态1的情况下绘制了。

那么这么做有什么意义呢?

对于某些复杂的绘制,比如一个3D迷宫,障碍是很多墙壁,墙壁是由很多个立方体构成了,我们需要绘制大量的立方体,但是立方体的位置是分布在不同地方的,如果我们每绘制一个立方体都要移动到相应的位置,无疑是十分困难的,但是如果我们先调用glPushMatrix(),在把所有的立方体都移动到中心,然后在绘制, 在调用glPopMatrix(),把这个立方体弹栈,返回原来的位置,我们就只需要一个简单的for循环就可以做到。此时,可以简单的把glPushMatrix()和glPopMatrix()方法理解为移动到指定位置,在移动回来;当然,这两个方法不仅仅适用于移动。相应的理解就是旋转相应的角度在旋转回来。

在opengl场景中一般存在多种矩阵变换操作,而控制这些操作的命令主要用到

          glMatrixMode(GLenum mode); 

作用:用于指定用哪个矩阵作为当前矩阵,mode用于指定哪一种矩阵栈是其后矩阵操作的目标。

mode可取:
GL_MODELVIEW: 把其后的矩阵操作施加于模型视图矩阵栈。(默认)
GL_PROJECTION: 把其后的矩阵操作施加于投影矩阵栈。
GL_TEXTURE: 把其后的矩阵操作施加于纹理矩阵栈。

注意上述三种模式分别对应了三种矩阵栈。 所以在场景中存在多种矩阵变换时,glPushMatrix()和glPopMatrix()一般情况下也要结合glMatrixMode(GLenum mode)运用,系统才知道具体操作的是哪个矩阵栈。

注释:
1.模型视图矩阵是在对物体进行缩放或者从不同的视角观察物体的时候所调用的。主要涉及到三个函数:
进行模型和视图变换,主要涉及到三个函数:
(1)glTranslate(x,y,z),把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表示了在三个坐标上的位移值。
(2)glRotate(angle,x,y,z),把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。
(3)glScale(x,y,z),把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。

2.投影矩阵是定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。投影分为正投影和透视投影
**(1)透视投影常见的方法:
gluPerspective
gluLookAt
(2)正投影常见的方法:
glOrtho
**

OpenGL中的glPushMatrix()方法和glPopMatrix()方法的意义_第2张图片
夜深了,一张美图放松一下吧

你可能感兴趣的:(OpenGL中的glPushMatrix()方法和glPopMatrix()方法的意义)