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: 我的代码和源代码不同,但是功能一样

posted @ 2020-05-18 22:48  采男孩的小蘑菇  阅读(292)  评论(0编辑  收藏  举报