原文:http://hi.baidu.com/fairzy/blog/item/fb4ab3cbb5416819be09e6eb.html
今天忽然感悟到为什么在进行变换之前要用glPushMatrix();这个函数,而在变换完毕后有用glPopMatrix()这两个函数了,赶紧记下来:
我们在变换坐标的时候,使用的是glTranslatef(),glRotaef()等函数来操作,操作的是什么呢?操作的是当前矩阵,我们也知道,这些坐标变换(翻转,旋转也好)都是通过操作矩阵来实现的,而矩阵相乘是会叠加的,当你用完一个变换函数后,当前操作的矩阵就被改变了,当你还停留在变换以前的思维,我在这个地方绘制恰好是我想要的时候,你会发现再绘制出来的不是在你想要的位置,因为你在操作变换的时候,当前矩阵被改变了。
当你做了一些移动或旋转等变换后,使用glPushMatrix();OpenGL 会把这个变换后的位置和角度保存起来。然后你再随便做第二次移动或旋转变换,再用glPopMatrix();OpenGL 就把刚刚保存的那个位置和角度恢复。
比如:
比如你在默认情况下在原点画了一个球,然后又进行了一个变换,比如用glTranslatef( 0.0, 0.0, 1.0 );沿z轴移动一定距离又画了一个球,然后你想再在原点画一个大一点的球覆盖原来的那个,当你绘制的时候就会发现,你现在绘制的球已不在你想像的地方了。
我们来做个实验:
代码如下:
当我们把glPushMatrxi()和glPopMatrix()注释掉以后我们发现,当我们再想在同样的位置绘制一个正方形的时候,就会发现已经按我们的glTransfef()所指定的沿x轴偏移了0.2个单位。
而当我们不把两句函数调用注释掉时,运行发现,绿色的正方形覆盖了原来的红色的正方形。
所以,这两个函数的压栈弹栈是有用地~~~~~~~~~~
这两个函数的具体的执行方式就不扯了,网上n多。
知之为知之,不知百度之
~~~~~~~~~~~~吼吼~~~~~~~~~~
续文:
顿悟这点以后,晚上又突然想明白了另一个大问题:移动光源的位置。
在顿悟以前,总觉得光源该怎么移动呢?那不是十分十分麻烦么,而且不知道怎么办,现在明白了这个道理以后,光照的移动就简单了。
移动方式:
先pushMatrix()一下,然后在进行移动操作,然后旋转操作,然后指定光源的位置,然后PopMatrix()一下,就完成了。
测试代码: