AE 回弹表达式
nearestKeyIndex = 0;if (numKeys > 0){nearestKeyIndex = nearestKey(time).index;if (key(nearestKeyIndex).time > time){nearestKeyIndex--;}}if (nearestKeyIndex == 0) {currentTime = 0;} else {currentTime = time - key(nearestKeyIndex).time;}if (nearestKeyIndex > 0 && currentTime < 1) {calculatedVelocity = velocityAtTime(key(nearestKeyIndex).time - thisComp.frameDuration / 10);amplitude = 0.04;// 反弹的力度&距离,值越大 反弹越强烈frequency = 2.0;// 频率,每秒反弹次数decay = 6.0;// 衰减,数值越大,越快停止value + calculatedVelocity * amplitude * Math.sin(frequency * currentTime * 2 * Math.PI) / Math.exp(decay * currentTime);} else {value;}
路径循环表达式
在做路径动画时,直接添加 loop 循环表达式会报错,如何让路径循环?
可以循环路径的表达式来了
try{timeStart = thisProperty.key(1).time;duration = thisProperty.key(thisProperty.numKeys).time-timeStart;pingPong = false; //change to true value if you want to loop animationn back & forthquant=Math.floor((time-timeStart)/duration);if(quant<0) quant = 0if(quant%2 == 1 && pingPong == true){ t = 2*timeStart+ (quant+1)*duration - time;}else{t = time-quant*duration;}}catch(err){t = time;}thisProperty.valueAtTime(t)
注意:第四行是设置改动画是否需要 往复运动(pingpong),默认是 false ,就是不需要往复运动,就是正常的循环 跟 Loop 循环表达式的(cycle) 一样。
如果需要往复运动 第四 行的 false 改为 ture 即可。
抖动循环表达式
在前面我们学过 wiggle 表达式
wiggle(freq, amp) 摆动函数,第一个参数freq指的是摆动的频率,频率数值越大,晃动越激烈,第二个参数amp指的是摆动的幅度,幅度数值越大,晃动范围越广。
在循环动画中,单纯的使用这个抖动表达式,是达不到循环的效果。
So,今天给大家分享一个 抖动循环表达式。
freq = 1;amp = 110;loopTime = 3;t = time % loopTime;wiggle1 = wiggle(freq, amp, 1, 0.5, t);wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopTime);linear(t, 0, loopTime, wiggle1, wiggle2)
很好理解,Frep 是频率、amp 是幅度、loopTime 是循环的时间(单位是秒)
这三个值可以根据应用场景修改的。
循环
loopOut(type = "pingPong", numKeyframes = 0)
循坏旋转
cycle=360; //循环周期n=1; //转速(需为整数)cycle*n/thisComp.duration*time
弹性
mp = .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}
回弹
e =0.7;//弹力g =1000;//重力nMax = 9;//最大弹跳次数n = 0;if (numKeys > 0){n = nearestKey(time).index;if (key(n).time > time) n--;}if (n > 0){t = time - key(n).time;v = -velocityAtTime(key(n).time - .001)*e;vl = length(v);if (value instanceof Array){vu = (vl > 0) ? normalize(v) : [0,0,0];}else{vu = (v < 0) ? -1 : 1;}tCur = 0;segDur = 2*vl/g;tNext = segDur;nb = 1; // number of bounceswhile (tNext < t && nb <= nMax){vl *= e;segDur *= e;tCur = tNext;tNext += segDur;nb++}if(nb <= nMax){delta = t - tCur;value + vu*delta*(vl - g*delta/2);}else{value}}elsevalue
3D坐标转2D坐标
thisComp.layer('三维层名字').toComp([0,0,0])
