如何在OpenGL中实现平滑运动?

3

这与我之前的OpenGL问题有关(不是我的OpenGL ES问题,而是桌面版的OpenGL)。如果你让某人按键来移动一个正方形,如何使正方形的移动更加自然和平滑,同时保持现在的速度?这是我的glutKeyboardFunc()函数的代码:

void handleKeypress(unsigned char key, int x, int y) 
{
        if (key == 'w')
        {
            for (int i = 0; i < 12; i++)
            {
                if (i == 1 || i == 7 || i == 10 || i == 4)
                {
                    square[i] = square[i] + 1;
                }
            }
            glutPostRedisplay();
        }
        if (key == 'd')
        {
            for (int i = 0; i < 12; i++)
            {
                if (i == 0 || i % 3 == 0)
                {
                    square[i] = square[i] + 1;
                }
            }
            glutPostRedisplay();
        }
    if (key == 's')
    {
        for (int i = 0; i < 12; i++)
        {
            if (i == 1 || i == 7 || i == 10 || i == 4)
            {
                square[i] = square[i] - 1;
            }
        }
        glutPostRedisplay();
    }
        if (key == 'a')
        {
            for (int i = 0; i < 12; i++)
            {
                if (i == 0 || i % 3 == 0)
                {
                    square[i] = square[i] - 1;
                }
            }
            glutPostRedisplay();
        }
}

如果这不太清楚,对不起。如果不理解,我会尝试以更好的方式重新表达。

1个回答

5
如果我理解正确,问题在于您在键盘事件上修改对象位置,并在处理该事件后请求显示。
为了实现平滑动画,应该在键盘事件处理时存储对象的最终位置,然后在渲染过程中插值计算中间对象位置。插值函数的导数给出了动画的速度。
如果在单独的线程中执行事件处理,则可以更好地工作,因此事件处理不会阻塞(至少对于少量同步操作)渲染操作。

Luca在插值方面的建议是正确的。此外,为了提高速度,您需要引入一个计时器。然后,在每个帧上移动正方形的距离应该是dS = U * dt,其中U是您的速度,dt是渲染前一帧所经过的时间。由于您正在使用glut,请查看glutTimerFunc()。 - jcage
我使用了Delta Time,但是出现了问题,我的物体一开始向左移动,然后突然过了一段时间后又开始向右移动,而且在几秒钟后这种情况又一再发生,有人可以帮忙吗? - Daniyal Javaid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接