返回顶部

【设计】AE常用表达式教程01

2021-06-15分享
AE常用表达式教程01

      本篇教程为AE常用表达式教程笔记第一弹,笔者将归纳介绍AE几个常用表达式及其用法。
      其实大部分常用表达式实现效果也可以通过插件脚本实现(以后还会说到)~
      这篇文章只为AE新手提供最基本的、最常用的几个表达式示范,掌握之后可以满足基本的使用需求,如果想进阶学习AE表达式,就直接先去学JavaScript语言吧~
     (文章为作者原创,转载请注明出处。)

首先小小了解一下AE表达式的语法(用一种比较通俗易懂的方式理解它)。

关于注释

// 单行注释
/*
   多行注释
*/


引号里面通常是名称”
图层名称:  如  ”形状图层矩形1”
具体的某个符号: 如  ”%” (加个百分比就写 +”%”)
类型、方式、样式:如type = "cycle"(循环样式为:从头到尾从头到尾从头到尾循环)


() 小括号属性
一般的表达式指令都有(),具体属性
如:循环表达式:loopOut(type = "cycle", numKeyframes = 0)
也可以写作:loopOut()
//没有属性要写就空着,不打括号会报错


[]中括号数组序号
数组:[s,s]
// 有些属性值是个数组,例如缩放,缩放有XY两个方向,打开3D后还会[x,y,z]三个值。

序号:n=thisLayer.name.split(".")[1]; 
// 代数n为 这个层 的 名字 的拆分(拆分方式用“.”拆分)取[1]号位置的数。

AE中,序号排序是从0号开始的,[0][1][2][3]......,如果这个层的名字叫“rectangle.5”,经过split的拆分,一号位置就是rectangle,二号位置是5,那么取的就是5。

号表示“是”

; 分号 译为 “且”平级关系
如:在缩放属性里添加↓
s=100-(index-1)*10;
[s,s];

// 代数s为100减去  当前图层索引减一(也就是下一个图层) 再乘以10,
  
并且,这个 s 就是 缩放参数 [X轴缩放为s,Y轴缩放s](等比缩放)


. 英文小句号译为“的”
如:   thisComp.layer("直线1").content("修剪路径").end
//“直线1”这个图层 内容中  “修剪路径”属性 结束  属性 。


数学中的算法规则同样沿用
如:(thisComp.layer("圈").content("修剪路径").end-50)*2
   图层“圈”的修剪路径的结束属性 数值 -50 再整体*2
(注意我需要先算减法,所以整体打个括号再乘2,和数学一样)
(但不用像数学写法一样“大括号中括号小括号”,可以“小括号套小括号套小括号……”)
如:分针time*720
时针thisComp.layer("分针").transform.rotation/12 (除以12)
//时针比分针慢12倍。


代数使用规则:
用代数的时候,先定义代数(我这个代数代表什么)。
例如:
t=thisComp.layer("s").transform.position[1];
linear(t, 500, 140, 90, -90)

注意顺序,不然会报错。


接下来举例一些常用的表达式词汇:
(举例中代码 划线部分 是可以直接拉“小橡皮筋”拖拽的部分,无需手打)

值:value
相当于:当前这个属性的值;

在属性上单敲一个value没有意义,value就等于你输入的值。
【注意】在打表达式时,属性值不能为空,当我们要用value 指代属性的值时,遵循value[0],value[1],value[2]…的顺序,从0往后排序,不然会报错。
例如XYZ必须为 [value[0],value[1],value[2]]
例如用value指代缩放的宽度属性,长度为固定90,即: [value[0],90]
数值与数组:
当属性是1个参数的时候(例如“透明度”),参数为值。
当属性是≥2个参数的时候(例如“缩放”),参数为数组(例如:[100,100] )
所以当我们在属性上单单输入v=value时,v可以是一个数值,也可以是一个数组。
数值和数组之间都可以互相数学运算。
可以在在数组内运算:[value[0]+10,value[1]]
组与组之间可以运算:k=[value[0],value[1]];
                                    value+k

那么,value有什么用呢?
【例】对当前的值进行数学计算。


位置属性上:
[value[0],value[1]*2,value[2]]
//我在Y轴上输入的所有参数,自动 乘以2。

当然也可以右击位置属性,“单独尺寸”,分开显示XYZ轴,然后在Y轴上
value*2



索引:index
每个图层有自己的索引,调用 索引 让层与层之间产生 有规律的差异

【例】拖尾跟随效果

在缩放属性加↓
s=100-(index-1)*10;
[s,s];

/* 代数s为100减去  当前图层索引减一(也就是下一个图层) 再 乘以10,
   并且,这个 s 就是 缩放参数 [X轴缩放为s,Y轴缩放s](等比缩放)
*/


然后把图层复制多个,位移关键帧错开,形成从大到小的连续跟随效果。

【拓展练习(*^▽^*)】
在刚才的拖尾动画里加上 尾巴透明度逐渐减弱效果


