Animation 如何在opengl es 2.0中保留动画位置

Animation 如何在opengl es 2.0中保留动画位置,animation,matrix,opengl-es,Animation,Matrix,Opengl Es,我正在opengl es 2.0中为300帧制作基于帧的动画 我想要一个矩形在X轴上平移+200像素,并且在前100帧中放大两倍2个单位。 例如,矩形中心点的初始值第0帧为100像素,即屏幕上的rectCenterX=100; 在第100帧,rectCenterX=300 100+200像素。此外,rect大小是原始大小的两倍 然后,已设置动画的矩形必须在接下来的100帧中保持不变,而没有任何动画。i、 e.对于第101帧到第200帧,rectCenterX=300像素。 在第101帧,rect

我正在opengl es 2.0中为300帧制作基于帧的动画

我想要一个矩形在X轴上平移+200像素,并且在前100帧中放大两倍2个单位。 例如,矩形中心点的初始值第0帧为100像素,即屏幕上的rectCenterX=100; 在第100帧,rectCenterX=300 100+200像素。此外,rect大小是原始大小的两倍

然后,已设置动画的矩形必须在接下来的100帧中保持不变,而没有任何动画。i、 e.对于第101帧到第200帧,rectCenterX=300像素。 在第101帧,rectCenterX=300像素。rect大小是原始大小的两倍。 在第200帧,rectCenterX=300像素。rect大小是原始大小的两倍

然后,我希望相同的动画矩形在X轴上平移+200像素,并在最后100帧中缩小0.5个单位的一半。 在第300帧,rectCenterX=500像素。rect大小再次与原始大小相同

我使用简单的线性插值来计算每个帧的增量动画值

总之,

Animation-Type  Animation-Value  Start-Frame  End-Frame
1.Translate         +200            0           100
2.Scale             +2              0           100
3.Translate         +200            201         300
4.Scale             +0.5            201         300
伪代码: 下面的drawFrame在一个循环中执行300次300帧

float RectMVMatrix[4][4] = {1, 0, 0, 0,
                            0, 1, 0, 0,
                            0, 0, 1, 0,
                            0, 0, 0, 1
                           };   // identity matrix
int totalframes = 300;
float translate-delta;  // interpolated translation value for each frame
float scale-delta;  // interpolated scale value for each frame

// The usual code for draw is:
void drawFrame(int iCurrentFrame)
{
 // mySetIdentity(RectMVMatrix); // comment this line to retain the animated position.
  mytranslate(RectMVMatrix, translate-delta, X_AXIS); // to translate the mv matrix in x axis by translate-delta value
  myscale(RectMVMatrix, scale-delta); // to scale the mv matrix  by scale-delta value
  ... // opengl calls 
  glDrawArrays(...);
  eglswapbuffers(...);
}
上面的代码在前100帧可以正常工作。为了在第101帧到第200帧期间保留动画矩形,我删除了mySetIdentityRectMVMatrix;在上面的画框中

现在,在输入第二帧的drawFrame时,RectMVMatrix将具有第一帧的动画值

e、 g.RectMVMatrix[4][4]={1.01,0,0,2, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };// 第一帧后的2像素平移和1.01单位缩放 该矩阵用于第二帧中的mytranslate。translate函数将影响RectMVMatrix[0][0]的值。因此,平移也会影响缩放值

最终,输出是错误的


如何在不影响当前模型视图矩阵的情况下保留动画位置?

虽然直接的答案是保存稍后需要的矩阵,但我需要提出一个不同的系统,因为您的系统非常不干净,即使您为该动画制作,您也可能在维护该代码时遇到问题,添加或更改动画

要使对象在位置、比例、旋转甚至整个矩阵方面都可以设置动画,我建议您在CPU上创建对象本身中的每个参数,然后在每个帧上将矩阵设置为标识,然后根据对象拥有的参数重新创建

例如,一个物体会有一个叫做位置的向量,这个向量是可以设置动画的。您需要的是在positionCurrent、positionStart和positionEnd中保留3个位置参数。现在,在对象上,您应该调用类似animateWithFrameCount的内容,因为调用此方法时,您需要设置:

positionStart = positionCurrent;
positionEnd = input;
currentFrame = 0;
frameCount = inputFrameCount;
然后实现一个方法,比如onFrame,其中

如果您为所有可设置动画的参数实现此系统,您现在需要的是获取模型矩阵,该矩阵同样应为模型方法伪代码:

Matrix16f getModelMatrix {
   Matrix16f toReturn = Matrix16f.identity();
   toReturn.translate(currentPosition);
   toReturn.scale(currentScale);
   ...
   return toReturn;
}
现在你的抽绳架变得很直了。在所有模型上,您需要调用onFrame,将矩阵设置为identity或其他矩阵,将当前矩阵与从模型接收到的矩阵相乘,然后只绘制对象。保留没有问题,主代码中没有条件语句

Matrix16f getModelMatrix {
   Matrix16f toReturn = Matrix16f.identity();
   toReturn.translate(currentPosition);
   toReturn.scale(currentScale);
   ...
   return toReturn;
}