amp = .1;
freq = 2.0;
decay = 2.0;
n = 0;
if (numKeys > 0)
{n = nearestKey(time).index;
if (key(n).time > time){n--;}}
if (n == 0){ t = 0;}
else{t = time - key(n).time;}
if (n > 0){v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);?}
else{value}?
表達(dá)式解析:
首先,
定義變量并賦值
amp =0.1;(振幅)
freq = 2.0;(頻率)
decay = 2.0;(衰減)
n=numKeys;(關(guān)鍵幀的數(shù)量)
有兩種情況,一種是n等于0,沒有關(guān)鍵幀,直接返回物體本身位置的值,
if(n==0){value;}??????
另一種是當(dāng)n不等于0時(shí),也就是說key了關(guān)鍵幀時(shí)的情況。首先我們要明確以下的這些判定都是在n不等于0的條件下成立的,所以else這里用了一個(gè)嵌套。
else{
無(wú)論有幾個(gè)關(guān)鍵幀,我們都希望在最后一個(gè)關(guān)鍵幀處開始做彈性動(dòng)畫,所以首先我們要判定指針與末幀的位置關(guān)系。
{t=time-key(n).time;}
當(dāng)t>0,指針在末幀的右側(cè),開始做彈性動(dòng)畫。
if(t>0)
我們要讓物體到達(dá)末幀后速度越來越小,直到0的時(shí)候,再返回回去,就像一個(gè)正弦運(yùn)動(dòng)。
首先我們要找到物體在末幀的速度值,因?yàn)槟矬w停止,所以此處我們應(yīng)該找到指針在末幀左側(cè)并無(wú)限逼近末幀時(shí)的物體的速度值。
{v=velocityAtTime(key(n).time-thisComp.frameDuration/2);
因?yàn)檎疫\(yùn)動(dòng)是等幅的,但我們要讓它隨著時(shí)間的推移,幅度越來越小,所以我們要在正弦函數(shù)上除以一個(gè)隨著時(shí)間推移成指數(shù)倍增大的一個(gè)值。
value+v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);}
當(dāng)t<=0時(shí),即指針在末幀左側(cè),此時(shí)我們直接返回物體本身位置值。
else{value;}
}
作者:cfso2773
鏈接:http://www.itdecent.cn/p/2c0ff1f68f4d
來源:簡(jiǎn)書