我试图在一个恒定的时间间隔后一个接一个地旋转一个红色三角形和一个绿色三角形。我尝试了下面的代码,时间间隔不是常数。我无法弄清楚问题。
static void display(void)
{
now=glutGet(GLUT_ELAPSED_TIME);
elapsedTime = now - interval;
if(flag)
{
if(now%3000==0)
{
flag=false;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
glRotatef(0.1,0.0,0.0,1.0);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5f, 0.5f, -5.0f);
glVertex3f(-1.0f, 1.5f, -5.0f);
glVertex3f(-1.5f, 0.5f, -5.0f);
glEnd();
glutSwapBuffers();
}
else
{
if(now%3000==0)
{
flag=true;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0,1,0);
glRotatef(-0.1,0.0,0.0,1.0);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5f, 0.5f, -5.0f);
glVertex3f(-1.0f, 1.5f, -5.0f);
glVertex3f(-1.5f, 0.5f, -5.0f);
glEnd();
glutSwapBuffers();
}
}
答案 0 :(得分:4)
在此之前,您是否尝试过调试101:打印关键变量?我非常有信心,如果cout << now % 3000 << endl
你可以自己找到问题的根源。
答案:
now % 3000 == 0
看起来不是一个好主意。
你怎么能确定glutGet(GLUT_ELAPSED_TIME)
会增加为1,2,3 ......?如果渲染一帧需要2 ms并且发生以下情况怎么办:
2998,2991,3001?你刚丢失了一个切换时间。
由于重绘所需的时间不可预测,因此很难在渲染时间上完全准确。
在你的情况下,一个很好的近似可能是:
now % 6000 < 3000
这应该可以正常工作,因为3s远远大于调用显示器的频率。
在大多数应用程序中,我们需要连续移动,最佳选择是使移动与实际时间失效成比例,代码如下:
float dt;
int t, oldT;
t = glutGet(GLUT_ELAPSED_TIME);
dt = (t - oldT)/1000.0;
oldT = t;
drawTriangle(rotationSpeed * dt);