用户指南 取消(C)

表达式示例

下载示例项目

下载

随机摆动

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

  1. 在合成中选择一个图层。

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

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

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

    wiggle(2,30)
    wiggle(2,30)
    wiggle(2,30)

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

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

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

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

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

    // 使用关联器创建到滑块的 “effect(...)” 链接
    var wiggleAmount = effect(“Wiggle Amount”)(“Slider”
    // 按照滑块设置的数量每秒摆动 4 次
    wiggle( 4, wiggleAmount
    // 使用关联器创建到滑块的 “effect(...)” 链接 var wiggleAmount = effect(“Wiggle Amount”)(“Slider” // 按照滑块设置的数量每秒摆动 4 次 wiggle( 4, wiggleAmount
    // 使用关联器创建到滑块的 “effect(...)” 链接
    var wiggleAmount = effect(“Wiggle Amount”)(“Slider”
    
    // 按照滑块设置的数量每秒摆动 4 次
    wiggle( 4, wiggleAmount 

使图层做圆周运动

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

  1. 在合成中选择一个图层。

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

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

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

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

抖动

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

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

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

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

    // 设置值以控制抖动。
    // 将这些值链接到滑块表达式控件以快速预览不同的设置。
    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;
    }
    // 设置值以控制抖动。 // 将这些值链接到滑块表达式控件以快速预览不同的设置。 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; }
    // 设置值以控制抖动。
    // 将这些值链接到滑块表达式控件以快速预览不同的设置。
    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;
    }

随时间旋转

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

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

  2. 在图层结尾设置锚点

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

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

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

    thisCompayer(“circle”)otation
    thisCompayer(“circle”)otation
     thisCompayer(“circle”)otation
  6. 要使第二个圆的旋转速度是第一个圆的 12 倍,请在表达式末尾添加 *12,如下所示:

    thisCompayer(“circle”)otation*12
    thisCompayer(“circle”)otation*12
    thisCompayer(“circle”)otation*12
  7. 对第三个圆重复相同的操作,并在表达式末尾添加 *24

    thisCompayer(“circle”)otation*24
    thisCompayer(“circle”)otation*24
    thisCompayer(“circle”)otation*24

循环

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

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

//loopOut 设置为循环所有关键帧
loopOut(“cycle”, 0
//loopOut 设置为循环所有关键帧 loopOut(“cycle”, 0
//loopOut 设置为循环所有关键帧
loopOut(“cycle”, 0

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

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

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

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

// 定义有父级的图层
var targetLayer = thisCompayer(“Parented Layer”
// 在合成中查找有父级的图层的“锚点”
targetLayeroComp( targetLayernchorPoint
// 定义有父级的图层 var targetLayer = thisCompayer(“Parented Layer” // 在合成中查找有父级的图层的“锚点” targetLayeroComp( targetLayernchorPoint
// 定义有父级的图层
var targetLayer = thisCompayer(“Parented Layer”

// 在合成中查找有父级的图层的“锚点”
targetLayeroComp( targetLayernchorPoint 

从父图层延迟图层的位置

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

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

// 以帧为单位设置延迟量
var delay = 5;
// 根据延迟在时间上偏移图层的位置
parent.fromComp( toComp( anchorPoint, time - framesToTime( delay ) ) );
// 以帧为单位设置延迟量 var delay = 5; // 根据延迟在时间上偏移图层的位置 parent.fromComp( toComp( anchorPoint, time - framesToTime( delay ) ) );
// 以帧为单位设置延迟量
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 ) ) );
// 以帧为单位设置延迟量 var delay = 5; // 根据该图层相对于其父图层的索引乘以延迟 var multiplyDelay = delay * ( index - parent.index ) // 基于延迟在时间上偏移图层的位置 parent.fromComp( toComp( anchorPoint, time - framesToTime( multiplyDelay ) ) );
// 以帧为单位设置延迟量
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;
}
var timeToStart = 2; if (time > timeToStart) { wiggle(3,25); } else { value; }
var timeToStart = 2;

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

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

var timeToStop = 4;
if ( time > timeToStop ) {
value;
} else {
wiggle( 3, 25 );
}
var timeToStop = 4; if ( time > timeToStop ) { value; } else { wiggle( 3, 25 ); }
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;
}
var timeToStart = 2; var timeToStop = 4; if ( ( time > timeToStart ) && ( time < timeToStop ) ) { wiggle(3,25); } else { value; }
var timeToStart = 2;
var timeToStop = 4;

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

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

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

  1. 首先,请创建三个图层

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

    提示:

    了解如何使用运动路径

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

  4. 在表达式字段中输入以下内容:
    ( thisComp.layer(1).position + thisComp.layer(2).position ) / 2
    ( thisComp.layer(1).position + thisComp.layer(2).position ) / 2
    ( thisComp.layer(1).position + thisComp.layer(2).position ) / 2

创建图像轨迹

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

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

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

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

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

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

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

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

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

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

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

  5. 选择默认表达式文本并键入以下内容:
    fromWorld(thisCompayer(“Magnifier”)osition)
    fromWorld(thisCompayer(“Magnifier”)osition)
    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 ) {
// 无摄像机,因此假设 50mm
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 );
var startFade = 500; // 在距离摄像机 500 像素的位置开始淡化。 var endFade = 1500; // 在距离摄像机 1500 像素的位置结束淡化。 try { // 检查是否存在摄像机 var C = thisComp.activeCamera.toWorld([0,0,0]); } catch ( err ) { // 无摄像机,因此假设 50mm 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 );
var  startFade = 500; // 在距离摄像机 500 像素的位置开始淡化。
var  endFade = 1500; // 在距离摄像机 1500 像素的位置结束淡化。

try {
 // 检查是否存在摄像机
 var C = thisComp.activeCamera.toWorld([0,0,0]);
} catch ( err ) {
 // 无摄像机,因此假设 50mm
 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;
}
if ( toCompVec([0, 0, 1])[2] > 0 ) { value; } else { 0; }
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] ];
}
if ( toCompVec([0, 0, 1])[2] > 0 ) { value; } else { [ -value[0], value[1], value[2] ]; }
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];
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];
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 = thisCompayer(“target”
var V1 = targetoWorld( targetnchorPoint ) - toWorld( [ 0, 0, 0 ]
var V2 = toWorldVec( [ 0, 0, 1 ]
dot( V1, V2
var target = thisCompayer(“target” var V1 = targetoWorld( targetnchorPoint ) - toWorld( [ 0, 0, 0 ] var V2 = toWorldVec( [ 0, 0, 1 ] dot( V1, V2
var target = thisCompayer(“target”
var V1 = targetoWorld( targetnchorPoint ) - toWorld( [ 0, 0, 0 ] 
var V2 = toWorldVec( [ 0, 0, 1 ] 

dot( V1, V2 

更多表达式资源

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

更快、更轻松地获得帮助

新用户?