一、问题:同一套动画如何服务高矮胖瘦各种角色
你有一组动画资源:一段走、一段跑、一段待机。它们是为某一个具体角色录的。
现在你要把它们用在另一个角色上——身高差 30 厘米,肩膀更宽,胳膊更长,手臂比例还不一样。
直接把动画播过去会出什么问题?
- 脚步会打滑:源角色的步幅是 70 厘米,目标角色的腿长 90 厘米,但动画里的位移还是 70 厘米;
- 手臂会穿过身体:源角色的手臂相对躯干更短,映射过去之后手臂会「陷进」躯干里;
- 膝盖会反向弯曲:源角色的大腿小腿比例是 1:1,目标角色是 1.2:1,同样 90° 的膝关节角,在两个角色身上呈现的弯曲方向完全不同;
- 整体看起来像「一个高个子在用小骨架的衣服」,违和感极强。
问题的本质是:骨骼动画记录的是「关节角」,但角色的外观由「骨骼长度和比例」决定。前者可以搬运,后者不能。
所以引擎需要一个中间层:
源角色的骨架 ──► 标准人形 ──► 目标角色的骨架 (A) (中间表示) (B)这个中间表示就是 Avatar。它不记录具体骨骼,而记录「这个角色在标准人形坐标系里是什么样子」。