GLUT Tutorials 4: GLUT动画
博客转自:http://blog.csdn.net/xie_zi/article/details/1911793
到现在为止,我们有了一个画着一个白色三角形的OpenGL窗口,但一点也不激动人心。现在让我们在这节教程里,让这个三角形自己旋转起来。
让我们回到main()函数,增加些额外的设置。首先告诉GLUT我们想要一个双缓冲区。双缓冲区通过在后一个缓冲区里绘画,并不停交换前后缓冲区(可见缓冲区),来产生平滑的动画。使用双缓冲区可以预防闪烁。
glutInitDisplayMode(GL_DEPTH|GLUT_DOUBLE|GLUT_RGBA);
接着我们要做的是告诉GLUT,当应用程序空闲的时候渲染函数应该被调用。这导致GLUT一直调用渲染函数而产生动画。GLUT提供了一个函数:glutIdleFunc.这个函数使另一个函数在程序空闲的时候就会被调用。
void glutIdleFunc(void(*func)(void));
参数:
func:在程序空闲的时候就会被调用的函数的函数名。
按照我们的想法,当程序空闲时应该调用的函数是我们先前定义的渲染函数: renderScene。由于OpenGL默认没有开启深度测试,我们还要开启它,这样我们才能知道哪个物体在前面,哪个物体在后面。深度测试的开启在main()函数里,下面看看现在的main函数。
int main(int argc, char** argv) { glutInit(&argc, argv); //glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(200, 200); glutInitWindowSize(600,600); glutCreateWindow("GLUT Tutorials"); glutDisplayFunc(renderSence); glutReshapeFunc(reShape); // 这里让程序空闲时调用renderScene, glutIdleFunc(renderSence); glEnable(GL_DEPTH_TEST); glutMainLoop(); return 0; }
下面就是设置渲染函数renderScene。我们定义了一个浮点型变量并初始化为0.0,下面在renderScene函数加一些必须的东西。
#include <gl/glut.h> float rotateAngle = 0.0; void renderSence() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //保存当前模型视图矩阵。 glPushMatrix(); glRotatef(rotateAngle, 0.0, 1.0, 0.0); glBegin(GL_TRIANGLES); glVertex3f(-0.5, -0.5, 0.0); glVertex3f(0.5, 0.0, 0.0); glVertex3f(0.0, 0.5, 0.0); glEnd(); //弹出堆栈 glPopMatrix(); glutSwapBuffers(); rotateAngle +=0.01; //glFlush(); } void reShape(int width , int height) { //防止除数即高度为0 //(你可以设置窗口宽度为0) if (height == 0) height = 1; float ratio = 1.0* width / height; // 单位化投影矩阵。 glMatrixMode(GL_PROJECTION); glLoadIdentity(); //设置视口大小为增个窗口大小 glViewport(0, 0, width, height); // 设置正确的投影矩阵 gluPerspective(45, ratio, 1, 1000); //下面是设置模型视图矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, -1.0, 0.0f, 1.0f, 0.0f); } int main(int argc, char** argv) { glutInit(&argc, argv); //glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(200, 200); glutInitWindowSize(600,600); glutCreateWindow("GLUT Tutorials"); glutDisplayFunc(renderSence); glutReshapeFunc(reShape); // 这里让程序空闲时调用renderScene, glutIdleFunc(renderSence); glEnable(GL_DEPTH_TEST); glutMainLoop(); return 0; }
glutSwapBuffers函数交换了前后缓冲区,函数原型如下:
void glutSwapBuffers();
好了,我们得到了一个旋转的三角形,你可以下载这个VC工程在这里(glut2.zip)。很棒吧?。但再次说下,我们不会渲染一些十分精美的画面,这是为了保持代码的简洁。也因为主要是学习GLUT。
TIPS: 我的代码和源代码不同,但是功能一样