2014-07-15 31 views
0

我做基于帧动画中的OpenGL ES 2.0如何保留在OpenGL ES的动画位置2.0

我想的矩形由在X轴200个像素并且还通过双放大到翻译300帧( 2个单位)在前100帧。 例如,矩形中心点的初始值(第0帧)在屏幕上为100像素(即rectCenterX = 100) 在第100帧时,rectCenterX = 300(100 + 200)像素。此外,矩形尺寸是原始尺寸的两倍。

然后,动画矩形必须停留在接下来的100帧(没有任何动画)。即对于帧101至200,rectCenterX = 300像素。 在第101帧,rectCenterX = 300像素。矩形尺寸是原始尺寸的两倍。 在第200帧时,rectCenterX = 300像素。矩形尺寸是原始尺寸的两倍。

然后,我想要相同的动画矩形在X轴上翻译+200像素,并在最后100帧中缩小一半(0.5单位)。 在第300帧时,rectCenterX = 500像素。矩形大小再次为原始大小。

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

总之,

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 

伪码: 的并条机下面()被用于在循环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期间保留动画矩形,我删除了“mySetIdentity(RectMVMatrix);”在上面的drawFrame()中。

现在在进入并条机()的第二框架,所述RectMVMatrix将具有第一帧的动画值

例如RectMVMatrix [4] [4] = {1.01,0,0,2, 0,1,0,0, 0,0,1,0, 0,0,0,1 }; // 2个像素翻译和1.01单位在第一帧后缩放 这个RectMVMatrix用于第二帧中的mytranslate()。翻译功能将影响“RectMVMatrix [0] [0]”的值。因此翻译也会影响缩放值。

最终输出出错了。

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

回答

0

虽然直接的答案是保存矩阵,您将需要以后我需要提出一个不同的系统,因为你的是非常不洁的,即使你为这个动画制作它,你可能在维护这个代码,添加动画或改变它。

要在对象的位置,比例,旋转甚至整个矩阵方面具有动画效果,我建议您在对象本身中创建每个参数(在CPU上),然后在每个帧上设置矩阵以标识然后从对象拥有的参数重新创建它。

因此,例如一个对象将有一个称为位置的矢量是可动画的。您需要的是持有3个位置参数,如positionCurrent,positionStart,positionEnd。现在,在对象上,你应该叫像animateWithFrameCount由于这种方法被调用需要设置:

positionStart = positionCurrent; 
positionEnd = input; 
currentFrame = 0; 
frameCount = inputFrameCount; 

然后实现的方法,如onFrame其中

currentFrame++; 
positionCurrent = positionStart + (positionEnd-positionStart)*(currentFrame/frameCount); //linear interpolation 
if(currentFrame >= frameCount) { 
    currentFrame = 0; 
    frameCount = 0; 
    positionStart = currentPosition = positionEnd; 
} 

如果实施该系统的所有动画参数你想你现在需要的就是这又应该是一个模型方法模型矩阵(伪):

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

所以,现在你drawFrame变得非常简单。在所有模型中,您需要调用onFrame,将矩阵设置为标识(或者可能是其他矩阵),将当前矩阵与从模型接收的矩阵相乘,然后绘制该矩阵。没有问题保留,在您的主要代码没有条件陈述...