EffectCraft操作技巧

EffectCraft JavaScript 表达式入门:让动画自己算出来

从 wiggle 到惯性跟随,掌握 EffectCraft 的 JS 表达式驱动动画,少打一半关键帧。

量子猿2026-09-30约 5 分钟

EffectCraft(当前 v0.4.0)是对标 After Effects 的动效合成软件,内置 259 种特效与一套 JavaScript 表达式系统——任何可动画属性都可以用一小段 JS 驱动。表达式最大的价值不是炫技,而是少打关键帧、动画自动生成、改参数全局响应。

语法与 AE 表达式同宗(都是 JS 方言),AE 老手可以无痛迁移大部分写法。

在哪里写表达式

  1. 选中图层,按 E 展开属性(或直接找到要驱动的属性)
  2. 按住 Alt(macOS:Option)点击属性的秒表图标,属性值变成红色——表示已被表达式接管
  3. 在右侧出现的输入框里写 JS,点击空白处应用

一个最简单的开始:

// 每帧执行,返回值就是属性值
100;

这条表达式把属性永远钉在 100。真正有用的是它:

wiggle:最著名的表达式

让图层位置随机抖动,参数是(频率, 振幅):

wiggle(3, 20); // 每秒 3 次,振幅 20 像素的手持感

套在 Position 上立刻得到手持镜头效果。把 20 改成 2 就是轻微呼吸感。这是全行业使用率最高的表达式,没有之一。

time:线性动画不打关键帧

time 是当前时间(秒):

// 位置属性:每秒向右移动 100 像素
[value[0] + time * 100, value[1]];
  • value 是属性的当前值(数组属性用下标取分量)
  • 配合取余可以做无限循环:
// 旋转属性:匀速旋转,永远
time * 90; // 每秒转 90 度

惯性跟随(表达式动画的经典款)

让 B 图层带延迟、带阻尼地跟随 A 图层——打关键帧做不出来这种「物理感」:

// 假设 thisLayer 是跟随者,目标图层名为 "leader"
const target = thisComp.layer("leader");
const delay = 0.1; // 延迟 0.1 秒
const factor = 0.85; // 跟随强度(越小越懒)

const tx = target.transform.position.valueAtTime(time - delay)[0];
const ty = target.transform.position.valueAtTime(time - delay)[1];

// 用 value 与目标值插值实现平滑逼近
[lerp(value[0], tx, 0.2), lerp(value[1], ty, 0.2)];

EffectCraft 表达式环境内置了常用数学/缓动函数(lerp、clamp、seedRandom 等)与图层/合成引用。具体函数清单可在内置帮助文档 Expressions 一节查阅,v0.4 后仍在持续补充。

弹性出现(overshoot)

物体出现时过冲再回弹,动效设计的高频需求:

// 透明度属性:第 1 秒出现,带 20% 过冲
const t = time - 1; // 从 1 秒开始
if (t < 0) 0;
else {
  const decay = Math.exp(-4 * t); // 衰减包络
  100 * (1 - Math.cos(t * 12) * decay);
}

把这段套在 Scale(改 100 为基准)上就是「砰地弹出来」。

表达式实用心法

  1. 先想数学模型再写代码:动画 = f(time)。想清楚随时间怎么变化,翻译成 JS 就行
  2. 参数提到变量:改 const freq = 3 比在三个地方改 3 舒服
  3. 多打 console.log(value):EffectCraft 的表达式控制台会输出每帧结果,调试交互式可视
  4. 一个属性只留一个真源:要么秒表关键帧,要么表达式,混着排查起来最痛苦

表达式 × 259 特效的结合

表达式不只驱动变换属性,也能驱动特效参数。比如给模糊特效的模糊量加:

wiggle(2, 8);

整个画面开始呼吸般地虚实变化——这就是「让特效活起来」的最低成本方式。

下一步

  • 动画做好了要上 Web?看 导出 Lottie 到 Web 全流程
  • EffectCraft 还有 3D 相机、灯光与软阴影,表达式同样可以驱动 3D 属性(相机运动自动化是绝配)

小结

  • Alt/Option + 秒表 启动表达式,红色值代表已接管
  • 三板斧:wiggle(抖动)、time(线性)、lerp + delay(跟随)
  • 表达式是 JS,但只写纯函数:每帧执行一次,返回值即属性值

相关教程

本教程由社区贡献,内容基于 ArtCraft 软件早期版本,功能与界面可能随版本更新变化。ArtCraft 系列软件当前处于早期开发阶段,请在重要项目前自行备份文件。本站为非官方社区站点,与 storytold 团队没有隶属关系。