抖动表达式

wiggle(freq, amp, octaves = 1, amp_mult = 0.5, t = time) 

原理:freq=频率(设置每秒抖动的频率);amp=振幅(每次抖动的幅度);octaves=振幅幅度(在每次振幅的基础上还会进行一定的震幅幅度,很少用);amp_mult=频率倍频(默认数值即可,数值越接近0,细节越少;越接近1,细节越多);t=持续时间(抖动时间为合成时间,一般无需修改);一般只写前两个数值即可。

时间表达式

time*n

原理:time表示时间,以秒为单位,timen =时间(秒数)n (若应用于旋转属性,则n表示角度) ;例如在旋转属性上设置time表达式为time*60,则图层将通过1秒的时间旋转60度,2秒时旋转到120度以此类推(数值为正数时顺时针旋转,为负数时逆时针旋转)。

索引表达式

index*n

原理:为每间隔多少数值来产生多少变化。若为图层1的旋转属性添加表达式,则第一个图层会旋转5度,之后按Ctrl+D去复制多个图层时,第2个图层将旋转10度,以此类推;若想第一层图形不产生旋转保持正常形态,复制后的图形以5度递增,表达式可写为(index-1)*5。

随机表达式

random(x,y)

若为数字源文本添加表达式random(20),则数据会随机改变,最大值不会超过20;
若为数字源文本添加表达式random(10,100),则数据会在10<数值<100之间随机改变;
若为数字源文本添加表达式seedRandom(5, timeless = false),random(50),则数据会在50以内随机改变(前面的5是种子数,如一张画面中需要多个相同区间的数值做随机变化,就要为他们添加不同的种子数,防止两者随机变化雷同),若希望数字随机变化为整数则应添加表达式为Math.round(random(2,50)),表示在2和50之间随机改变无小数。

循环表达式

loopOut("continue")延续属性变化的最后速度
loopOut("pingpong")是类似像乒乓球一样的来回循环
loopOut("cycle")   是周而复始的循环 
loopOut("continue")延续属性变化的最后速度
loopOut("offset")  是重复指定的时间段进行循环 

可以添加numkeyframes=0是循环的次数,0为无限循环,1是最后两个关键帧无限循环,2是最后三个关键帧无限循环,以此类推。


模版表达式可直接复制粘贴使用

挤压(作用在缩放)

maxDev = 12;
spd = 27;
decay = 2.0;
t = time - inPoint;
x = scale[0] + maxDev*Math.sin(spd*t)/Math.exp(decay*t);
y = scale[0]*scale[1]/x;
[x,y]

静态单属性随机

seedRandom(index, true)
s = random(40,80);
[1,s]

闪烁(作用在透明度)

freq = 10;  // freq越大,闪烁的越快
n = Math.sin(time*freq);
n<0 ? 0 : 100 

if else语句

if (条件){
  当条件为 true 时执行的代码
  }else{
  当条件不为 true 时执行的代码
}
if (time>5){
  wiggle(7,7)
  }else{
  transform.position
}

弹性动画

freq = 3;
decay = 5;
n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
if (n > 0){
t = time - key(n).time;
amp = velocityAtTime(key(n).time - .001);
w = freq*Math.PI*2;
value + amp*(Math.sin(t*w)/Math.exp(decay*t)/w);
}else
value
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}

回弹

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

旋转动画

Math.sin作用在旋转(有幅度的旋转)
Math.sin(time*5)*40
Math.sin(time*n)*m——n频率,m振幅,时间单位为秒。n/s、m/s

Math.floor作用在旋转(以锚点为中心旋转)
Math.floor(time*1)*10
Math.floor(time*n)*m——n表示每秒旋转次数,m旋转幅度。

无序晃动(飞舞的动物等)

freq = 2;  amp = 100; 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)

路径循环动画

valueAtTime(time%key(numKeys).time)

数字递增动画

滑块控制.value.toFixed(X)+“%”

单一轴的缩放动画

x=wiggle(8,5);
[x[0],x[0]];
最后修改:2025 年 05 月 29 日
如果觉得我的文章对你有用,请随意赞赏