• OpenGLGLUT教程(四) 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函数。

    void main(int argc, char **argv) {

             glutInit(&argc, argv);

             

             // 在这里设置双缓冲区。

             glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

             

             glutInitWindowPosition(100,100);

             glutInitWindowSize(320,320);

             glutCreateWindow("3D Tech- GLUT Tutorial");

             glutDisplayFunc(renderScene);

             

             // 这里让程序空闲时调用renderScene

             glutIdleFunc(renderScene);

             

             glutReshapeFunc(changeSize);

             

             //开启深度测试。

             glEnable(GL_DEPTH_TEST);

             glutMainLoop();

    }

    下面就是设置渲染函数renderScene。我们定义了一个浮点型变量并初始化为0.0,下面在renderScene函数加一些必须的东西。

     

    float angle=0.0;

     

    void renderScene(void) {

     

             //注意我们这里清除了深度缓冲区。

             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

             

             //保存当前模型视图矩阵。

             glPushMatrix();

            

             glRotatef(angle,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();

             

             // angle自动增加。

             angle++;

    }

    glutSwapBuffers函数交换了前后缓冲区,函数原型如下:

    void glutSwapBuffers();

    好了,我们得到了一个旋转的三角形,你可以下载这个VC工程在这里(glut2.zip)。很棒吧?。但再次说下,我们不会渲染一些十分精美的画面,这是为了保持代码的简洁。也因为主要是学习GLUT

  • 相关阅读:
    c#获得本月份是本季度的第几个月
    C#如何把月份转换成季度
    日本是如何处理地沟油的?
    惊艳的“学长帮我修电脑” VS “我想作你的下一行code”
    居然有人用腾讯QQ的申诉,来找回被盗的奇瑞QQ汽车[有图有真相]
    你长得够安全吗?
    这一刻我被深深地震精了![视频]Visual Studio最新"煽情"广告 让我做你下一行code
    打击地球人专用图
    ReportViewer的动态绑定
    纯天然的野菜居然会致癌?
  • 原文地址:https://www.cnblogs.com/yangxi/p/2178483.html
Copyright © 2020-2023  润新知