代码之家  ›  专栏  ›  技术社区  ›  thyrgle

如何在OpenGL中平滑地移动?

  •  3
  • thyrgle  · 技术社区  · 14 年前

    所以这是我的另一个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 回复  |  直到 14 年前
        1
  •  5
  •   Luca    14 年前

    如果我理解正确,问题是您修改了键盘事件上的对象位置,并在事件处理之后请求显示。

    为了获得平滑的动画,应该在键盘事件处理中存储对象的最终位置,然后在渲染期间插入中间对象位置。 插值函数的推导给出了动画的速度。

    如果在单独的线程中执行事件处理,这会更好,因此事件处理不会阻塞(至少对于少数同步操作)呈现操作。