表达式
表达式参考
表达式能用的全部名称,从编辑器的表达式运行时生成。名称沿用 After Effects 的表达式语言,大多数 After Effects 表达式可以直接使用。
表达式是一小段 JavaScript (外部网站,在新标签页打开) 脚本,在每一帧算出属性的值。最后一行的值就是结果,类型要与属性一致:数字、[x, y] 这样的数组、0 到 1 的颜色 [r, g, b, a]、文字,或真/假。
每次运行都与编辑器和网络隔开:读不到文件、时钟和页面,在哪台机器上算结果都一样。一次运行最多用 8 MB 内存、从项目里读 64 个值;表达式读另一个属性时,会先把那个属性算出来,两个属性互相读取则会报错。

- 每个属性旁的表达式按钮打开它的表达式。
- 有表达式时,属性显示表达式在当前帧给出的值。
- 表达式本身。“预览”试运行,“应用”保留它,“转换为关键帧”把结果变成关键帧。
当前属性
表达式所在的属性。这些名称可以单独使用;读取任何属性时,也能用同样的成员,例如 thisComp.layer("Ball").transform.position.valueAtTime(1)。
| 名称 | 得到什么 |
|---|---|
value | 属性在当前时间、被表达式改变之前的值。 |
time | 合成的当前时间,单位为秒。 |
thisProperty | 表达式所在的属性,带有本表中的各个成员。 |
valueAtTime(t) | 属性在时间 t(秒)的值。 |
velocity | 数值此刻每秒变化多快。 |
velocityAtTime(t) | 时间 t 的速度。 |
speed | 数值此刻移动多快,不论方向:即速度向量的长度。 |
speedAtTime(t) | 时间 t 的速率。 |
numKeys | 属性有几个关键帧。 |
key(index) | 按序号(从 1 开始)取一个关键帧,带有它的 time、value 和 index。 |
nearestKey(t) | 离时间 t 最近的关键帧。 |
name | 属性的名称。 |
wiggle(freq, amp, octaves = 1, ampMult = 0.5, t = time) | 让数值每秒随机抖动约 freq 次、幅度最多 amp;每多一个八度就多一层更细的抖动,强度乘以 ampMult。 |
temporalWiggle(freq, amp, octaves = 1, ampMult = 0.5, t = time) | 在 t 附近随机漂移的时间点读取数值,让动画本身随机地忽快忽慢。 |
smooth(width = 0.2, samples = 5, t = time) | 在 t 前后共 width 秒内读取 samples 次(1 到 32)取平均,用来抹平抖动。 |
loopIn(type = "cycle", numKeyframes = 0) | 在第一个关键帧之前重复关键帧动画。type 可以是 cycle、pingpong、offset 或 continue;numKeyframes 只循环最前面的几个关键帧。 |
loopOut(type = "cycle", numKeyframes = 0) | 在最后一个关键帧之后用同样四种方式重复关键帧动画;numKeyframes 只循环最后几个关键帧。 |
loopInDuration(type = "cycle", duration = 0) | 与 loopIn 相同,但循环最前面的 duration 秒。 |
loopOutDuration(type = "cycle", duration = 0) | 与 loopOut 相同,但循环最后的 duration 秒。 |
property("address") | 按地址取项目里的任意属性,地址的写法与编辑器关联两个属性时写下的相同。 |
图层
一个图层,来自 thisLayer 或 thisComp.layer(…)。当前图层的这些名称也可以单独使用:position 就是 thisLayer.transform.position。
| 名称 | 得到什么 |
|---|---|
thisLayer | 表达式所在的图层。 |
name | 图层的名称。 |
index | 图层在合成中的序号;1 是最上面的图层。 |
inPoint | 图层开始的时间,单位为秒。 |
outPoint | 图层结束的时间,单位为秒。 |
startTime | 图层自身时间为 0 时对应的合成时间,单位为秒。 |
width | 图层的宽度,单位为像素。 |
height | 图层的高度,单位为像素。 |
active | 图层开着、且当前时间在它的开始与结束之间时为真。 |
enabled | 图层开着时为真。 |
hasParent | 图层有父级时为真。 |
parent | 图层的父级;没有父级时报错。 |
transform | 图层的变换属性,见下面几行。 |
transform.anchorPoint | 图层的 anchorPoint,作为属性读取。可以省略 transform.。 |
transform.position | 图层的 position,作为属性读取。可以省略 transform.。 |
transform.xPosition | 图层的 xPosition,作为属性读取。可以省略 transform.。 |
transform.yPosition | 图层的 yPosition,作为属性读取。可以省略 transform.。 |
transform.zPosition | 图层的 zPosition,作为属性读取。可以省略 transform.。 |
transform.scale | 图层的 scale,作为属性读取。可以省略 transform.。 |
transform.rotation | 图层的 rotation,作为属性读取。可以省略 transform.。 |
transform.xRotation | 图层的 xRotation,作为属性读取。可以省略 transform.。 |
transform.yRotation | 图层的 yRotation,作为属性读取。可以省略 transform.。 |
transform.zRotation | 图层的 zRotation,作为属性读取。可以省略 transform.。 |
transform.orientation | 图层的 orientation,作为属性读取。可以省略 transform.。 |
transform.opacity | 图层的 opacity,作为属性读取。可以省略 transform.。 |
transform.pointOfInterest | 图层的 pointOfInterest,作为属性读取。可以省略 transform.。 |
transform.zoom | 图层的 zoom,作为属性读取。可以省略 transform.。 |
marker | 图层的标记(见“标记”)。 |
effect("name")("parameter") | 按名称或序号取图层上的一个效果,再按名称或序号取它的一个参数。.param(…) 也能读参数。 |
layer.property("group-id/property-id") | 按组与属性的 ID 路径取图层的一个属性。 |
toComp(point, t = time) | 把图层空间里的点换算到合成空间。不计入 3D 摄像机的投影。 |
fromComp(point, t = time) | 把合成空间里的点换算到图层空间。 |
toWorld(point, t = time) | 与 toComp 相同,用的是 After Effects 里的名称。 |
fromWorld(point, t = time) | 与 fromComp 相同,用的是 After Effects 里的名称。 |
toCompVec(vector, t = time) | 与 toComp 相同,但换算的是方向而不是点:不计位置,只计旋转与缩放。 |
fromCompVec(vector, t = time) | 与 fromComp 相同,但换算的是方向而不是点。 |
toWorldVec(vector, t = time) | 与 toCompVec 相同。 |
fromWorldVec(vector, t = time) | 与 fromCompVec 相同。 |
合成
图层所在的合成,或按名称找到的另一个合成。
| 名称 | 得到什么 |
|---|---|
thisComp | 图层所在的合成。 |
comp("name") | 按名称取项目里的另一个合成。 |
thisProject.comp("name") | 当前项目;它的 comp("name") 与 comp("name") 相同。 |
thisComp.layer("name" | index | otherLayer, relIndex) | 按名称或序号取一个图层,或取离另一个图层 relIndex 层的图层。 |
name | 合成的名称。 |
width | 合成的宽度,单位为像素。 |
height | 合成的高度,单位为像素。 |
duration | 合成的时长,单位为秒。 |
frameDuration | 一帧持续多久,单位为秒。 |
numLayers | 合成有几个图层。 |
pixelAspect | 合成的像素长宽比。 |
displayStartTime | 合成时间码的起始时间,单位为秒。 |
marker | 合成的标记(见“标记”)。 |
标记
图层或合成的标记,来自它的 marker。
| 名称 | 得到什么 |
|---|---|
numKeys | 一共有几个标记。 |
marker.key(index | "name") | 按序号(从 1 开始)或按名称、注释取一个标记,带有它的 time、duration、comment、name 和 index。 |
marker.nearestKey(t) | 离时间 t 最近的标记。 |
向量运算
对数字和数组都适用的函数。缺少的维度按 0 计算。
| 名称 | 得到什么 |
|---|---|
add(a, b) | 把两个数字或数组相加。 |
sub(a, b) | 用 a 减去 b。 |
mul(vector, amount) | 把数字或数组乘以一个量。 |
div(vector, amount) | 把数字或数组除以一个量。 |
clamp(value, limit1, limit2) | 把一个值(或数组的每一项)限制在两个界限之间。 |
dot(a, b) | 两个数组的点积。 |
cross(a, b) | 两个三维数组的叉积。 |
normalize(vector) | 把数组缩放到长度为 1。 |
length(vector) / length(a, b) | 数组的长度,或两点之间的距离。 |
lookAt(fromPoint, atPoint) | 让位于 fromPoint 的 3D 图层朝向 atPoint 的方向。 |
degreesToRadians(degrees) | 把角度换算成弧度。 |
radiansToDegrees(radians) | 把弧度换算成角度。 |
插值
把一个范围换算到另一个范围。只给三个参数时,t 从 0 到 1。
| 名称 | 得到什么 |
|---|---|
linear(t, tMin, tMax, value1, value2) | 把 t 从 tMin–tMax 按直线换算到 value1–value2,超出两端时停在端点。 |
ease(t, tMin, tMax, value1, value2) | 同上,开头和结尾都缓动。 |
easeIn(t, tMin, tMax, value1, value2) | 同上,开头慢、到达时为全速。 |
easeOut(t, tMin, tMax, value1, value2) | 同上,开头为全速、到达时变慢。 |
随机数与噪波
随机数按属性与帧取种子,所以同一帧总是得到相同的数:预览、导出和每台机器上都一样。
| 名称 | 得到什么 |
|---|---|
seedRandom(offset, timeless = false) | 换一组随机数;timeless 为真时,每一帧都得到同样的数。 |
random() / random(max) / random(min, max) | 0 到 1、0 到 max 或 min 到 max 之间的随机数;数组的每一项各得一个数。 |
gaussRandom() / gaussRandom(max) / gaussRandom(min, max) | 与 random 相同,但更集中在中间:约九成落在范围之内。 |
noise(x | [x, y] | [x, y, z]) | 约在 −1 到 1 之间的平滑噪波,输入渐变时它也渐变。 |
时间
在秒与帧之间换算,或让数值隔几帧才变一次。
| 名称 | 得到什么 |
|---|---|
timeToFrames(t = time, fps, isDuration = false) | 把秒换算成帧数,默认用合成的帧速率,也可以自己给。 |
framesToTime(frames, fps) | 把帧数换算成秒。 |
posterizeTime(fps) | 让表达式其余部分按 fps 的帧速率运行,使数值一格一格地变化。 |
颜色
颜色是四个 0 到 1 的数组成的数组:红、绿、蓝和 Alpha。
| 名称 | 得到什么 |
|---|---|
rgbToHsl([r, g, b, a]) | 把颜色换算成色相、饱和度、亮度和 Alpha。 |
hslToRgb([h, s, l, a]) | 把色相、饱和度、亮度和 Alpha 换算成颜色。 |
hexToRgb("#RRGGBB") | 把 #FF8800(或 #AARRGGBB)这样的十六进制颜色换算成颜色数组。 |
文字选择器
在文字动画器的表达式选择器里,表达式对每个字符、单词或行各运行一次。
| 名称 | 得到什么 |
|---|---|
textIndex | 正在计算的字符、单词或行的序号,从 1 开始。 |
textTotal | 一共有几个字符、单词或行。 |
selectorValue | 这个选择器上方的各选择器给出的值,以百分比表示。 |
表达式控件
表达式控件是一种只为表达式保存数值、不改变画面的效果;把结果留给表达式读取的跟踪效果也是这样。从“效果和预设”添加,再按效果名称和参数名称读取,写法见下表(每行示例它的第一个参数);同一种控件的第二个会带上编号(“Slider Control 2”)。
| 读取写法 | 得到什么 |
|---|---|
effect("Slider Control")("Slider")滑块控制 · 滑块 | 一个数字。 |
effect("Angle Control")("Angle")角度控制 · 角度 | 一个数字。 |
effect("Checkbox Control")("Checkbox")复选框控制 · 复选框 | 勾选时为 1,否则为 0。 |
effect("Color Control")("Color")颜色控制 · 颜色 | 一个颜色 [r, g, b, a]。 |
effect("Point Control")("Point")点控制 · 点 | 一个点 [x, y]。 |
effect("Layer Control")("Layer")图层控制 · 图层 | 选中的图层,作为图层读取。 |
effect("Dropdown Menu Control")("Menu")下拉菜单控制 · 菜单 | 一个整数:菜单中选中的项,从 1 开始。 |
effect("3D Camera Tracker")("Shot Type")3D 摄像机跟踪器 · 拍摄类型 | 选中的选项,以它的值(文字)表示。 |
effect("Face Track Points")("Left Eyebrow Inner")面部跟踪点 · 左眉内侧 | 一个点 [x, y]。 |
暂不支持
sampleImage、sourceRectAtTime与文字样式对象。toComp中 3D 摄像机的投影:它只在图层空间与合成空间之间换算。- After Effects 的旧版 ExtendScript 引擎,以及表达式之外的一切:文件、网络、时钟、
eval与模块。