表达式示例

上次更新日期: 2024年8月29日

下载示例项目

下载此 .aep 文件以开始使用以下表达式示例。

随机摆动

摆动表达式是最常见的 After Effects 表达式之一。 将在随机值之间摆动对象。 此表达式可使您的场景看起来更加自然。 在图层的位置属性中添加此表达式。

在合成中选择一个图层。

P时间轴面板中显示其位置属性。

按住 Alt 键并单击 (Windows) 或按住 Option 键并单击 (macOS) 属性名称左边的秒表图标。

在表达式字段中输入以下代码片段:

wiggle(2,30)

在此示例中,摆动(频率,数量),第一个数字是每秒摆动次数,第二个数字是摆动值。 因此,使用 wiggle(2,30) 表示在任意方向,图层每秒摆动 2 次,最多 30 像素。

使用“滑块”控件控制摆动

可以通过使用到表达式控件的链接(比如滑块控件)替换值设定表达式的关键帧。 通过使用滑块控件的链接替换 wiggle() 表达式的第二个参数,可以为该行为设定关键帧,以便在特动时间开始和停止。

向任何图层添加滑块控件效果,并将其命名为摆动量

在同一图层的位置属性中应用以下表达式:

// 使用拾取鞭创建 "effect(...)" 关联到滑块
var wiggleAmount = effect("Wiggle Amount")("Slider");

// 按滑块设置的量每秒摆动 4 次
wiggle( 4, wiggleAmount );

使图层做圆周运动

您可以创建表达式,而不使用其他图层中的属性。 例如,可以使图层围绕合成的中心旋转。

在合成中选择一个图层。

P时间轴面板中显示其位置属性。

按住 Alt 键并单击 (Windows) 或按住 Option 键并单击 (macOS) 属性名称左边的秒表图标。

在表达式字段中输入以下代码片段:

var centerOfComp = [ ( thisComp.width / 2 ), ( thisComp.height / 2) ];
var circleOverTime = [ Math.sin( time ) * 50, -Math.cos( time ) * 50 ];
centerOfComp + circleOverTime;

抖动

通常称为惯性回弹,该表达式使用图层自身关键帧动画创建自然抖动。 将根据其速度创建从一个关键帧到下一个关键帧的任何参数的回弹运动。 回弹可发生在对象移动的任何方向。 要实现此动画,请执行以下操作: 

在 After Effects 中创建或导入图形。

在要设置动画的图层的位置属性中添加关键帧。

 在该图层的位置属性中添加以下表达式:

// 设置用于控制过冲的值。
// 将这些值关联到滑块表达式控件,以快速预览不同设置。
var amp = 40;
var freq = 30;
var decay = 50;

// 查找最近的关键帧
var nK = nearestKey(time);
var n = (nK.time <= time) ? nK.index : --nK.index;
var t = (n === 0) ? 0 : time - key(n).time;

// 如果当前时间晚于关键帧,计算过冲。
// 如果不是,使用原始值。
if ( n > 0 && t < 1 ) {
var v = velocityAtTime( key( n ).time - thisComp.frameDuration /10 );
value + v * amp * .001 * Math.sin(freq * .1 * t * 2 * Math.PI) / Math.exp(decay * .1 * t);
} else {
value;
}

随时间旋转

您可以使用关联器将图层之间的旋转值关联起来,从而为对象设置动画。 时钟的工作方式,将这三个圆圈视为时钟的三个指针 - 时针一小时一小时地移动,分针围绕钟面的整个圆周旋转。

导入或创建三个圆形纯色图层。 让我们假设其中一个像时针一样工作,另一个像分针一样工作,第三个像秒针一样工作。

在图层结尾设置锚点

移动图层以便锚点位于合成的中心。

设置时针的旋转关键帧。 选择分针的旋转属性并选择动画 > 添加表达式

将关联器拖动到最大圆的旋转属性。 将显示以下表达式: 

thisCompayer(“circle”)otation

要使第二个圆的旋转速度是第一个圆的 12 倍,请在表达式末尾添加 *12,如下所示: 

thisCompayer(“circle”)otation*12

对第三个圆重复相同的操作,并在表达式末尾添加 *24

thisCompayer(“circle”)otation*24

循环

