Keyframe
进入工作室

不用表达式的骨骼:Keyframe 怎样绑定角色

AE 里的骨骼是用图层和表达式拼出来的;Keyframe 的骨架是一种图层,由编辑器直接求解。

先拖一拖

这只狐狸用的就是 Keyframe 的骨架、IK 和网格蒙皮。

拖动尾巴或爪子:每个控制点都用 IK 带动一串骨骼。

在 After Effects 里,骨骼是拼出来的

AE 没有骨骼对象,角色绑定来自 Duik 这类第三方脚本。

After Effects

  1. 控制器 · 爪子ƒ IK
  2. 骨骼 · 小腿ƒ 表达式
  3. 骨骼 · 大腿ƒ 表达式
  4. Pin · 膝盖ƒ 表达式
  5. 画面 · 后腿人偶 · 控制点
五个图层,四段表达式,每帧各算一遍

以开源的 Duik Ángela⁠ (外部网站,在新标签页打开) 为例:每根骨骼是一个普通的形状层,画面图层用父子关系挂在骨骼上。IK 由控制器图层加表达式算出来。

身体的弯曲靠 人偶工具⁠ (外部网站,在新标签页打开)的控制点,控制点再通过表达式连接的 Pin 图层跟着骨骼走。人偶工具没有逐顶点的权重,弯曲的软硬只能靠控制点的位置和数量来调。

为什么只能这样做

表达式是 AE 里把一个属性逐帧绑到另一个属性上的唯一通用办法。

// 表达式没有上一帧的记忆,只能从头重算
const stiffness = 0.2, damping = 0.8;
let x = thisComp.layer("爪子").transform.position.valueAtTime(0)[0];
let v = 0;
for (let f = 1; f <= timeToFrames(time); f++) {
  const goal = thisComp.layer("爪子").transform.position.valueAtTime(framesToTime(f))[0];
  v = (v + (goal - x) * stiffness) * damping;
  x += v;
}
[x, value[1]];
一段典型的弹簧表达式(为本文所写):要知道这一帧在哪,先把之前的每一帧重算一遍。
  • 只有这个口子。AE 的核心是闭源的:效果插件只能画自己那一层的像素,脚本只在运行的那一刻改工程。要让骨骼每一帧都跟着控制器动,除了父子关系,只能写表达式。
  • 一段只管一个属性。一个表达式的结果就是它所在属性的值。整条腿的 IK 要在每根骨骼的旋转上各写一段,同样的计算做好几遍。
  • 帧与帧之间不记事。表达式每一帧从零开始算,读不到上一帧的结果。弹簧、拖尾这类依赖历史的运动,只能像上面这样把之前的帧重算一遍,越往后越慢。

代价

慢,结构藏在文本里,换个角色就得重来。

  • 越绑越慢。Duik 的性能说明⁠ (外部网站,在新标签页打开)自己也提醒,IK 和跟随这类表达式很复杂,会明显拖慢预览。
  • 结构藏在文本里。骨骼之间的关系写在一段段表达式里,AE 不知道哪几个图层组成了一条腿,也就做不了“保持姿势换父级”“把一套动作套到另一个角色上”这类骨骼级的操作。
  • AI 读到的也只是文本。AE 新出的 AI 助手⁠ (外部网站,在新标签页打开)能读写表达式,但它面对的仍是一段段文本,而不是一副有结构的骨架。

在 Keyframe 里,骨架是一种图层

骨骼是骨架图层里的数据,整条链由编辑器一次解出来。

Keyframe

  1. 骨架一个图层
  2. 大腿
  3. 小腿IK
  4. 爪子
  5. 画面 · 后腿网格 → 骨架,带权重
两个图层,整条链一次解出

在 Keyframe 里,骨架是和图片、文字并列的一种图层。骨骼存在骨架里,可以有好几条链;FK 和 IK 由编辑器自己的代码求解,不写表达式。

部件可以直接挂到骨骼上,也可以把网格蒙皮到骨骼。画骨骼、换父级、绑定的手势参照 Spine、Moho 这类专门做骨骼动画的软件。

编辑器里角色前腿上的骨架,小腿的 IK 目标被拉向前方
  1. 骨骼工具:从关节到关节画骨骼。
  2. 选中的骨骼,小腿,已开 IK。
  3. 骨骼选项:IK 与保持角度。
  4. IK 目标:拖动它,腿就跟着弯。

网格蒙皮与权重

身体在关节处平滑地弯,弯的范围用画笔刷出来。

属性面板的网格部分:要蒙皮的骨架和它按链列出的骨骼
  1. 这个网格蒙皮到的骨架。
  2. 一条链的根骨骼。
  3. 一条链上的骨骼;勾选带动这个部件的那几根。
  4. 不带动这个部件的骨骼。

网格蒙皮到它要跟随的骨骼上,骨骼可以来自不同的链;每根骨骼影响哪里、影响多少,用权重画笔刷。这是人偶控制点做不到的。

因此能做到的

编辑器知道骨架的结构,就能做骨骼级的操作。

  1. 你画骨骼
  2. 你加 IK
  3. 你网格蒙皮刷权重
  4. 编辑器次级运动弹簧是一种行为
  5. 编辑器存成预设套到另一个角色
  • 换父级,姿势不动。给骨骼换父级时,编辑器改写它的基础值和全部关键帧,画面不跳。
  • 弹簧是一种行为。次级运动加在骨骼链上,按固定步长积分,结果只取决于项目和帧,不用回头重算。
  • 动作能复用。骨骼动画存成预设,按链的结构套到另一个角色上;对不上的地方交给你确认,不靠猜。
  • Agent 能看懂。搭骨架、蒙皮、刷权重、加 IK 都是编辑器的注册操作,Agent⁠ (在新标签页打开) 用的和你是同一套。每一步怎么操作,见使用文档的骨骼绑定⁠ (在新标签页打开)。

接着看