Opengl的glPushMatrix和glPopMatrix理解

        glPushMatrix()和glPopMatrix()的配对使用可以消除上一次的变换对本次变换的影响,将本次需要执行的缩放、平移等操作放在两者之间。使本次变换是以世界坐标系的原点为参考点进行。

1)OpenGL中的modelview矩阵变换是一个马尔科夫过程:上一次的变换结果对本次变换有影响,上次modelview变换后物体在世界坐标系下的位置是本次modelview变换的起点。默认时本次变换和上次变换不独立。

2)OpenGL物体建模实际上是分两步走的。第一步,在世界坐标系的原点位置绘制出该物体;第二步,通过modelview变换矩阵对世界坐标系原点处的物体进行仿射变换,将该物体移动到世界坐标系的目标位置处。

3)将modelview变换放在glPushMatrix和glPopMatrix之间可以使本次变换和上次变换独立。

4)凡是使用glPushMatrix()和glPopMatrix()的程序一般可以判定是采用世界坐标系建模。既世界坐标系固定,modelview矩阵移动物体。

     Opengl中对于矩阵的操作都是对于矩阵栈的栈顶来操作的。当前矩阵即为矩阵栈的栈顶元素,而对当前矩阵进行平移、旋转等的变换操作也同样是对栈顶矩阵的修改。所以我们在变换之前调用glPushMatrix()的话,就会把当前状态压入第二层,不过此时栈顶的矩阵也与第二层的相同。当经过一系列的变换后,栈顶矩阵被修改,此时调用glPopMatrix()时,栈顶矩阵被弹出,且又会恢复为原来的状态。如下图所示

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


 

猜你喜欢

转载自blog.csdn.net/bpv_kiki/article/details/84997456