OpenGL的矩阵堆栈指的就是内存中专门用来存放矩阵数据的某块特殊区域。一般说来,矩阵堆栈常用于构造具有继承性的模型,即由一些简单目标构成的复杂模型。矩阵堆栈对复杂模型运动过程中的多个变换操作之间的联系与独立十分有利。因为所有矩阵操作函数如glLoadMatrix(),glMultMatrix(),glLoadIdentity()等只处理当前矩阵或堆栈顶部矩阵,这样堆栈中下面的其它矩阵就不受影响。堆栈操作函数有以下两个:
void glPushMatrix(void);
该函数表示将所有矩阵依次压入堆栈中,顶部矩阵是第二个矩阵的备份;压入的矩阵数不能太多,否则出错。
另一种理解:复制当前桟顶,并把复制内容再次放到桟顶,以保护桟上之前的内容
void glPopMatrix(void);
该函数表示弹出堆栈顶部的矩阵,令原第二个矩阵成为顶部矩阵,接受当前操作,故原顶部矩阵被破坏;当堆栈中仅存一个矩阵时,不能进行弹出操作,否则出错。
屏幕坐标点=模型点 * 几何变换栈矩阵(n...1) * 投影变换栈矩阵(n...1)
上面的n...1 表示从栈顶到栈底。
OpenGL 维护两个栈:投影变换栈,几何变换栈。
投影: glOrtho,gluPerspective--------------------glMatrixMode(GL_PROJECTION);
几何变 换:glTranslatef,glRotatef,glScalef--------glMatrixMode(GL_MODELVIEW);
在调用glMatrixMode(GL_MODELVIEW)时,系统会自动将几何变换桟清空并压入单位矩阵,因此不必再调用glLoadIdentity()函数。
glMatrixMode(GL_MODELVIEWING或GL_PROJECTION);本命令执行后参数所指矩阵栈就成为当前矩阵栈,以后的矩阵栈操纵命令将作用于它。