一、glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有3种模式: GL_PROJECTION 投影, GL_MODELVIEW 模型视图, GL_TEXTURE 纹理。
二保存状态矩阵
glPushMatrix、glPopMatrix操作事实上就相当于栈里的入栈和出栈。
很多人不明确的可能是入的是什么,出的又是什么。
比如你当前的坐标系原点在你电脑屏幕的左上方。如今你调用glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再绘图。那些平移和旋转都是基于左上角为原点进行变化的。并且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了。
那假设想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个“状态”了,这个状态就是你调用glPushMatrix之前的那个状态。就如非常多opengl的书上所讲:调用glPushMatrix事实上就是把当前状态做一个副本放入堆栈之中。
当你做了一些移动或旋转等变换后,使用glPushMatrix();
OpenGL 会把这个变换后的位置和角度保存起来。
然后你再随便做第二次移动或旋转变换,再用glPopMatrix();
OpenGL 就把刚刚保存的那个位置和角度恢复。
比方:
glLoadIdentity();
glTranslatef(1,0,0);//向右移动(1,0,0)
glPushMatrix();//保存当前位置
glTranslatef(0,1,0);//如今是(1,1,0)了
glPopMatrix();//这样,如今又回到(1,0,0)了
//-----------------------------------------
所有的这几个函数的本质都是对坐标系的操作。
前提知识:
1。每一种矩阵对应着一种坐标系。见图一
2。每一次对矩阵的操作都是对当前矩阵进行的。确切的说,作为一种状态机,每一时刻在矩阵方面只能有一种状态。
3。每一次压栈和出栈都对应着一种对坐标系的操作。
4。我们所有对矩阵的操作都是对矩阵栈的栈顶矩阵进行的。
如图:全局坐标系中有一个局部坐标系,这个坐标系的状态对应着一种矩阵。假如当前矩阵为该矩阵,则该矩阵为矩阵栈中的栈顶元素。假如此时又进行了一系列glTranslate(),glRotatef()等操作,都是对当前矩阵也就是栈顶矩阵进行了修改。若此时调用glPushMatrix()函数,则将该矩阵压入栈中第二层的位置,当然此时栈顶位置的矩阵也与此矩阵相同。(就如很多opengl的书上所讲:调用glPushMatrix其实就是把当前状态做一个副本放入堆栈之中。)
当进行完一系列变换之后,栈顶矩阵为该矩阵。若此时调用glPopMatrix()函数,则恢复当前矩阵为该坐标系的状态。以前所进行的有关修改都被忽略了。
记住一句话,所有对矩阵进行的操作都是对栈顶矩阵进行的,压进去的矩阵是哪个矩阵,当前矩阵就是哪个矩阵,弹出来的是哪个矩阵,当前矩阵就为哪个矩阵。
记住:一个矩阵对应一个局部坐标系。
转载地址: http://www.bubuko.com/infodetail-435954.html