概念与词汇¶
ORC 由大约十个词构建而成。在这里学会它们,文档里其他每一页都会变短。
支撑整个工具的一句话:
一个 rig,就是一组按位置寻址的 pose。
下面的一切,要么是你可以在其中移动的 position,要么是存在某个 position 上的 pose,要么是读取某个 position 并做出posing之外的事情的东西。
组成部分¶
Snap¶
一个 snap 是一个位置 —— grid 的一个格点,slider 的一个停靠点。它有一个永不改变的名字:R0C0 是左上角的 snap,R2C4 是第 2 行第 4 列。行和列都从零开始,且 R0 是最上面一行。
这个名字不是装饰。它出现在 grid 自己的标尺上、log 里、preset 文件内部,以及合成出的 rig 中。出问题时,R1C3 就是你说出 哪里 的方式。
Pose Layer¶
一个 pose layer 是一个由 snap 组成的 grid,加上一份它被允许移动的对象清单。这就是全部定义。
眉毛、眼皮、嘴角、一根手指的弯曲程度 —— 每一个都是一个 pose layer,拥有自己的 grid 和自己的 target。
一个 layer 按 snap 存储 一个 frame 号。不是一个 pose —— 是一个 frame。见下方的 Frames 优先。
Control¶
一个 control 是一个转身支架。它带有一个 Front face,并可以选配一个 Back face —— 每个 face 本身都是一个 pose layer —— 外加在成品 rig 里的一个 Front ↔ Back 开关。
control 的意义在于 其他 layer 会跨越它打 key。你的眉毛 layer 并不是只有十五个 pose;而是在头部的十五个 pose 各自之上 都有十五个 pose。头部这个 control,就是让这句话成立的承载父级。
每个 rig 都从一个叫 Head 的 control 开始。你可以重命名它、删除它,或者再加更多。
Target¶
一个 target 是一个 pose layer 被允许移动的 Harmony 节点 —— 一个 peg、一个变形组、一个 drawing。target 就是 layer 用来知道自己拥有角色哪一部分的方式。
两个 layer 可以指向同一个节点;ORC 会在它们的写入发生重叠时提醒你,并告诉你这重叠是相加还是替换。
Knob¶
一个 knob 是被当作 轴 使用的 pose layer,而不是当作一组 pose 使用。
把某个 layer 的 Knob 选择器指向另一个 layer,你的 layer 就会同时跨越那个 layer 的各个 position 打 key。一个有 13 个 position 的音素(phoneme)knob,意味着你的嘴部 layer 每个音素只需授权一次 它的 grid。
knob 是一种 角色,而不是一种类型 —— 任何 pose layer 都可以充当它,并且它会保留自己原有的一切:自己的 grid、自己的 target,以及自己已授权的 frame。变成别人的轴,不会拿走这些东西中的任何一样。
两种变体:
| 它驱动什么 | |
|---|---|
| control 的 knob | control 自己的 pose grid —— 整个转身跟着它一起动。 |
| extra knob(附加 knob) | 只有指向它的那个 layer 会动。 |
Page、Pair 与 Side¶
一个 page 是某个 layer 的 grid 的一个编号变体。一个 page 要么装着:
- 一个 pair —— 两个 grid,
Left-1和Right-1,要么 - 一个 solo —— 一个 grid,
Solo-1。
每个 target 都带有一个 Side,标明是哪个 grid 在驱动它:Left-1、Right-2、Both-3、Solo-1。这就是一个 layer 如何用两个互为镜像的 grid,分别驱动左右两条眉毛。
page 编号是 稳定的 id。删掉 page 2,剩下的 page 仍然是 1 和 3 —— 这个空缺是正确的,因为你的 snap 名字仍然指向它们。
Driver¶
一个 driver 是把一个值写到某处的 widget —— 一个 slider、一个 checkbox、一个 combo slider,或者一个 2-D pad。
pose layer 说的是 "在这个 position 上,显示 frame 861",而 driver 说的是 "把这个节点的 OPACITY 设为 43.7",或者 "替换这个 drawing",或者 "禁用这个节点"。
driver 可以是 global(处处一个值),也可以像 pose 一样 按 snap 打 key。它还可以驱动 另一个 driver,或者给一个 constraint 做 gate。
Constraint¶
一个 constraint 在节点之间连接变换通道:Copy 让 target 跟随一个 source peg,Lock 把它们冻结在原地。它是一个纯粹的开/关,始终是 global 的,一个 checkbox driver 可以把它打开或关闭。
Look-At¶
一个 look-at 是一套注视系统:一个负责瞄准的 joystick,以及最多两个独立响应它的东西。
| 模式 | 移动的对象 | 典型用途 |
|---|---|---|
| Tracked Pegs | peg 变换 | 虹膜、瞳孔 —— 任何在眼睛里滑动的东西 |
| Deform Follow | 变形点 | 眼皮、皮肤 —— 任何应当随注视一起被拖动的东西 |
两者 完全独立。可以只用其中一个,也可以两个都用。
Visibility Group¶
一个 visibility group 决定动画师在画布上能看到、能操作什么。组可以嵌套,每一组都可以选择:关掉父级时,是只隐藏子级的 checkbox(Cascade),还是连它们的 widget 也一起隐藏(Override)。
Hidden 是唯一一个永久的组:放进去的东西都是关闭且不可触及的。这是在不删除的情况下把某个东西"封存"的方式。
Frames 优先¶
关于 ORC,要理解的最重要的一件事。
一个 pose layer 存的是一个 frame 号,而不是一个 pose。
你用 Harmony 真正的工具,在 frame 861 上给角色摆好 pose。你按下 F6。ORC 记下"861"。到 Compose 的那一刻,而且只有到那时,它才会去读 rig 在 861 上实际的样子,并把它烘焙进 Master Controller。
由此得出:
- 编辑是非破坏性的。 回到 861,修好眉毛,重新 compose。改动会被拾取。任何东西都从未被烘焙进 ORC 内部。
- 你用的是自己的工具。 ORC 没有 posing 画布,因为 Harmony 本身就是一个。
- 一份配置是可移植的。 因为 ORC 存的是 position 和 frame 引用,而不是差值(delta),同一套配置可以指向另一个角色。这正是 角色 preset 得以实现的原因。
Position 如何叠加:dimension¶
这里才是威力所在,而且它比听起来的要简单。
一个 pose layer 打 key 所跨越的:
它自己的 grid + 承载它的 control + 它的 knob
它们各自贡献自己的轴,并相乘为一个地址:
| 这个 layer | 轴数 | 读作 |
|---|---|---|
| 一个 3 × 3 grid 的 global layer,没有 control,没有 knob | 2 | 2D |
| 同一个 layer,放进 Head 这个 control 里 | 2 + 2 | 4D |
| ……并跨越一个 13-position 的音素 knob 打 key | 2 + 2 + 1 | 5D |
| ……如果那个 knob 换成一个 2-D grid | 2 + 2 + 2 | 6D |
六是一个 pose layer 的实用上限 —— 它自己的 grid、它的 control,以及一个 knob,每个最多两维。driver 和 look-at 字段能到 八,因为它们自己的 widget 会在同一套叠加之上再加上自己的维度。
Outliner 会在每一行显示这个数字,悬停时会用文字把这个和数拼出来。
每一个 dimension 都会让工作量翻倍
一个 5 × 3 的 control 配一个 3 × 3 的 layer,就是 135 个 pose。再加一个 13-position 的 knob,就是 1,755 个。ORC 会随着数字上升发出警告,但永远不会阻止你 —— 那些 pose 终究是你要去授权的。
Key domain¶
一个 key domain 是某个东西被打 key 所跨越的 position 集合。pose layer 的 key domain 来自它在树中所处的位置。driver 和 look-at 则要显式选择自己的:
| Domain | 含义 |
|---|---|
| Global | 处处一个值。完全不打 key。 |
| Control | control 的每个 snap 一个值。 |
| Pose Layer | layer 的每个 snap 一个值 —— 在 control 的每一个 pose 上都 相同。 |
| Control + Pose Layer | 两者的乘积。 |
这就是为什么在 Outliner 里移动一个节点会改变它的行为:它坐在哪里,就决定了它跨越什么打 key。
Interpolation¶
在 snap 之间,ORC 会做插值。拖动下面的 handle,看看周围四个 snap 各自分得的份额 —— 权重之和始终为 1。
关掉 Interpolation 会让最近的那个 snap 直接胜出,不做混合。这是成品 rig 里的一个运行时开关,动画师可以在平滑的 control 和硬切步进的 control 之间切换。
Widget 形状¶
四种形状,分布在两条轴上:有多少维,以及 handle 会不会 停靠。
| 离散(会停) | 连续(不会停) | |
|---|---|---|
| 1-D | Combo Slider | Continuous Slider |
| 2-D | Combo Grid | Continuous Grid |
再加上 Checkbox,只有两种状态,中间什么都没有。
图标本身 就是 定义
内部的线条就是 snap 的停靠点。 连续类型的画法与它的离散孪生体完全一样,只是去掉了那些线。
pose 永远是离散的 —— 一个 pose layer 就是一 组 pose。driver 的 pad 永远是连续的 —— 一个离散的 2-D 东西就只会是一个 pose layer 了。
全部如何拼在一起¶
Rig
├── Head ← 一个 Control:Front + Back face
│ ├── Look-At ← 锚定在这个 control 上
│ ├── Head Knob ← 一个 Knob:control 自己的轴
│ │ └── Mouth Corners ← 一个跨越该 knob 打 key 的 Pose Layer
│ ├── Eyebrows ← 一个跨越该 control 打 key 的 Pose Layer
│ └── Eyelids
├── Exagerate Exp ← 一个 Driver
└── Constraint 1 ← 始终是 global
Visibility Groups
├── All
│ ├── Head
│ ├── Eyebrows
│ └── Controls
└── Hidden ← 永久的收纳处
把这棵树读成一句句话:
- Mouth Corners 跨越 Head Knob 打 key,而 Head Knob 又跨越 Head —— 所以它是 5D 或 6D。
- Eyebrows 直接跨越 Head 打 key —— 4D。
- Constraint 1 是 global 的;它完全没有 position。
- 每一个可见的东西都属于某个 visibility group。
接下来去哪¶
| 从头到尾搭一个 | Quick Start |
| 了解这个窗口 | 界面总览 |
| 深入这棵树 | The Outliner |
| 深入 dimension | Dimensions & Key Domains |