zoukankan      html  css  js  c++  java
  • 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: 我的代码和源代码不同,但是功能一样

  • 相关阅读:
    第02组 团队项目-需求分析报告
    团队项目-选题报告
    第二次结对编程作业
    第2组 团队展示
    Alapha冲刺(3/6)
    Alpha(2/6)
    Alpha冲刺(1/6)
    第2组 团队Git现场编程实战
    团队项目-需求分析报告
    团队项目-选题报告
  • 原文地址:https://www.cnblogs.com/flyinggod/p/12913557.html
Copyright © 2011-2022 走看看