在After Effects(AE)中,表达式是一种基于JavaScript的脚本语言,允许用户通过编写代码来控制图层属性,实现动态、复杂的动画效果,而无需逐帧手动调整,表达式命令是表达式的核心组成部分,通过调用AE内置的函数、属性和方法,实现对时间、空间、数值等的精确控制,掌握表达式命令不仅能大幅提升工作效率,还能创造出许多手动操作难以实现的创意效果。

表达式的基础语法与结构
表达式的基本语法遵循JavaScript规则,通常以“=”开头,后接代码逻辑,在图层的“位置”属性中输入表达式“[100, 200]”,即可将图层固定在坐标(100, 200)处,表达式可以引用其他图层的属性、时间变量或自定义变量,实现属性间的联动,表达式“thisComp.layer(“控制层”).effect(“滑块控制”)("滑块")”会读取名为“控制层”的图层中“滑块控制”效果的“滑块”值,并应用于当前属性。
常用表达式命令详解
-
时间与数值相关命令
time
:返回当前时间(以秒为单位)。time*100
可使属性值随时间线性增长,每秒增加100。value
:返回当前属性的原始值,常用于在表达式中保留原始数值的基础上进行叠加计算,如value + time*50
。linear(t, tMin, tMax, value1, value2)
:将t值在tMin到tMax的范围内,线性映射到value1到value2之间。linear(time, 0, 5, 0, 100)
表示在前5秒内,属性值从0线性增长到100。ease(t, tMin, tMax, value1, value2)
:与linear类似,但使用缓动函数使过渡更自然。ease(time, 0, 5, 0, 100)
可实现先快后慢的动画效果。
-
空间与变换命令
transform.position
:获取或设置图层的位置。transform.position + [10, 0]
可使图层在原始位置基础上向右偏移10像素。transform.scale
:控制图层的缩放。transform.scale * [1.2, 1.2]
可将图层放大至120%。transform.rotation
:控制图层的旋转角度(单位为度)。time*360
可使图层每秒旋转360度。fromWorld(anchorPoint)
:将图层的锚点从世界坐标转换为图层本地坐标,常用于配合父图层实现复杂的空间联动。
-
图层与合成相关命令
(图片来源网络,侵删)thisComp
:指向当前合成。thisComp.layer("文本").text.sourceText
可获取“文本”图层的文字内容。thisLayer
:指向当前图层。thisLayer.marker.key(1).time
可获取当前图层第一个标记的时间点。index
:返回当前图层的索引号。index*10
可使不同图层的属性值根据索引产生差异。layer(name)
:通过名称获取其他图层。layer("控制层").transform.position
可读取“控制层”的位置值。
-
数学与逻辑函数
Math.sin(t)
:返回t的正弦值,常用于周期性动画。Math.sin(time)*50
可使属性值在-50到50之间周期性波动。Math.random()
:返回0到1之间的随机数。Math.random()*100
可生成0到100的随机值。if(condition, value1, value2)
:条件判断函数。if(time > 2, 100, 0)
表示时间大于2秒时值为100,否则为0。
表达式的高级应用技巧
-
表达式控制器的
AE内置了多种表达式控制器,如“滑块”“角度”“颜色”等,通过这些控制器可以统一管理多个图层的表达式参数,创建一个“滑块控制器”并命名为“速度”,然后在多个图层的位置表达式中输入thisComp.layer("控制器").effect("滑块控制")("滑块")*time
,即可通过调整滑块值统一控制所有图层的运动速度。 -
表达式链接与嵌套
表达式可以相互引用和嵌套,形成复杂的逻辑链,先在一个图层中创建表达式time*thisComp.layer("控制器").effect("滑块控制")("滑块")
,再将该图层的“位置”属性链接到另一个图层的“缩放”属性,即可实现运动与缩放的联动。 -
表达式与标记的结合
通过marker.key(index)
和marker.key(numKeys).time
等命令,可以读取图层标记的时间点,实现关键帧的动态控制。marker.key(1).time
可获取第一个标记的时间,用于触发动画或重置数值。(图片来源网络,侵删) -
数组与循环的应用
对于需要批量处理的场景,可以利用数组和循环简化表达式,创建一个包含多个数值的数组var values = [10, 20, 30, 40];
,通过values[index]
动态获取不同图层的属性值。
常见表达式命令速查表
功能分类 | 命令/函数 | 说明 |
---|---|---|
时间与数值 | time |
返回当前时间(秒) |
linear(t, tMin, tMax, v1, v2) |
线性映射数值范围 | |
ease(t, tMin, tMax, v1, v2) |
缓动映射数值范围 | |
空间与变换 | transform.position |
获取/设置图层位置 |
transform.scale |
获取/设置图层缩放 | |
transform.rotation |
获取/设置图层旋转(度) | |
图层与合成 | thisComp |
指向当前合成 |
thisLayer |
指向当前图层 | |
layer(name) |
通过名称获取其他图层 | |
数学与逻辑 | Math.sin(t) |
返回t的正弦值 |
Math.random() |
返回0-1的随机数 | |
if(condition, v1, v2) |
条件判断函数 |
注意事项与调试技巧
- 语法错误提示:AE表达式编辑器会实时显示语法错误,需注意检查括号、分号等符号的匹配。
- 性能优化:避免在表达式中使用复杂的循环或嵌套,过多的计算可能导致渲染卡顿。
- 调试方法:通过“图表编辑器”可以可视化表达式的数值变化,便于调试动画曲线。
相关问答FAQs
Q1: 如何实现图层随鼠标移动而移动?
A1: 在图层的“位置”属性中输入以下表达式:
thisComp.layer("Null 1").transform.position;
“Null 1”是一个空对象图层,将其“位置”属性通过表达式链接到鼠标位置(可通过“效果 > 表达式控制 > 鼠标”实现),即可实现图层跟随鼠标移动。
Q2: 如何让动画在指定时间点重复播放?
A2: 使用loopOut()
或loopIn()
函数,要使动画在5秒处循环播放,可输入:
loopOut("cycle");
该函数会自动将动画的关键帧循环播放,适用于无限重复的动画效果。