OpenGL中的变换是依靠矩阵来完成所有数学计算的。OpenGL中有一种叫矩阵堆栈的东西,对于构建由很多简单物体组成的复杂模型是很有用的。
OpenGL中的矩阵堆栈提供了这样一个功能:用户能够相对于物体B的局部坐标原点移动物体A,以物体A的局部坐标绘制A,最后再撤销整个变换,以使得当前位置再次回到B物体的局部坐标原点。两个堆栈操作glPushMatrix()和glPopMatrix()就可实现这样的功能。
glPushMatrix()函数将当前矩阵压入堆栈。
glPopMatrix()函数弹出堆栈的栈顶矩阵,销毁其内容。
上面这一段话怎么理解呢?我下面分析一下:
假如要绘制两个物体A和物体B:
(1)假如函数结构如下:
glPushMatrix()
坐标变换1
绘制物体B
坐标变换2
绘制物体A
glPopMatrix()
假如函数结构如上,则“坐标变换2”是在“坐标变换1”的基础上进行变换的,当改变“坐标变换1”中的坐标时,“坐标变换2”的坐标也将会随之改变。这就可以实现诸如机器人手臂之类的功能。
(2)假如函数结构如下:
glPushMatrix()
坐标变换1
绘制物体B
glPopMatrix()
glPushMatrix()
坐标变换2
绘制物体A
glPopMatrix()
假如函数结构如上,则“坐标变换2”和“坐标变换1”无关,也就是说,当“坐标变换1”中的坐标变化时,“坐标变换2”的坐标不会随之改变。物体B和物体A都是在同一个坐标起点开始绘制的,它们之间的坐标不会相互影响。