我有下面的代码。有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);