我是opengl的新手。 当用户按下某个键时我想画几次我的场景,当按下键时我在for循环中调用了glutPostRedisplay,但它只是重绘了我的场景一次。我该如何处理这个问题?
答案 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();
}