我有一个带有小字符的OpenGL程序,可以使用箭头键在屏幕上移动。当一个人改变方向时,角色会相应地改变方向,基本上是这样的:
//Pressing the up arrow to go in the up direction
if(prevSwimDirection == RIGHT)
swimAngle = 90;
...
glutPostRedisplay();
游泳方向在代码中其他地方的显示功能中处理:
if(changesMode == SWIM_AROUND)
glRotatef((GLfloat)swimAngle, 0.0, 0.0, 1.0);
当然,这会导致方向瞬间突然改变。我试图让它们像这样平滑,但没有运气:
if(prevSwimDirection == RIGHT)
for(double i = swimAngle; i < 90; i += 0.00001){
swimAngle = i;
glutPostRedisplay();
}
我尝试使用各种值递增i并最终意识到计算似乎是在重新显示之前执行的,即使我在整个循环中调用了glutPostRedisplay()。换句话说,它仍然突然改变方向,但略有初始延迟。
有没有办法让这项工作正常(或更好,更有效)?
答案 0 :(得分:1)
glutPostRedisplay不会导致立即重绘,但只是设置一个标志,即下次事件循环迭代时将调用显示函数。
作为一般规则,您不应该从输入事件处理程序中播放动画。相反,你应该设置动画参数,在你的情况下是新的目标方向,它在动画代码中应用于显示函数调用之间。测量显示调用之间的时间并相应地推进动画。 从不 通过循环循环播放动画!