AE十大常用 表达式
1.反弹
e = .3; // 弹力
g = 1; // 重力
nMax = 10; // 最大反弹次数
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*1000);
tNext = segDur;
nb = 1;
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*1000)*delta/2);
}else{
value
}
}else
value
2.弹性
amp = .04;//幅度
freq = 2;// 值越高, 频率越高
decay = 5;// 值越高, 延迟越小
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;
}
3.弹性变形
maxDev = 20; //最大形变大小
spd = 30; //速度
decay = 1.0; //静止快慢
t = time - inPoint;
x = scale[0] + maxDev*Math.sin(spd*t)/Math.exp(decay*t);
y = scale[0]*scale[1]/x;
[x,y]
4.弹性文字
delay = 0.03; // 延迟
freq = 3; // 频率
amp = 60; // 幅度
decay = 10; // 值越小,弹性越大
Speed = 0.8; // 值越小,动画越慢
myDelay = delay*textIndex;
t = (time - inPoint)*Speed - myDelay;
if (t >= 0){
freq;
amp;
decay;
s = amp*Math.cos(freq*t*2*Math.PI)/Math.exp(decay*t);
[s,s] }else{
value
}
5.随机循环(对随机效果再进行循环)
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)
6.对齐运动方向
try{
cornerEase = 3;// 角度松弛
p = transform.position;
t = Math.min(Math.max(time,p.key(1).time+.001),p.key(p.numKeys).time);
pre = position.valueAtTime(t-thisComp.frameDuration*cornerEase);
post = position.valueAtTime(t+thisComp.frameDuration*cornerEase);
delta = post-pre;
orient = radiansToDegrees(Math.atan2(delta[0],-delta[1]));
value+orient+180;// 180可调整转动角度
}catch(err){value}
7.目标注视
function lookAtMe(fromPt, toPt){
lkAt = lookAt(fromPt, toPt);
if (toPt[1] > fromPt[1]){
return 180-lkAt[1];
} else {
return lkAt[1];
}
}
p0= transform.position; //look from point
p1=thisComp.layer("空 2").transform.position; //目标点位置
lookAtMe(p0, p1)+0 //0数值可调整旋转角度
8.循环路径
valueAtTime(time % key(numKeys).time)
9.标记控制关键帧
try{
if(marker.numKeys>1&&numKeys>1){
beginAnim=marker.key(1).time;
endAnim=marker.key(2).time;
markerMoveTime=endAnim-beginAnim;
keyStart=key(1).time;
keyStartN=key(2).time;
keyEnd=key(3).time;
if(time>=beginAnim && time<=endAnim)
{if((time-beginAnim)>=(keyStartN-keyStart)){valueAtTime(keyStartN);}
else valueAtTime(keyStart+(time-beginAnim));
}
else if(time>endAnim)
{valueAtTime(keyEnd+(time-endAnim));}
else if(time<beginAnim) {valueAtTime(keyStart);}
else {value;}
}else value;
}catch(err){value;}
10.计时器
rate=1;// 速率
clockStart=0;// 开始时间点
function minZero(n){
if(n<10)return"0"+n
else
return""+n
};
function secZero(n){
if(n<10)return"0"+n
else
return""+n
};
clockTime=Math.max(clockStart+rate*(time-inPoint),0);
t=Math.floor(clockTime);
min=Math.floor((t%3600)/60);
sec=Math.floor(t%60);
minZero(min)+":"+secZero(sec)