表达式可用于循环和扩展动画,而无需添加额外的关键帧 - 例如,可以在合成结束前进行多个形状的旋转。 为此,请为起始旋转的旋转属性添加一个关键帧,然后在结束旋转中添加另一个。 然后,将 loopOut() 方法应用于关键帧旋转属性,将允许图层在最后一个关键帧之后保持旋转。

下面的 loopOut() 示例中使用的参数设置了循环类型以及要包含在循环中的关键帧数量。

//loopOut 设置为循环所有关键帧
loopOut("cycle", 0);

第一个参数为 "cycle",它是适用于 loopOut 方法的四个可用循环模式之一。 其他三个参数是 "continue""offset""ping-pong"。 "cycle" 在最后一个关键帧处开始循环,并在第二个参数所定义的范围内的第一个关键帧的值处重新开始。

第二个参数是指包含在循环中的关键帧数,从最后一个关键帧向后计数。 如果第二个参数未给定或设置为 0,则属性上的所有关键帧动画将在最后一个关键帧之后循环。 如果参数为 1,则将循环最后一个关键帧与它前一个关键帧之间的动画。 如果参数为 2,则将循环位于最后一个关键帧和它之前的两个关键帧之间的动画,依次类推。

获取有父级的图层的真实“位置”

当图层有父级时,其位置属性中显示的值不是其在合成中的“真实”位置,而是相对于其父图层的位置。 要找到有父级的图层的真实位置,必须使用表达式将父图层的坐标空间转化为合成的坐标空间。 将以下表达式应用于无父级的图层的位置以将其链接到有父级的图层的位置:

// 定义父级图层
var targetLayer = thisComp.layer("Parented Layer");

// 在合成中查找父级图层的锚点
targetLayer.toComp( targetLayer.anchorPoint );

从父图层延迟图层的位置

延迟偏移是使动画更具动感且更自然的好方法。 您可以将多个图层关联到一个父图层,然后将表达式应用于每个子图层的位置以延迟从父级继承的运动来创建和控制这些类型的偏移。

注意,这仅适用于有父级的图层。

// 以帧为单位设置延迟量
var delay = 5;

// 根据延迟在时间上位移图层的位置
parent.fromComp( toComp( anchorPoint, time - framesToTime( delay ) ) );

还可以根据子图层相对于父图层的索引来驱动延迟量。 这样,您可以通过在父级下方的时间轴中重新排列子图层的动画来轻松重排它们的顺序(如果您希望子图层的动画出现在父级之前,则在时间轴上方):

// 以帧为单位设置延迟量
var delay = 5;

// 根据该图层相对于其父级图层的索引来乘以延迟
var multiplyDelay = delay * ( index - parent.index )

// 根据延迟在时间上位移图层的位置
parent.fromComp( toComp( anchorPoint, time - framesToTime( multiplyDelay ) ) );

表达式示例:在特定时间开始或停止摆动

将以下表达式添加到元素的位置属性,以在动画播放 2 秒处启动摆动效果:

var timeToStart = 2;

if (time > timeToStart) {
wiggle(3,25);
} else {
value;
}

将以下表达式添加到元素的位置属性,以在动画开头启动摆动效果并在 4 秒后停止:

var timeToStop = 4;

if ( time > timeToStop ) {
value;
} else {
wiggle( 3, 25 );
}

将以下表达式添加到元素的位置属性,以在动画开头 2 秒处启动摆动效果并在 4 秒处停止:

var timeToStart = 2;
var timeToStop = 4;

if ( ( time > timeToStart ) && ( time < timeToStop ) ) {
wiggle(3,25);
} else {
value;
}

表达式示例:将一个图层放置在其他两个图层之间

此示例表达式将一个图层放置在其他两个图层之间并使其保持在其间的平衡距离处。

首先,请创建三个图层

时间轴面板中前两个图层的位置设置动画。

提示

了解如何使用运动路径

选择第三个图层。 按 P 显示位置属性。 按住 Alt 键并单击 (Windows) 或按住 Option 键并单击 (macOS) 属性名称左侧的秒表 按钮。 

在表达式字段中输入以下内容:

( thisComp.layer(1).position + thisComp.layer(2).position ) / 2

创建图像轨迹

此示例指示图层位于与“时间轴”面板中下一个更高图层相同的位置,但延迟了指定时间量(在此情况下为 0.5 秒)。 您可以为其他几何属性设置类似表达式。

