openGL 2 生成动画

#include <GL/glut.h>

GLfloat x = 0.0f;
GLfloat y = 2.0f;
GLfloat len = 25.0f;
GLfloat stepW=1.0f;
GLfloat stepH=-1.0f;
GLfloat winW;
GLfloat winH;

void renderScene() {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.98f, 0.625f, 0.12f);
    glRectf(x, y, x+len, y-len);
    glutSwapBuffers();
}

void changeSize(GLsizei w, GLsizei h) {
    GLfloat a;
    if (h == 0) h = 1;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    a = (GLfloat)w / (GLfloat)h;
    if (w <= h) {
        winW = 100; 
        winH = 100 / a;
        glOrtho(-100.0, 100.0, -winH, winH, 1.0, -1.0);
    }
    else {
        winW = 100 * a;
        winH = 100;
        glOrtho(-winW, winW, -100.0, 100.0, 1.0, -1.0);
    }
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void timerFunc(int v) {
    if (x + len > winW || x < -winW) stepW *= -1;
    if (y > winH || y - len < -winH) stepH *= -1;
    x += stepW;
    y += stepH;

    //检查边界,防止方块在反弹的时候窗口变小,使方块出现在新的裁剪区域之外
    if (x + len > winW + stepW) x = winW - len - 1;
    else if (x < -(winW + stepW)) x = -winW - 1;

    if (y > winH + stepH) y = winH - 1;
    else if (y - len < -(winH + stepH)) y = -winH + len - 1;

    glutPostRedisplay();
    glutTimerFunc(33, timerFunc, 1);
}

void setupRC() {
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
}

void main() {
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutCreateWindow("会反弹的正方形");
    glutDisplayFunc(renderScene);
    glutReshapeFunc(changeSize);
    glutTimerFunc(33, timerFunc, 1);
    setupRC();
    glutMainLoop();
}

双缓冲:

所有图形程序包最重要的特性之一就是对双缓冲的支持,这个特性允许在屏幕之外的一个缓冲区中执行绘图代码,然后使用一条交换命令把所绘制的图形立即显示在屏幕上。

双缓冲有两个用途,① 第一个是一些复杂的绘图可能需要比较长的时间,可能并不希望在屏幕上显示图形合成的每个步骤,使用双缓冲的话可以合成一副图像,并在完成之后进行显示,从而确保用户不会看到一副不完整的图像,图像只有在完全完成之后才能在屏幕上面显示;② 第二个用途是动画,每个帧都在屏幕之外的缓冲区绘制,待完成之后快速交换到屏幕中。

 

GLUT函数库允许注册一个回调函数,从而更方便地设置简单的动画序列。这个函数是glutTimerFunc,它的参数包括需要调用的函数名以及这个函数被调用之前的等待时间:

glutTimerFunc ( unsigned int msecs, void (*func) (int value), int value);这个函数让GLUT等待msecs毫秒,然后再调用 func 函数。可以在value参数中传递一个用户定义的值。和windows的计时器不同,这个计时器只会出发一次,所以为了产生连续的动画,还需要在计时器函数中重新设置定时器。

 

reference:

openGL 超级宝典

posted on 2016-10-17 16:11  seapx  阅读(764)  评论(0)    收藏  举报

导航