Glut:如何为均匀运动生成恒定的时间间隔?

Posted

技术标签:

【中文标题】Glut:如何为均匀运动生成恒定的时间间隔?【英文标题】:Glut: how to generate constant time interval for uniform movement? 【发布时间】:2014-01-07 07:12:39 【问题描述】:

我试图在固定时间间隔后依次旋转一个红色三角形和一个绿色三角形。试了下面的代码,时间间隔不是固定的,一直想不通。

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

    


【问题讨论】:

【参考方案1】:

在任何事情之前,您是否尝试过调试 101:打印关键变量?我很有信心,如果你做cout << now % 3000 << endl,你可以自己找到问题的根源。

答案:

now % 3000 == 0

似乎不是个好主意。

您如何确定glutGet(GLUT_ELAPSED_TIME) 将递增为 1、2、3、...?如果渲染一帧需要 2 毫秒并且会发生以下情况怎么办: 2998、2999、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);

【讨论】:

以上是关于Glut:如何为均匀运动生成恒定的时间间隔?的主要内容,如果未能解决你的问题,请参考以下文章

如何为节点红色的模块添加一定的时间间隔?

在rxjs6中以随机间隔生成值流?

使用ffmpeg编码时,如何设置恒定码率,并控制好关键帧I帧间隔

Matplotlib - x 轴与日期时间之间的不均匀间隔

均匀间隔水平导航项

均匀间隔子级,但将父级与 flex 右对齐