两个正二十面体上的OPENGL动画变慢

3

我有以下代码。有两个发光的二十面体在非常快速地旋转。我应该怎么做才能使旋转变慢?我不是很擅长OpenGL,我已经尝试修改Idle函数中的值,但仍然无法减缓速度。

void 
display(void)
{
  static GLfloat amb[] =
  {0.4, 0.4, 0.4, 0.0};
  static GLfloat dif[] =
  {1.0, 1.0, 1.0, 0.0};


  amb[3] = dif[3] = cos(s) / 2.0 + 0.5;
  glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);

  glPushMatrix();
  glTranslatef(-0.3, -0.3, 0.0);
  glRotatef(angle1, 1.0, 5.0, 0.0);
  glCallList(1);        /* render ico display list */
  glPopMatrix();

  glClear(GL_DEPTH_BUFFER_BIT);
  glEnable(GL_LIGHT2);
  glDisable(GL_LIGHT1);
  amb[3] = dif[3] = 0.5 - cos(s * .95) / 2.0;
  glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);

  glPushMatrix();
  glTranslatef(0.3, 0.3, 0.0);
  glRotatef(angle2, 1.0, 0.0, 5.0);
  glCallList(1);        /* render ico display list */
  glPopMatrix();

}

void 
idle(void)
{
  angle1 = (GLfloat) fmod(angle1 + 0.8, 360.0);
  angle2 = (GLfloat) fmod(angle2 + 1.1, 360.0);
  s += 0.05;
  glutPostRedisplay();
}

void 
visible(int vis)
{
  if (vis == GLUT_VISIBLE)
    glutIdleFunc(idle);
  else
    glutIdleFunc(NULL);
}

2
angle1 + 0.08angle2 + 0.11 - Rabbid76
我已经修改了相应的值,但动画没有减速。 - Ioana
阅读:https://gafferongames.com/post/fix_your_timestep/ - Richard Critten
还可以尝试这个:编译时,编译为发布版本,而不是调试版本。这可以提高性能。 - Makketronix
1个回答

1

在C++中,我建议使用 std :: chrono 来计算时间间隔:

在应用程序的主循环开始之前,请记住记录开始时间:

#include <chrono>

typedef std::chrono::high_resolution_clock TClock;
typedef std::chrono::duration<long, std::milli> Tms;

TClock::time_point start_time; // global start time

....

start_time = TClock::now();

idle函数中计算持续时间:

double time_duration_seconds = 0.0; // past time in seconds

void idle(void)
{
     TClock::time_point current_time = TClock::now();

     long milli_seconds = 
         std::chrono::duration_cast<Tms>( current_time - start_time ).count();

     time_duration_seconds = (double)milli_seconds / 1000.0;
}

一个间隔不变的旋转角度可以很容易地计算出来。以下代码计算了5秒内完成一次完整旋转的角度(以度为单位):
double interval1 = 5.0; // 5 seconds for 360 degrees
double angle1    = 360.0 * fmod(time_duration_seconds / interval1, 1.0f);

非常感谢!在您的帮助下,我解决了这个问题! - Ioana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接