变形人形

这篇文章介绍了 Mecanim Humanoids 背后的技术。它是如何工作的、优势和局限性、为什么会做出某些选择,并希望能提供一些提示,说明如何充分利用它。有关一般设置和说明,请参阅 Unity 文档。

Mecanim 人形装配和肌肉空间是标准骨骼节点层次结构和几何变换之外的另一种解决方案,可用于表示人形身体和动画。
人形结构是对骨架节点层次结构的描述。它能识别一组人体骨骼,并为每块骨骼创建一个肌肉参照。肌肉参照基本上是一个前后旋转,每个轴都有一个范围和符号。

肌肉是一个归一化值 [-1,1],在 [最小,最大] 范围内移动一个轴的骨骼。请注意,Muscle 归一化值可以低于或高于 [-1,1] 以超调范围。该范围不是硬性限制,而是定义肌肉的正常运动跨度。特定的仿人装备可以增强或减小肌肉参照物的范围,从而增强或减小其运动跨度。
肌肉空间是仿人钻机所有肌肉规范化值的集合。这是一个正常化的人形姿势。骨轴的范围为零(最小值= 最大值)意味着没有肌肉。
例如,肘部的 Y 轴没有肌肉,因为它只有伸缩(Z 轴)和滚动(X 轴)。最后,"肌肉空间 "最多由 47 个 "肌肉值 "组成,这些 "肌肉值 "可以完整地描述人形肢体的姿势。

肌肉空间》的美妙之处在于,它完全抽象于其原始或任何骨架装备。它可以直接应用于任何人形装配,并始终能创造出可信的姿势。另一个亮点是 Muscle Space 的插值功能非常出色。与标准骨骼姿势相比,在动画关键帧之间、状态机转换期间或混合在混合树中时,Muscle Space 总是会自然插值。
与四元数或欧拉角相比,它在计算方面的表现也很出色,因为肌肉空间可以被视为一个标量向量,您可以对其进行线性插值。
人体和人体运动的近似值
为人形角色或任何动画制作的每一个新骨架都是人体和人体运动的近似值。无论有多少骨骼,无论 MOCAP 硬件有多好,其结果都只是与实物的近似值。
装配人员、游戏公司、学校或软件公司将提出自己认为最能代表人体和运动的版本,以及最符合其生产需求的版本。
在制作 Mecanim 人形钻机和肌肉空间时,我们面临着一些艰难的选择。我们必须在快速运行时间和动画质量之间,或者在开放性和标准定义之间找到折衷方案。

这个问题很难回答。为什么是 2 个,而不是 3 个?让我们摒弃最新的观点,它与生物医学研究无关。(请注意,如果绝对需要这种精确度,您可以使用 "通用钻机")。有一块脊椎骨的轮廓明显不够清晰。
再增加一个,就能完成大部分工作。第三个,甚至第四个,都只能为最终的人体姿势做出微小的贡献。为什么会这样?观察人体脊柱的弯曲方式时,你会发现脊柱位于肋骨上的部分几乎是刚性的。剩下的就是脊柱底部的一个主要弯曲点和肋骨底部的另一个弯曲点。因此,主要有两个弯曲点。即使是摆出极端姿势的柔术演员,也能清楚地看出这一点。考虑到这一切,我们决定为人形钻机配备两块脊柱骨。
1 块颈骨
这个比脊柱更容易。请注意,许多游戏骨骼装备甚至没有颈骨,只用头骨就能完成工作。
旋转变焦
与大多数骨骼装备一样(游戏中的情况更为常见),Mecanim 人形装备只支持旋转动画。不允许骨骼更改相对于父代的本地翻译。有些三维软件包会对骨骼进行一定程度的平移,以模拟关节的弹性或挤压和拉伸动画。我们目前正在研究增加平移多场,因为就计算性能而言,这是一种相对廉价的方法,可以在细节较少的骨架装备上补偿动画质量。它还允许用户创建可重定向的挤压和拉伸动画。

无扭曲骨骼
扭转骨骼经常被添加到骨骼装备中,以防止手臂和腿部在极端扭转状态下出现皮肤变形问题。
扭骨有助于将扭转引起的变形从肢体的起点分散到末端。
在 "肌肉空间 "中,扭转量由肌肉表示,并且总是与肢体的父骨骼相关联。Ex:前臂的扭转发生在肘部,而不是手腕。

人形假肢不支持扭转骨骼,但 Mecanim 解算器可以让你指定从父肢中提取的扭转百分比,并将其放到肢体的子肢上(默认为 50%),这大大有助于防止皮肤变形问题。
类人根和质心
现在,怎样才能最好地表示人体在世界空间中的位置和方向呢?
在标准骨骼装备中,层次结构中最顶端的骨骼(通常是臀部、骨盆或其他名称)位于世界空间位置和方向曲线的位置。虽然这种方法对特定角色很有效,但在进行重定向时就不合适了,因为从一个骨架装备到另一个骨架装备,最顶端的骨骼相对于骨架的其他部分通常会有不同的位置和旋转。

