作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在固定的时间间隔后依次旋转一个红色三角形和一个绿色三角形。我尝试了以下代码,但时间间隔不是常数。我无法找出问题所在。
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();
}
}
最佳答案
在任何事情之前,您是否尝试过调试 101:打印关键变量?我非常有信心,如果这样做 cout << now % 3000 << endl
您可以自己找到问题的根源。
对于答案:
now % 3000 == 0
这似乎不是个好主意。
你怎么能确定glutGet(GLUT_ELAPSED_TIME)
会增加 1, 2, 3, ...?如果渲染一帧需要 2 毫秒并且发生以下情况怎么办:2998、2999、3001?您刚刚失去了一次切换时间。
由于重绘所花费的时间不可预测,因此很难完全精确地计算渲染时间。
在您的情况下,一个好的近似值可能是:
now % 6000 < 3000
这应该可以正常工作,因为 3 秒比调用显示的频率大得多。
然而,在大多数应用程序中,我们需要连续移动,最好的选择是使用如下代码使移动与实际时间流逝成比例:
float dt;
int t, oldT;
t = glutGet(GLUT_ELAPSED_TIME);
dt = (t - oldT)/1000.0;
oldT = t;
drawTriangle(rotationSpeed * dt);
关于c++ - 过剩:如何为均匀运动生成恒定的时间间隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20965956/
我是一名优秀的程序员,十分优秀!