Animation 如何在opengl es 2.0中保留动画位置
我正在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 如何在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
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;
}