肌肉空间使用人形的质量中心来表示其在世界空间中的位置。质心是利用人体各部位的平均质量分布来近似确定的。我们的假设是,经过比例调整后,人形姿势的质心对于任何人形角色都是相同的。这是一个很大的假设,但对于各种动画和人形角色来说,它已经证明非常有效。
的确,在站立或行走动画中,质心位于臀部周围,但在后空翻等动态运动中,你可以看到身体如何远离质心,以及质心如何成为动画中最稳定的点。
身体方向
与 "质量中心 "用于 "肌肉空间 "世界空间位置的原理类似,我们也使用平均身体方位来确定世界空间方位。通过臀部和肩部的中间点计算出身体向上的平均方向向量。然后,前矢量就是上矢量与左/右臀/肩平均矢量的交乘。此外,我们还假设所有仿人钻机的仿人姿势的平均身体方向都是相同的。至于质心,平均的身体方向往往是一个稳定的参照物,因为在行走、跑步等运动时,上下半身的方向会自然得到补偿。
根运动
关于根运动的更深入的论文将在后面发表,但作为介绍,质心投影和平均身体方向用于自动创建根运动。质心和平均身体方向是仿人动画的稳定属性,这一事实导致了稳定的根运动,可用于导航或运动预测。
规模
肌肉空间》要想成为一个完全正常的人形姿势,还缺少一样东西......那就是它的整体尺寸。同样,我们正在寻找一种描述人形大小的方法,这种方法不依赖于特定的点,比如头部骨骼的位置,因为不同的钻机并不一致。人形角色在 T 型站姿中的质心高度直接用作其比例尺。肌肉空间的质心位置除以这个比例,就会产生最终的归一化人形姿势。换句话说,肌肉空间是以一个人形物体的质心高度为 1 时的 T 型姿态为标准的。肌肉空间中的所有位置都以标准化米为单位。
原始手脚位置
将肌肉空间应用于人形装配时,由于人形装配的比例不同,手和脚的位置和方向可能与原始动画不同。这可能会导致双脚滑动或双手无法正常伸展。因此,"肌肉空间 "可选择包含手和脚的原始位置和方向。在肌肉空间中,手脚位置和方向相对于人形根(质量中心、平均身体旋转和人形比例)进行归一化。这些原始位置和方向可以用来固定重定向骨架的姿势,以便通过 IK 通道与原始世界空间位置相匹配。

手臂和腿部 IK 求解器的主要目标是达到肌肉空间中可选择的原始手脚位置和方向。这就是在 Mecanim 控制器状态中启用 "脚 IK "切换时,脚在引擎盖下发生的情况。
在这种情况下,重新定位的骨架姿势与原始 IK 目标的距离永远不会太远。需要修复的 IK 误差很小,因为它只是由人形装备的比例差异引起的。IK 求解器只会稍微修改重定向骨架的姿态,以生成与原始位置和方向相匹配的最终姿态。
由于 IK 只对重定向后的骨骼姿态稍作修改,因此很少会产生膝关节或肘关节弹跳等动画假象。即便如此,IK 求解器中还有一个 "挤压和拉伸 "求解器,可以在手臂或腿部接近最大伸展时防止弹出。默认情况下,允许的挤压和拉伸量仅限于手臂或腿总长度的 5%。肘部或膝盖的弹跳比手臂或腿部 5%或更少的拉伸更明显(也更难看)。请注意,压扁和拉伸解算可以通过将其设置为 0% 来关闭。
有关 IK 钻机的更深入的论文将在随后发表。它将解释如何处理道具、使用多重 IK 传递、与环境或人形角色之间的交互等。
可选骨骼
人形钻机有一些骨骼是可选的。胸部、颈部、左肩、右肩、左脚趾和右脚趾都是如此。许多现有的骨骼装备都没有一些可选骨骼,但我们仍然希望用这些骨骼来创建有效的人形。
人形假肢还支持左眼和右眼可选骨骼。眼骨各有两块肌肉,一块上下运动,一块内外运动。眼部骨骼还可与人形装配 LookAt 求解器配合使用,该求解器可对脊柱、胸部、颈部、头部和眼部进行外观调整。关于 LookAt 求解器的更多信息,请参阅即将发布的人形 IK 设备论文。
手指
最后,仿人钻机还支持手指。每个手指可以有 0 到 3 个数字。0 位数仅表示该手指未定义。第一个数字有两个肌肉(拉伸和展开),第二个和最后一个数字有一个肌肉(拉伸)。需要注意的是,如果一只手没有定义手指,解算器就不会对手指产生开销。
骨架钻机要求
骨骼之间
在许多情况下,骨骼装备的骨骼数量会多于人形装备所定义的骨骼数量。中间骨骼是指介于人形定义骨骼之间的骨骼。例如,3DSMAX 两足动物的第 3 根脊椎骨将被视为中间骨。Humanoid Rig 支持这些功能,但请记住,中间的骨骼不会被动画化。相对于人形装配中定义的父节点,它们将保持默认位置和方向。
标准层次结构
骨架装备必须遵守标准层次结构,才能与我们的人形装备兼容。人形骨骼之间可以有任意数量的中间骨骼,但必须遵守以下模式:
臀部 - 上肢 - 下肢 - 脚 - 脚趾
臀部 - 脊柱 - 胸部 - 颈部 - 头部
胸部 - 肩部 - 臂部 - 前臂 - 手部
手部 - 近端 - 中间 - 远端

