OpenGL Noob - > 2D动画

时间:2012-02-08 00:25:09

标签: opengl

我想移动一个物体(我有一个简单的矩形),我想把它移到一个特定的位置然后回来(也许永远重复)。

我知道我应该在矩阵转换(gltranslate)中有一个变量但是我在哪里/如何制作这个变量并为每个帧设置动画。

3 个答案:

答案 0 :(得分:0)

这是一个模糊的问题,但是这里有。从根本上说,您需要在某处(矩形本身或其他地方)存储矩形的位置。

每个帧,您调用Update方法来更新动画中的所有对象。这应该更新矩形的位置。

每个框架,您还可以调用Draw方法,该方法将矩形绘制在当前位置(您可以使用glTranslate作为其中的一部分。)

答案 1 :(得分:0)

对于一个旨在试验OpenGL调用和矩阵堆栈的简单程序,您可以创建一个全局变量来跟踪您的翻译。根据您正在使用的窗口库(GLUT,Qt等),您必须提供运行每个帧的动画功能,这将改变转换。它看起来像这样(我的例子使用GLUT):

    void animate()
    {
        /* Add some value to your translation */
        /* Perhaps use a sinusoidal function if you want oscillating behavior */

        glutPostRedisplay();
    }

您必须向您的窗口库指明必须定期调用此函数:

    glutIdleFunc(animate);

最后,正如您所提到的,在绘制四边形之前,您只需调用glTranslatef()并将其传递给全局变量(取决于您想要移动的轴)。

答案 2 :(得分:0)

很难确定你在哪个阶段,但假设你已经在屏幕上绘制了一个矩形图:

只要你有'drawMyRectangle'函数,就创建这些变量:

//Your starting position
float startPositionX;
float startPositionY;
//Your ending position
float endPositionX;
float endPositionY;
//The value that describes where in between these positions you are

float translationAlpha;
float animationDirection;

所以用translationAlpha填充这些值,从0开始,animatingForward从1开始。

我建议在单独的函数中执行下一部分,但是您需要用于处理动画的代码,只需

void step()
{
    translationAlpha += .01 * animationDirection;//.01 is the per
    if (animationDirection > 0.0 && translationAlpha >= 1.0 ||
        animationDirection < 0.0 && translationAlpha <= 0.0) {
        animationDirection *= -1.0;
    }
}

听起来你保持简单,所以每次画画时都要打电话。

因此,请确保您的画面周围有glPushMatrix和glPopMatrix。 pushMatrix之后,在你的平局之前添加:

glTranslate2f(startPositionX + translationAlpha * (endPositionX - startPositionX),
              startPositionY + translationAlpha * (endPositionY - startPositionY));

这涵盖了一种非常原始的方式来做你所描述的,也考虑这个伪代码,因为我不知道你正在使用什么函数以及你如何处理你的矩阵。