AutoPivot¶
AutoPivot 把每个 peg 的枢轴放到画稿实际所在的位置,并让每一帧都留在画师画它的地方。
它作为 Assemble 的最后一个阶段运行,并且默认开启 —— 对应 Browser 的 Settings 区域或 Preferences 里的 AutoPivot 复选框。
它解决的问题¶
手工把画稿导入 Harmony,每个 peg 的枢轴都落在原点 —— 摄像机正中 —— 不管画稿在哪。旋转一条手臂,它会绕着场景中心转,而不是绕着肩膀。
手工修正这件事,是每个 peg 一次拖拽,每个 peg 都要,每个场景都要。
阶段 A —— 锦标赛¶
在 frame 1,OSA 用它刚创建的节点搭出 peg 层级,穿过 group 和 composite 去找到每个 peg 真正的子树。
在每个 peg 上,包围盒面积最大的子树胜出,它的质心成为该 peg 的枢轴。
"面积最大"不是随便定的:在一套骨架里,一个 peg 存在的目的几乎总是它下面最大的那个东西。头部 peg 最大的子级是头;手臂 peg 的是手臂。挑最大的子树,就能把枢轴放到这个 peg 本来就是要驱动的那块画稿上。
只考虑 OSA 创建的节点。场景里本来就有的节点不予理会 —— AutoPivot 从不编辑别人的骨架。
阶段 B —— 逐帧补偿¶
下面这部分对动画才是关键。
画稿被提取时,每一帧都以参考位置(frame 1)居中。这正是让阶段 A 的枢轴对整段序列都成立的原因 —— 但这也意味着第 2 帧及之后会坐在 frame 1 的位置上,而不是它们自己的位置。
所以阶段 B 逐帧计算 peg 的位置增量,把每一帧的画稿放回它在原始 PSD 中所在的确切位置:
- 它使用提取过程中记录的 pixel → OGL 标定,所以计算是在场景自己的单位里进行的;
- 父 peg 先动,自上而下,每个子级减去继承来的父级增量 —— 它只施加残差,这样嵌套的骨架不会把父级的移动算两遍;
- 只对 position.x / position.y 做动画。绝不动旋转,绝不动倾斜:AutoPivot 存在是为了保住位置,不是为了发明运动;
- 每个关键帧都是阶跃插值(
constSeg),所以曝光之间没有漂移 —— 一张保持的 drawing 不会滑动。
排除某个 peg¶
在 Inspector 的 Peg 区块勾上 Exclude AutoPivot,那个 peg 的枢轴就原封不动。
对每个来自 .anm 或 .pvt 文件的 peg,这一项会自动设上,因为那些枢轴属于烘焙结果,覆盖它们会毁掉你刚导入的动画。见 Transform Sync。
当某个 peg 的枢轴是刻意的艺术指导时,就手动用它 —— 比如一块摇摆的招牌,绕它的支架而不是绕质心转。
在 Original Bitmap 模式下¶
裁切本身就是归一化。 Original Bitmap 里的 drawing 没有 art layer,而裁切曝光的那一趟,和为 AutoPivot 做归一化的是同一趟 —— 一个操作,不是两个。
这就是为什么这个模式在大画板上更省:不存在针对一张 30 000 像素图像的单独归一化步骤。
它什么都不做的时候¶
| 情形 | 为什么 |
|---|---|
| 没有带曝光的 drawing 节点 | 没有包围盒可测 |
| 每个 peg 都被排除 | 没有东西要算 |
| 这个 peg 不是 OSA 创建的 | AutoPivot 只碰自己的节点 |
这三种情况每一种都会写一行日志,而不是悄无声息地什么都不做 —— 如果枢轴没有移动,osa.log 会说明是这三者中的哪一种。
