简单来说,就是把矩阵压栈【glPushMatrix()】然后在弹出【glPopMatrix()】 。
我们在变换坐标的时候,使用的是glTranslatef(),glRotaef()等函数来操作,操作的是什么呢?操作的是当前矩阵,我们也知道,这些坐标变换(翻转,旋转也好)都是通过操作矩阵来实现的,而矩阵相乘是会叠加的,当你用完一个变换函数后,当前操作的矩阵就被改变了,当你还停留在变换以前的思维,我在这个地方绘制恰好是我想要的时候,你会发现再绘制出来的不是在你想要的位置,因为你在操作变换的时候,当前矩阵被改变了。
比如你在默认情况下在原点画了一个球,然后又进行了一个变换,比如用glTranslatef( 0.0, 0.0, 1.0 );沿z轴移动一定距离又画了一个球,然后你想再在原点画一个大一点的球覆盖原来的那个,当你绘制的时候就会发现,你现在绘制的球已不在你想像的地方了。
我们来做个实验:
代码如下:
void display()
{
glClear( GL_COLOR_BUFFER_BIT );
glShadeModel( GL_SMOOTH );
//现在原点绘制一个红色正方形
glColor3f( 1.0, 0.0, 0.0 );
glRectf( -0.05, -0.05, 0.05, 0.05 );
//glPushMatrix();
//变换--沿x轴移动
glTranslatef( 0.2, 0.0, 0.0 );
//glPopMatrix();
//再绘制一个正方形
glColor3f( 0.0, 1.0, 0.0 );
glRectf( -0.05, -0.05, 0.05, 0.05 );//这时,当我们还想在同样位置绘制时,却发现已经偏移
glFlush();
}
当我们把glPushMatrxi()和glPopMatrix()注释掉以后我们发现,当我们再想在同样的位置绘制一个正方形的时候,就会发现已经按我们的glTransfef()所指定的沿x轴偏移了0.2个单位。
阅读(3850) | 评论(0) | 转发(1) |