维度
- After Effects 用户指南
- Beta 版
- 快速入门
- 工作区
- 项目与合成
- 导入素材
- 文本和图形
- 绘图、绘画和路径
- 图层、标记和摄像机
- 动画、关键帧、运动跟踪和抠像
- 透明度与合成
- 调整颜色
- 效果和动画预设
- 表达式和自动化
- 沉浸式视频、VR 和 3D
- 视图和预览
- 渲染和导出
- 使用其他应用程序
- 协作:Frame.io 和团队项目
- 内存、存储、性能
- 知识库
了解表达式语言,并使用它在 After Effects 中构成不同的表达式。
After Effects 表达式语言基于 JavaScript,具有一组扩展的内置对象。After Effects 使用核心标准 JavaScript 语言,而不是特定于 Web 浏览器的扩展,并且包含自己的一组扩展对象,如图层、合成、素材和相机。
虽然表达式语言基于脚本语言,但脚本和表达式之间存在本质上的差别,即使这种差别比较细微。脚本指示应用程序执行某些操作,而表达式则指示属性执行某些操作。
创建表达式时,须牢记下列几点:
- 表达式的值是计算的最后一个语句的值。这通常是表达式的最后一行。在其最简形式中,表达式的值由基于计算顺序调用的表达式中的最后一个变量或函数生成。但是,该值也可以是任何显式引用为返回值的值。这可能包括表达式中先前用于调试目的的值,或未按写入顺序处理的显式声明函数和变量之外的值。
- JavaScript 是区分大小写的语言。
- 不应在表达式底部声明函数。
语言基础知识
在 JavaScript 中,存储在对象中的值称为属性。但是,After Effects 使用术语属性来指代时间轴面板中定义的图层组件。因此,After Effects 称 JavaScript 属性 (property) 为方法或属性 (attribute)。通常情况下,方法和属性之间的区别是方法通常执行某些操作来创建其输出(返回)值,而属性则简单地引用现有值来确定其输出(返回)值。您可以通过查找方法名称后面的圆括号(括住方法的任何输入参数)轻松地将方法和属性区分开来。
对象是一个可包含其他对象、属性和方法的项。例如,合成、图层和素材项目都属于对象。特别是,合成、图层和素材项目都是全局对象,这意味着可以在任何上下文中引用它们而无需引用一些更高级别的对象。
访问属性和方法
您可以使用表达式语言访问图层属性 (property) 的属性 (attribute) 和方法。要访问值,请使用由句号 (.) 运算符分隔的一系列对象引用。要跨图层级别串联对象引用(例如,要引用效果属性、蒙版或文本动画),也可以使用圆括号。例如,要将图层 A 中的不透明度属性与图层 B 中高斯模糊效果的模糊度属性相关联,请在表达式字段中为图层 A 的不透明度属性输入以下表达式:
thisCompayer(“Layer B”)ffect(“Gaussian Blur”)(“Blurriness”)
从左向右读取此表达式,可从包含对象的较高级别向下到特定属性:
使用的全局对象引用当前合成:thisComp。
该合成中的特定图层对象由其名称引用:layer("Layer B")。
该图层中的特定效果对象由其名称引用:effect("Gaussian Blur")。
该效果中的特定效果属性由其名称引用:("Blurriness")。
对于多维属性的第 n 个组件(如效果控制点的 y 组件),请在结尾附加 [n],如下所示:
thisCompayer(“Layer B”)ffect(“Advanced Lightning”)(“Origin”1]
表达式的默认对象是对其编写表达式的属性,随后是包含该表达式的图层;因此,您无需指定属性。例如,对图层的位置属性写入的摆动表达式可以是以下任何一个:
wiggle(5, 10) position.wiggle(5, 10) thisProperty.wiggle(5, 10)
从图层外部和对其写入表达式的属性中检索图层和属性时,请包括图层和属性。例如,对图层 B 的不透明度属性写入的表达式(将其链接到图层 A 的旋转属性)将类似以下表达式:
thisCompayer(“Layer A”)otation
要查看表达式工作原理的更多示例,请使用关联器将一个图层属性关联到另一个图层属性,并查看它创建的表达式。
数组和多维属性
数组是一类存储一组有序数值的对象。数组表示为由逗号分隔且由括号括起的数值列表,如以下示例所示:
[10, 23]
您可以将数组对象分配给变量,从而轻松引用表达式其他区域中的数组值。例如:
myArray = [10, 23]
数组对象的维度是数组中元素的数目。myArray 的维度是 2。After Effects 中不同属性的维度不同,具体取决于这些属性具有的值参数的数目。在表达式语言中,属性值是单个值(数值对象)或数组(数组对象)。
下表提供了一些属性及其维度的示例:
|
属性 |
1 |
旋转 不透明度 % |
2 |
缩放 [x=宽度, y=高度] 位置 [x, y] 锚点 [x, y] 音频水平 [left, right] |
3 |
缩放 [width, height, depth] 3D 位置 [x, y, z] 3D 锚点 [x, y, z] 方向 [x, y, z] |
4 |
颜色 [red, green, blue, alpha] |
可以使用括号和索引号来指示所需的元素,从而访问数组对象的各个元素。数组对象中的元素从 0 开始索引。使用前面的示例,myArray[0] 值为 10,而 myArray[1] 值为 23。
以下两个表达式是等效的:
[myArray[0], 5] [10, 5]
位置属性数组
位置属性数组如下所示建立索引:
position[0] 是位置的 x 坐标。
position[1] 是位置的 y 坐标。
position[2] 是位置的 z 坐标。
数组中颜色的表示
颜色表示为 4D 数组:
- 红色
- 绿色
- 蓝色
- Alpha
在颜色深度为 8 bpc 或 16 bpc 的项目中,颜色数组中的每个值都介于 0(黑色)到 1(白色)之间。例如,red 可以介于 0(无色)到 1(红色)之间。因此,[0,0,0,0] 是黑色且透明,[1,1,1,1] 是白色且不透明。在颜色深度为 32 bpc 的项目中,允许小于 0 和大于 1 的值。
如果您在数组对象中使用大于最高维度组件的索引的索引,则 After Effects 会返回错误。例如,myArray[2] 会引发错误,而 position[2] 会返回位置的 z 坐标。
After Effects 表达式语言中的许多属性和方法将数组对象当作是参数或作为值返回它们。例如,thisLayer.position 是一个二维或三维的数组对象,具体取决于图层是 2D 还是 3D 的。
示例
如果要写入保持位置动画的 y 值但 x 值固定为 9 的表达式,可使用以下命令:
y = position[1]; [9,y]
以下内容更为简明:
[9, position[1]]
这点很重要,因此让我们再看一个示例。如果要将图层 A 中的 x 位置值与图层 B 中的 y 位置值组合,可使用以下命令:
x = thisCompayer(“Layer A”)osition[0 y = thisCompayer(“Layer B”)osition[1 [x]
您可以创建仅引用 2D 或 3D 属性的数组中的一个值的表达式。默认情况下,除非您另外指定,否则会使用第一个值。例如,如果将关联器从图层 A 的旋转属性拖动到图层 B 的缩放属性,将显示以下表达式:
thisCompayer(“Layer B”)cale[0]
默认情况下,此表达式使用缩放属性的第一个值,即宽度。如果您更喜欢使用高度值,请将关联器直接拖动到第二个值而非属性名称,或者如下所示更改表达式:
thisCompayer(“Layer B”)cale[1]
相反,如果将关联器从图层 B 的缩放属性拖动到图层 A 的旋转属性,则 After Effects 会自动创建变量,将一维旋转属性值分配给该变量,然后将该变量用于缩放属性的两个维度:
temp = thisComp.layer(1).transform.rotation; [temp, temp]
矢量
在 After Effects 中,许多属性和方法都采用或返回矢量。如果数组表示空间中的一个点或方向,则 After Effects 将数组称为矢量。例如,After Effects 将 position 描述为返回一个矢量。
然而,虽然 audioLevels 等函数确实返回二维值(左声道和右声道级别),但因为它不表示点或方向,所以并不称为矢量。After Effects 中的一些函数接受矢量参数,但通常仅在传递的值表示方向时才有用。例如,cross(vec1, vec2) 计算与输入矢量成直角的第三个矢量。当 vec1 和 vec2 是两个表示空间中的方向的矢量时,叉积非常有用,但如果它们仅表示两个任意数值集合,则不那么有用。
索引和标签
effect(“Colorama”)aram(“Get Phase From”) effect(1)aram(2)
表达式时间
表达式中的时间始终为合成时间(而非图层时间),以秒为单位 -(与 sourceRectAtTime() 表达式不同)。任何表达式的默认时间是将计算表达式的当前合成时间。下列表达式均使用默认合成时间并返回相同值:
thisComp.layer(1).position thisComp.layer(1).position.valueAtTime(time)
要使用相对时间,请向 time 参数添加增量时间值。例如,要在当前时间之前 5 秒获取位置值,请使用以下表达式:
thisComp.layer(1).position.valueAtTime(time-5)
对嵌套合成中属性的默认时间引用使用原始默认合成时间,而不是重新映射的时间。但是,如果您使用 source 函数检索属性,则将使用重新映射的时间。
例如,如果包含的合成中的图层源是嵌套合成,且包含的合成中有重新映射的时间,则使用以下表达式获取嵌套合成中图层的位置值时,位置值将使用合成的默认时间:
comp("nested composition").layer(1).position
但是,如果使用源函数访问图层 1,则位置值将使用重新映射的时间:
thisComp.layer("nested composition").source.layer(1).position
如果在表达式中使用特定时间,After Effects 会忽略重新映射的时间。
因为表达式运行时采用以秒(而不是帧)为单位的时间,所以有时需要使用时间转换方法转换时间值才能基于帧执行操作。
示例:使用表达式语言参考编写表达式
跟随此示例一起学习如何使用 After Effects 表达式语言参考编写表达式。此示例中创建的表达式将“纯色 2”的位置属性与“纯色 1”的位置属性相关联,“纯色 2”的移动与“纯色 1”的移动偏移量为 2 秒。
-
创建两个纯色图层:纯色 1 和纯色 2。
-
使用关键帧对“纯色 1”的位置属性值进行动画制作。(请参阅关于动画、关键帧和表达式。)
-
选择“纯色 2”的位置属性并选择动画 > 添加表达式,或者按住 Alt 键并单击 (Windows) 或按住 Option 键并单击该属性的秒表 按钮。默认情况下将显示以下表达式:
transform.position
-
直接在 transform.position 上键入以下内容:
thisComp
-
元素 thisComp 是全局属性,其值是表示当前合成的合成对象。要确定表达式中 thisComp 后面的内容,请在全局对象、属性和方法下查找 thisComp 的返回值。
请注意,thisComp 返回的是合成对象。接下来,查看合成属性和方法以了解可以将哪些属性和方法用于合成对象。一种选项是 layer(index)。圆括号内的索引或数字指定要使用的图层。在此示例中,我们假定纯色 1 是您的合成中的第一个图层。要从活动合成的第一个图层中检索值,在表达式末尾键入 .layer(1) 以得到下列内容:
thisComp.layer(1)
-
再次查看表达式元素引用以确认 layer(index) 返回的是图层对象。查看图层常规属性和方法,并查找要使用的元素。例如,如果您要获得图层的位置属性的值,请在表达式结尾键入 .position 以得到下列内容:
thisComp.layer(1).position
-
在属性特性和方法中,注意 valueAtTime 方法返回的是数字或数组。当表达式返回数目、数组或布尔值(True 或 False)时,您无法再向该表达式添加属性或方法(但如果需要,可以添加算术运算符,例如 +、-、* 和 /)。
更多表达式资源
当您领会了表达式背后的一些概念之后,请前往社区观看一些真实案例并分享您的作品。
AE Enhancer 论坛也提供了有关表达式、脚本和动画预设的许多示例和大量信息。