我想移动一个物体(我有一个简单的矩形),我想把它移到一个特定的位置然后回来(也许永远重复)。
我知道我应该在矩阵转换(gltranslate)中有一个变量但是我在哪里/如何制作这个变量并为每个帧设置动画。
答案 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));
这涵盖了一种非常原始的方式来做你所描述的,也考虑这个伪代码,因为我不知道你正在使用什么函数以及你如何处理你的矩阵。