在OpenGL中平滑移动方向转换

时间:2012-11-06 16:17:25

标签: opengl animation for-loop rotation

我有一个带有小字符的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()。换句话说,它仍然突然改变方向,但略有初始延迟。

有没有办法让这项工作正常(或更好,更有效)?

1 个答案:

答案 0 :(得分:1)

glutPostRedisplay不会导致立即重绘,但只是设置一个标志,即下次事件循环迭代时将调用显示函数。

作为一般规则,您不应该从输入事件处理程序中播放动画。相反,你应该设置动画参数,在你的情况下是新的目标方向,它在动画代码中应用于显示函数调用之间。测量显示调用之间的时间并相应地推进动画。 从不 通过循环循环播放动画!