【问题标题】:Glut: how to generate constant time interval for uniform movement?Glut:如何为均匀运动生成恒定的时间间隔?
【发布时间】:2023-03-20 11:51:02
【问题描述】:

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

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

    }

}

【问题讨论】:

    标签: c++ opengl glut


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多