今天做到一道题,大致就是问glPushMatrix();和glPopMatrix();存在会对图形绘制造成什么影响,为了能够清晰的反应到底会存在什么影响,我特地写了两行代码:
代码①:
void draw1()
{//glClear(GL_COLOR_BUFFER_BIT); //注释掉为了能反映每次循环三角形的位置glBegin(GL_POLYGON); // 多边形glColor3f(0.0, 0.0, 1.0);glVertex2f(0.05, -0.65);glVertex2f(0.05, -0.75);glVertex2f(0.15, -0.8);glEnd();glFlush();
}
void display() {for (int i = 0; i < 3; i++) {glTranslatef(0.0, 0.02*i,0.0);draw1();}
}
这个是没有加push和pop操作的代码,我们可以看到每0.02个单位都会生成一个小三角形,也就是说在每次都清空背景的情况下我们可以看到一个一直匀速向上运动的小三角形:
代码②:
void draw1()
{//glClear(GL_COLOR_BUFFER_BIT); //注释掉为了能反映每次循环三角形的位置glBegin(GL_POLYGON); // 多边形glColor3f(0.0, 0.0, 1.0);glVertex2f(0.05, -0.65);glVertex2f(0.05, -0.75);glVertex2f(0.15, -0.8);glEnd();glFlush();
}void display() {for (int i = 0; i < 3; i++) {glPushMatrix();glTranslatef(0.0, 0.02*i,0.0);draw1();glPopMatrix();}
}
这个是加了push和pop操作的绘制,可以看到三角形并没有一直上移的趋势,一直都在一个移动区间内绘制,并且无限for循环,也就是说在每次绘制都清空背景的情况下我们会看到一个快速在区间内跳动的三角形:
原理解释
那么到底为什么会这样呢?经过查阅多方资料得知,glPushMatrix();和glPopMatrix();在OpenGL代码中的行为,其实就是一个压栈出栈的行为,不过他有一个特点就是“重置”,也就是他的配对使用可以消除上一次变换对于本次变换的影响,使得参考点回到最初的坐标原点,而不会随着图像的上移而一直上移,进而生成一个移动区间,从而达到图形在区间内运动的效果。