在透明度属性添加:
100-(index-1)*10



【例】用index赋予图层厚度

“单独尺寸”,分开显示XYZ轴,在Z轴(深度)上输入
index
// 让Z轴的位置随着图层索引的参数增加而增加。
图层复制复制复制……
新建摄像机,摇一下镜头。




时间循环 :time*
time*数值 (数值越大,速度越快)

可调速版time表达式:
time/thisComp.duration*value;
 //打好表达式后,在修改属性参数(红数字),可以调速。
 

摆动 : wiggle
wiggle(freq, amp)
wiggle(频率, 幅度)


二值取较大/较小:Math.max(a,b)、Math.min(a,b)
【例】Math.max( a,b)    
//a与b之间取较大的值。


随机:random
【随机变换数字】
random() (0~1之间随机取值,单用有小数,通常用Math.round()把它取整)
最大值内随机: random(max) 如:random(100)  //在100以内随机
两个值内随机: random(min,max) 如:random(50,100)  //在50到100之间随机
 
源文本属性添加:
Math.round(random()*100)

// 0到100之间整数随机
Math.round(random(0,10))
// 0到10之间整数随机

调用时间:属性AtTime(时间)
velocityAtTime(t),speedAtTime(t),valueAtTime(t)   ……
(括号内为时间,空着表示实时,不可丢括号,没括号就报错)


valueAtTime(t)
【例】用valueAtTime做依次冒泡动效
在index为1的图层制作一个动效,其他几个图层也做同样动效,但是发生速度为依次。
(在图层少的时候可以直接复制关键帧然后错开,图层太多就只能打表达式)


在index为1的图层制作一个动效,其他几层用表达式做动效,在2之后的索引层
在 缩放 属性敲上表达式:
thisComp.layer(index-1).transform.scale.valueAtTime(time-0.15)
// 下一个图层 的变换属性 的缩放属性 的变换根据时间变换,时间比当前时间少0.15秒。
(划线部分可以通过拉“小橡皮筋”自动读取,把“1”改为index-1即可)


【例】重影拖尾表达式:
缩放属性里添加↓

s=100-(index-1)*10;[s,s]
位移属性里添加↓
valueAtTime(time-0.015*(index-1))


sourceRectAtTime(t)
【例】自适应文案长度的横线

打一串字符,段落对齐方式为居中,下方画一条形状图层矩形。
目标:让下面的横线长度自适应字母长度。
做法:
在横线“矩形”的大小属性写入表达式:
x=thisComp.layer("TIMISM").sourceRectAtTime().width;
[x,value[1]]

//代数x为文字图层的宽度,即横线的宽度。


循环表达式:loop
loopIn(): 从0秒开始 到 第一个关键帧 之间 作循环(在前面那段空挡循环);
loopOut():从 最后一个关键帧 开始  到 时间段最后 之间 作循环(在后面那段空挡循环)
可以从Property→直接调出(不用手码)
例如:
loopOut(type = "cycle", numKeyframes = 0)
//在后半段空挡循环,从头到尾画圈循环,所有关键帧循环。
type属性↓
"cycle":(画圈循环)从头到尾 从头到尾 从头到尾……循环
“pingpong”(乒乓球循环)从头到尾 再 从尾到头……循环


“offset ”(偏移量)动作超过关键帧时还会继续,不停止。

numkeyframes属性↓
表示选择哪些关键帧进行循环:
当numkeyframes=0的时候,表示所有关键帧循环;
当numkeyframes=1的时候,表示只循环最后两帧;
当numkeyframes=2的时候,表示只循环最后三帧。以此类推。


