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 & forth
quant=Math.floor((time-timeStart)/duration);
if(quant<0) quant = 0
if(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 bounces
while (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
}
}else
value
3D坐标转2D坐标
thisComp.layer('三维层名字').toComp([0,0,0])