我应该如何在循环中使用glutPostRedisplay在事件发生时多次调用显示?

时间:2012-07-19 07:07:43

标签: opengl glut

我是opengl的新手。 当用户按下某个键时我想画几次我的场景,当按下键时我在for循环中调用了glutPostRedisplay,但它只是重绘了我的场景一次。我该如何处理这个问题?

1 个答案:

答案 0 :(得分:2)

首先, glutPostRedisplay 是一个属于GLUT的函数,它不是OpenGL的一部分,而是第三方库/框架。还有其他框架,或者你可以从头开始做任何事情(哎呀,我只记得,当我14年前开始学习OpenGL时,GLUT不适合我,所以我从头开始编写我的框架)。

  

我想在用户按某个键

时画几次我的场景

从不将绘图和动画逻辑与事件处理混合在一起。如果用户按下了触发某个动画的键,设置了一个标志(=某个变量),应该播放动画,然后在渲染/动画循环中迭代动画。

  

我按下键时在for循环中调用了glutPostRedisplay,但它只是重绘了我的场景一次

glutPostRedisplay不会立即触发重绘。它设置了一个标志,GLUT消息循环会在所有消息处理后发出重绘而不是空闲。当然这个标志不会累积。

所以这是使用GLUT的布局。不幸的是,GLUT对于这类事情来说并不是最理想的,因为它不能让你控制事件循环,这使得精确计时变得很麻烦。

time_t rendertimer;
void stopwatch(time_t); // some external helper function that reports time between calls

typedef enum {stop, play} animstate;

struct animation {
    float time;
    float duration;
    animstate state;
};

animation animations[...];

void keyboard(key, x, y)
{
    if(key == ...) {
        animations[0].time = 0;
        animations[0].state = play;
    }

    glutPostRedisplay();
}

void idle()
{
    float deltaT = stopwatch(rendertimer);

    if( animation[...].state == play ) {
        animation[...].time += deltaT;
        if( animation[...].duration <= animation[...].time ) {
             animation[...].state = stop;
        }
    }

    glutPostRedisplay();
}

void display()
{
    draw_objects_according_to_animation();
}