1

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

4

1 回答 1

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();
}
于 2012-07-19T09:24:10.237 回答