取整:Math.round()
常用取整↓
Math.round(键入你需要变化的数据属性)
【例1】
Math.round((thisComp.layer("").content("修剪路径").end)
//图层“圈” 的 内容 属性 的 修剪路径 的 结束 属性  ,取其整数。
四舍五入取整↓
Math.floor(键入你需要变化的数据属性)

【例2】
Math.round()高阶操作
利用取整,实现移动在单位距离上吸附
例如X轴方向移动数值时,只会是10的整数倍。
在X轴位置打上表达式:

s=10;
v=transform.xPosition;
Math.round(v/s)*s
/*
S为最小移动单元,比如10px。
V为X位置,
手动移的X的位置➗方块尺寸=份数(可能为小数),
份数取整
✖️方块尺寸
X在手动移动的时候,只会卡在整份上。
*/
 
保留小数:.toFixed()
【例】
(thisComp.layer("形状图层 1").transform.scale[0]).toFixed(1)+"%" 
//.toFixed(n),n是保留几位小数,保留一位就是.toFixed(1)


取正数: Math.abs()
Math.abs()
【例】
抖动旋转,且只取正数部分。
Math.abs(wiggle(5,20))
如果要取负数呢?
Math.abs(wiggle(5,20)*-1)
乘以一个负一即可。


插值:Interpolation
Interpolation → linear 和 ease
插值→线性插值与抛物插值 
(在表达式预设里直接调出,不用手码)

可以将Interpolation系列的表达式理解为参数取样,建立联动。
线性插值 与 抛物插值 的 区别 相当于普通的与缓动的区别,根据自己喜好选择。
Interpolation→
linear(t, tMin, tMax, value1, value2)
//线性插值(父级变量,父级最小值,父级最大值,子集最大值,子集最小值)
ease(t, tMin, tMax, value1, value2)
//抛物插值(父级变量,父级最小值,父级最大值,子集最大值,子集最小值)


表达式打在了子集上,子集就是你当前需要变动的属性(两个value),它跟随于某个父级的属性联动变化,并且这个变化是有区域性的。

【例1】滑块与旋转建立联动(类似principle里的联动)上下移动滑块时,右侧圆跟着转。

在要旋转的图层的旋转属性上添加表达式预设:
Interpolation→
t=thisComp.layer("s").transform.position[1];
linear(t, 500, 140, 90, -90)
/*
代数t为滑块的Y轴参数;
线性插值(t,滑块最高500,滑块最低140,旋转最大值,旋转最小值)
*/

【例2】倒计时表达式(可以不根据实时的时间倒计时)
在“源文本”属性上打上表达式:

a=linear(time, 开始变化的时间, 结束变化的时间, 开始变化时的数字, 结束变化的数字);
Math.floor(a) 
例如:
a=linear(time, 0, 3, 100, 0);
Math.floor(a) 
//取值对象为当前时间,开始变化时间点为0秒,结束变化时间点为3秒,开始变化时值为100,结束变化值为0),然后将a向下取整。

范围锁定:clamp
用于限制属性参数的范围:
结构为:clamp(value,最小值,最大值)
【例】
限制滑块Y轴的范围
在X轴直接把固定参数写入表达式,
在Y轴属性上添加表达式:
clamp(value,100,500)
//锁住范围value是提前当前属性的名称;  100,500是限制为100到500



截断:split
通过识别图层的命名,来控制图层的某个属性的参数。(高效率操作系列)

【例】
我想改变图层名字就能控制缩放,要从图层名字里取出“.”后面的那个数字。
n=thisLayer.name.split(".")[1];
 //代数n为 这个层 的 名字 的拆分,拆分方式用“.”拆分,取[1]号位置的数。
 
AE中,序号排序是从0号开始的,[0][1][2][3]......,如果这个层的名字叫“rectangle.4”,经过split的拆分,一号位置就是rectangle,二号位置是4,那么取的就是4。
 
条件判断:if / else
如果……那么……
【例】
我想让图形在两秒后抖动,两秒前不抖动。
在位置属性添加:
if(time>2)
{
wiggle(2,50)
}
else
{
transform.position
}

 //如果时间大于2,抖动,不大于则不动。



其他常用的、可直接复制使用的 表达式(持续更新中)

【弹性表达式】
 

1.浮动摇摆式弹性表达式:
amp=1;
//振幅
freq=10;
//频率
decay=2;
//衰减
a=numKeys;
n=nearestKey(time).index;
et=key(n).time;
t=time-et;
v=velocityAtTime(et-0.01);
if  (t>0 & n>=a){
value+v*amp*Math.sin(t*freq)/Math.exp(t*decay);
}
else{
value;
}

 
2.Motion2脚本 自带的弹性预设(EXCITE按钮):
 
表达式解析如下↓
可以通过“效果控件”窗口的滑块控制,
如果效果还不明显,也可以展开表达式改数值。
如果进表达式改数值,那么改的是【蓝色】部分数值,
根据数学常识,这个数值和属性参数是反比的。
 
try {
    amp = effect("位置 - Overshoot")("ADBE Slider Control-0001") /
1,
 
  //振幅越大,除去的数值越小;滑块Overshoot数值越大,振幅越大。
   freq = effect("位置 - Bounce")("ADBE Slider Control-0001") / 20,
  
//频率越大,除去的数值越小;滑块Bounce数值越大,频率越快。
   decay = effect("位置 - Friction")("ADBE Slider Control-0001") / 20,
 
//衰减越大,除去的数值越小(即除去数值越大,弹得越久);滑块Friction数值越大,越早结束。
    n = 0, 0 < numKeys && (n = nearestKey(time)  .index, key(n).time > time && n--), 
    t = 0 === n ? 0 : time - key(n) .time,
    0 < n ? (v = velocityAtTime(key(n).time - thisComp.frameDuration / 10), 
    value + v / 100 * amp * Math.sin(freq * t * 2 * Math.PI) / Math.exp(decay * t)) : value;
} catch (e$$4) {
    value = value; 
}

 


/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
AE常用表达式教程笔记第一弹 就先到这了,这些表达式大多是比较常用的几种,之后时间作者会慢慢更新并加入新的表达式。

暂时完结撒花✿✿ヽ(°▽°)ノ✿


Copyright @ timismstudio.com. All Rights Reserved   沪ICP备19031552号-2 Design and Develop by RorE