T 型站姿是人形钻机制作中最重要的一步,因为肌肉的设置都是以它为基础的。之所以选择 T 型姿势作为参考姿势,是因为它很容易让人产生概念,而且没有太多的解释空间:
- 面向 Z 轴笔直站立
- 头部和眼睛朝向 Z 轴
- 双脚着地,与 Z 轴平行
- 双臂沿 x 轴与地面平行张开
- 双手平举,掌心向下,沿 x 轴与地面平行
- 手指沿 x 轴与地面平行伸直
-拇指伸直,平行于地面,与 x 轴和 z 轴成半角(45 度)。
说 "直",并不意味着骨头一定要完全对齐。这取决于皮肤与骨骼的连接方式。有些钻机的皮肤看起来很平整,但下面的骨架却不平整。因此,为最终皮肤角色设置 T-Stance 非常重要。如果您要创建一个人形装配来重新瞄准 MOCAP 数据,那么最好的做法是在 MOCAP 套件中至少捕捉几帧由演员完成的 T-Stance。
肌肉范围调整
默认情况下,肌肉范围设置为最能代表人体肌肉范围的值。大多数情况下,它们不应被修改。对于一些更卡通的角色,您可能需要缩小范围以防止手臂进入身体,或者加大范围以夸张腿部动作。如果您要创建一个人形装配来重定向 MOCAP 数据,则不应修改这些范围,因为生成的动画片段将不遵守默认设置。
重定向和动画剪辑
Mecanim 重定向分为两个阶段。第一阶段包括将标准骨骼变换动画转换为规范化人形动画片段(或称肌肉片段)。该阶段发生在动画文件导入时的编辑器中。内部称为 "RetargetFrom"。第二阶段发生在游戏模式中,即评估肌肉剪辑并将其应用到人形装备的骨骼上。

将重定向分成两个阶段有两大好处。首先是解题速度。重定目标过程的一半是离线完成的,只有另一半是在运行时完成的。另一个优势是场景复杂性和内存使用量。由于 "肌肉剪辑 "对其原始骨架进行了完全抽象,因此在运行时无需包含源骨架来执行重定向。
第二阶段简单明了。获得有效的人形装配后,只需使用 RetargetTo 求解器对其应用肌肉剪辑即可。这是在引擎盖下自动完成的。
第一阶段是将骨骼动画转换为肌肉剪辑,这可能比较棘手。骨架动画片段的采样率是固定的。对于每个样本,骨骼姿态都会转换为肌肉空间姿态,并在肌肉剪辑中添加一个键。并不是所有的骨架装备都适合,骨架装备有许多不同的构建和动画方式。某些骨架钻机会产生有效的输出,但可能会丢失信息。现在,我们将回顾一下创建无损规范化人形动画所需的内容......肌肉剪辑。
请注意:所谓无损,是指从骨架装备重定向到 Muscle Clip,然后再重定向回相同的骨架装备,这样就能完整地保留动画。事实上,它几乎完好无损。手臂和腿部的原始扭转将消失,取而代之的是扭转解算器计算出的扭转。正如本文件前面所解释的,Muscle Space 中没有扭转重新分区的表述。
- 人形装备和动画文件中骨骼的局部位置必须一致。用于创建 "人形装配 "的骨架与动画文件中的骨架不同。确保使用完全相同的骨架。如果不是这种情况,则会在导入时向控制台发送警告。
- 中间的骨骼必须没有动画。在 3DSMAX 骨架中,第 3 根脊椎骨同时具有平移和旋转动画,这种情况经常发生。当 Bip001 用作臀部,而骨盆上有一些动画时,也会出现这种情况。如果不是这种情况,将在导入时向控制台发送警告。
- 在人形装配和动画文件中,中间骨骼的局部方向必须相同。在使用人形自动配置(依靠皮肤绑定姿势创建 T 型姿势)时可能会出现这种情况。确保骨骼之间的皮肤绑定姿势旋转与动画文件中的相同。如果不是这种情况,将在导入时向控制台发送警告。
- 除臀部外,骨骼不支持平移动画。3DSMAX Biped 有时会在脊柱骨骼上设置平移动画。在 imp 或情况不对时,会向控制台发送警告。
这里指出 3DSMAX Biped 是一个有问题的装备。这可能是因为它很受欢迎,而且我们必须支持它与 Mecanim 一起使用的许多案例。请注意,如果要创建与 Mecanim Humanoid Rig 配合使用的新动画,应从一开始就遵守上述规则。如果你想使用已经存在的动画来打破某些规则,这仍然是可能的,Mecanim 的重定向求解器很强大,会产生有效的输出,但不能保证无损转换。
请注意,如果要创建与 Mecanim 人形装配配合使用的新动画,应从一开始就遵守上述规则。如果你想使用已经存在的动画,但它违反了某些规则,这仍然是可能的,因为 Mecanim 重定向求解器很强大,会产生有效的输出,但不能保证无损转换。