打开位置属性并添加关键帧。 选择图层。 按 P 显示位置属性。 按住 Alt 键并单击 (Windows) 或按住 Option 键并单击 (macOS) 属性名称左侧的秒表 按钮。

在表达式字段中输入以下内容:

thisComp.layer(thisLayer, -1).position.valueAtTime(time - .5)

通过选择最后一个图层并按 Ctrl+D (Windows) 或 Command+D (macOS) 5 次,将最后一个图层复制 5 次。 所有图层使用同一路径,且每个比上一个延迟 0.5 秒。

表达式示例:在两个图层之间创建凸出

此示例表达式将一个图层中凸出效果的凸出中心参数与另一图层的位置同步。 例如,您可以创建看来像在图层上方移动的放大镜的效果,当镜头(即覆盖层)移动时内容在放大镜下凸出。 此表达式使用 fromWorld 方法,该方法使表达式正确运行,而无论您是否移动放大镜图层或者底层图层。 您可以旋转或缩放底层图层,表达式会保持不变。

您还可以将其他效果(例如波纹)与此表达式结合使用。

首先,请创建两个图层。 使一个图层成为放大镜或中间有孔的类似对象,并将其命名为放大镜。 

为放大镜图层的位置设置动画。

将凸出效果应用于其他图层。

时间轴面板中选择凸出效果的凸出中心属性。 选择动画 > 添加表达式,或按住 Alt 键并单击 (Windows) 或按住 Option 键并单击 (macOS) 属性的秒表 按钮。

选择默认表达式文本并键入以下内容:

fromWorld(thisCompayer(“Magnifier”)osition)

表达式示例:基于与摄像机的距离淡化 3D 图层的不透明度

将以下表达式应用于 3D 图层的不透明度属性:

var startFade = 500; // 从相机 500 像素处开始渐隐。
var endFade = 1500; // 从相机 1500 像素处结束渐隐。

try {
// 检查是否有相机
var C = thisComp.activeCamera.toWorld([0,0,0]);
} catch ( err ) {
// 没有相机,所以假设为 50 毫米
var w = thisComp.width * thisComp.pixelAspect;
var z = (w/2)/Math.tan(degreesToRadians(19.799));
var C = [0,0,-z];
}

var P = toWorld( anchorPoint );
var d = length( C, P );

linear( d, startFade, endFade, 100, 0 );

淡化从距摄像机 500 像素处开始,在距摄像机 1500 像素处完成。 linear 插值方法用于将距离值映射到不透明度值。

表达式示例:背对摄像机时使 3D 图层不可见

将以下表达式应用于 3D 图层的不透明度属性:

if ( toCompVec([0, 0, 1])[2] > 0 ) {
value;
} else {
0;
}

表达式示例:背对摄像机时将图层水平翻转

将以下表达式应用于 3D 图层的缩放属性:

if ( toCompVec([0, 0, 1])[2] > 0 ) {
value;
} else {
[ -value[0], value[1], value[2] ];
}

表达式示例:在每个图层标记对缩放进行动画制作

将以下表达式应用于缩放属性以在每个标记处摆动图层:

var n = 0;
var t = 0;

if (marker.numKeys > 0){
n = marker.nearestKey(time).index;
if (marker.key(n).time > time) n--;
}
if (n > 0) t = time - marker.key(n).time;

var amp = 15;
var freq = 5;
var decay = 3.0;

var angle = freq * 2 * Math.PI * t;
var scaleFact = (100 + amp * Math.sin(angle) / Math.exp(decay * t)) / 100;

[value[0] * scaleFact, value[1] / scaleFact];

注释

要添加标记,请选择图层 > 标记 > 新建标记

您可以使用任何表达式代替此处所用的 wiggle 表达式,以便在特定时间开始和结束任何表达式的影响。

表达式示例:将摄像机焦平面与另一图层匹配

将以下表达式应用于摄像机图层的焦距属性,以便其焦距与到名为 'Target' 的图层的锚点的距离相匹配:

var target = thisComp.layer("target");
var V1 = target.toWorld( target.anchorPoint ) - toWorld( [ 0, 0, 0 ] );
var V2 = toWorldVec( [ 0, 0, 1 ] );

dot( V1, V2 );

更多表达式资源

领会表达式背后的一些概念之后,请前往社区观看一些真实案例并分享您的作品。