gpt4 book ai didi

c++ - 过剩:如何为均匀运动生成恒定的时间间隔?

转载 作者:行者123 更新时间:2023-11-27 23:09:52 27 4
gpt4 key购买 nike

我试图在固定的时间间隔后依次旋转一个红色三角形和一个绿色三角形。我尝试了以下代码,但时间间隔不是常数。我无法找出问题所在。

 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com