常用AE表达式解析
杭州/设计爱好者/361天前/195浏览
版权
常用AE表达式解析
首先什么是表达式呢?
表达式就是AE内部基于JavaScript编程语言开发的编辑工具,是一种用于控制动画和效果的脚本语言。你可以通过表达式来实现更复杂的动画,简化关键帧的使用,或者使图层之间的关系更加动态。表达式使用JavaScript作为基础,可以做很多事情。
比如:
1.自动化动画:通过编写表达式,你可以使某个参数根据其他参数变化,从而自动化动画过程。
2.创建周期性运动:比如使对象沿着正弦波曲线运动。
3.链接图层:可以通过表达式链接一个图层的属性到另一个图层,使得两个图层之间可以共享控制。
4.生成随机性:可以创建一些变化不定的效果,使动画看起来更自然。
表达式大部分情况下是可以更节约时间,提高工作效率的。
表达式工具
A.表达式开关B.表达式图表C.表达式关联器D.表达式语言菜单
由于AE里不同的属性的参数不同,常用的我们可以分为:数值(旋转/不透明度)、数组(位置/缩放)、布尔值(true代表“真”、false代表“假”/0代表“假”、1代表“真”)这三种形式来进行书写表达式。对于表达式AE也有很多内置的函数命令,直接可以在表达式语言菜单里面进行调用。
1. 无限旋转
time*360
原理:
time表示时间,以秒为单位,time*n =时间(秒数)*n (若应用于旋转属性,则n表示角度)
360,也就是每秒旋转一圈,数值也可以根据自己需求进行调整。
它在没有 k 关键帧的情况下旋转起来了。
2.路径循环
前面介绍的这个循环运动,它不肯作用在路径上,咋办!
那就……给路径换个表达式吧。
valueAtTime(time%key(numKeys).time)
3.
随机循环(对随机效果再进行循环)
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)
只要给小球的「位置」属性粘贴上这个表达式,就可以让它在有限的时间里随机循环抖动下去了。
4.抖动/摆动表达式
wiggle(freq, amp, octaves = 1, amp_mult = 0.5, t = time)
原理:
freq=频率(设置每秒抖动的频率);amp=振幅(每次抖动的幅度);octaves=振幅幅度(在每次振幅的基础上还会进行一定的震幅幅度,很少用);amp_mult=频率倍频(默认数值即可,数值越接近0,细节越少;越接近1,细节越多);t=持续时间(抖动时间为合成时间,一般无需修改);一般只写前两个数值即可。
5.弹性表达式
原理:
复制粘贴表达式使用就可以,amp表示振幅,freq表示频率,decay表示衰减
举例:
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);
amp = .03;
freq = 2.5;
decay = 4.0;
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
}else{value;}
注意:
motion2脚本也带此功能,方法不唯一。
6.运动拖尾
原理:
delay表示要延迟的帧数
举例:
为位置属性添加表达式
delay = 0.5;
d = delay*thisComp.frameDuration*(index - 1);
thisComp.layer(1).position.valueAtTime(time - d)
如想要实现不透明度拖尾需为不透明度属性添加表达式
opacityFactor =.80;
Math.pow(opacityFactor,index - 1)*100
(调整好一个图层后复制多个)
7.loopOut表达式(循环表达式)
原理:
loopOut(type="类型",numkeyframes=0)对一组动作进行循环loopOut(type="pingpong",numkeyframes=0)是类似像乒乓球一样的来回循环;
loopOut(type="cycle",numkeyframes=0)是周而复始的循环;
loopOut(type="continue")延续属性变化的最后速度,
loopOut(type="offset",numkeyframes=0)是重复指定的时间段进行循环;
numkeyframes=0是循环的次数,0为无限循环,1是最后两个关键帧无限循环,2是最后三个关键
8.linear表达式(线性表达式)
原理:
linear(t, tMin, tMax, value1, value2)
表示
linear(time, 开始变化的时间, 结束变化的时间, 开始变化时的数值, 结束变化的数值);
linear(t, value1, value2)
表示当time在0到1之间时,从value1变化到value2;
ease(t, tMin, tMax, value1, value2)的含义与linear一样,
区别是在tMin和tMax点处,进行缓入缓出,使数据更加平滑;
easeIn(t, tMin, tMax, value1, value2)与linear的含义一样,
区别是在tMin处,进行缓入,使数据更加平滑;
easeOut(t, tMin, tMax, value1, value2)与linear的含义一样,
区别是在tMax点处,进行缓出,使数据更加平滑
举例:
见下图均以(time,0,2,382,1500)为例,
若为数字的源文本属性添加此表达式可以制作出倒计时的效果n=linear(time, 0, 2, 2, 0)表示从0-2秒数字从2到0,希望显示指定2位小数时间表达式time.toFixed(2);
注意事项:
倒计时的用法比较常用,整数M要大写
9. index表达式(索引表达式)
原理
:为每间隔多少数值来产生多少变化
举例
:若为图层1的旋转属性添加表达式index*15 ,则第一个图层会旋转15度,之后按Ctrl+D去复制多个图层时,第2个图层将旋转15度,以此类推;
10. .random表达式(随机表达式)
原理:
random(x,y)在数值x到y之间随机进行抽取,最小值为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之间随机改变无小数
注意事项
:随机表达式不仅局限于数据上的使用,其他属性也可以应用,若数值为整数Math的M要大写
11. 挤压与伸展
原理
:spd表示挤压拉伸的速度,maxDev表示挤压拉伸的大小,decay表示衰减
举例
:
spd =20;maxDev =10;
decay = 1;
t = time - inPoint;
offset = maxDev*Math.sin(t*spd)/Math.exp(t*decay);
scaleX = scale[0] + offset;scaleY = scale[1] - offset;
[scaleX,scaleY]
12. 小球回弹
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
看起来好复杂的一个表达式,没关系,只要键盘上有 c 和 v 就可以了。先让小球做一个落地的动效:
13. 镜头晃动
在位置属性上粘贴表达式
x=0;
y=Math.sin(time*2)*10
value+[x,y]
*表达式所代表的含义是,维持x坐标不变,Y坐标以(sin时间 2)的10倍像素进行移动。
我们知道y=sin x函数的值的范围是[-1,1],因此表达式所带来的结果则是随着时间推移,图层的y轴会在相对原始位置的±10的范围内起伏。
在实际应用中,只需要对括号后面的数值做相应增减,就可以控制晃动的幅度。
在旋转属性上粘贴表达式
Math.cos(time*2)
14. 文本代码
StartNumber=1;
EndNumber=1000;
StartTime=1;
EndTime=3;
t=linear(time,StartTime,EndTime,StartNumber,EndNumber);
Math.floor(t)
上面四行可以修改,依次是:
起始数字
结束数字
起始时间
结束时间
表达式的意思是:
时间从1秒到3秒的时候,数字从1增长到1000.
StartTime=1;
StartNum=50;
EndNum=88;
PersecondNum=20;
if (time<StartTime){x=StartNum}
if (time>=StartTime){x=StartNum+PersecondNum*(time-StartTime)};
if(x>EndNum){x=EndNum};
Math.floor(x)
前面5行都是参数。依次是:
起始时间
起始数字
结束数字
每秒增量
表达式的意思是:
从第一秒开始,数字从50开始增加,每秒增加20,直到88,之后不再增加。
4
Report
声明
4
Share
相关推荐
in to comment
Add emoji
喜欢TA的作品吗?喜欢就快来夸夸TA吧!
You may like
相关收藏夹
Log in
4Log in and synchronize recommended records
4Log in and add to My Favorites
评论Log in and comment your thoughts
分享Share
































































































