OPENGL慢速动画在2 Icosaedres上

OPENGL SLOWER ANIMATION on 2 Icosaedres

本文关键字:Icosaedres 动画 OPENGL      更新时间:2023-10-16

我有下面的代码。有2个发光的二十叶草旋转得非常非常快。我应该怎么做才能使旋转变慢?我不太擅长 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);
}

在 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);