讲解Unity3D技术之根运动 (Root Motion) – 工作原理

2015年03月15日 13:26 0 点赞 0 评论 更新于 2025-11-21 17:06

身体变换

身体变换 (Body Transform) 代表角色的质心,它被应用于 Mecanim 重定位引擎,能提供最为稳定的位移模型。身体方向 (Body Orientation) 是下半身方向与上半身方向的平均值,并且与 Avatar T 字姿势 (T-Pose) 存在关联。

身体变换 (Body Transform) 和方向 (Orientation) 存储在动画片段 (Animation Clip) 中,这里会使用 Avatar 中设置的肌肉线条。它们是存储在动画片段 (Animation Clip) 里唯一的世界空间曲线。而其他的元素,像肌肉线条和 IK 目标(四肢 (Hands and Feet)),都是相对身体变换进行存储的。

根变换

根变换 (Root Transform) 是身体变换 (Body Transform) 在 Y 平面上的投影,它是在运行时进行计算的。在每一帧中,都会计算根变换 (Root Transform) 的变化,随后将这些变换的变化应用到游戏对象 (Game Object) 上,从而使游戏对象产生移动。

需要注意的是,角色下面的圆代表根变换。

动画片段检视器

动画片段编辑器 (Animation Clip Editor) 有一些设置,包括根变换旋转 (Root Transform Rotation)、根变换位置 (Root Transform Position) (Y) 和根变换位置 (XZ),这些设置能够让开发者从身体变换 (Body Transform) 来控制根变换 (Root Transform) 的投影。依据这些设置,身体变换 (Body Transform) 的某些部分可能会转变为转移的根变换 (Root Transform)。例如,开发者可以决定是否让运动的 Y 位置成为根运动 (Root Motion)(轨迹)或者姿势(身体转换)的一部分,这就是所谓的合并到姿势 (Baked into Pose)。

根变换旋转

  • 合并到姿势 (Bake into Pose):在此模式下,方向与身体变换(或者姿势 (Pose))保持一致。根方向 (Root Orientation) 保持不变,增量方向 (Orientation) 也相同。这就意味着,该 AnimationClip 不会使游戏对象 (Game Object) 发生旋转。只有那些拥有类似启停根方向 (Root Orientation) 的 AnimationClip 才会使用这个选项。在 UI 中会出现绿灯 (Green Light),提示某个 AnimationClip 是合适的候选片段,像直走或跑步动画就属于合适的候选片段。
  • 基于 (Based Upon):此选项允许开发者设置片段的方向。片段会使用身体方向 (Body Orientation) 进行定向,以遵循身体的向前向量。这个默认设置适用于大多数动作捕捉 (Motion Capture)(动态捕捉 (Mocap))数据,例如走路、跑步、跳跃等动作。但对于扫射这类与身体向前向量垂直的动作并不适用,在这种情况下,可以使用偏移 (Offset) 设置手动调整方向。此外,在导入的片段中能找到自动添加授权位移的原始方向 (Original),它常常与键帧 (Keyframed) 数据配合使用,以遵循美工设置的方向。
  • 偏移 (Offset):当选择“基于 (Based Upon)”时,可以使用此设置输入偏移量。

根变换位置 (Y)

该项运用了与根变换旋转 (Root Transform Rotation) 相同的概念。

  • 合并到姿势 (Bake Into Pose):运动的 Y 分量与身体变换 (Body Transform)(姿势 (Pose))保持一致。根变换 (Root Transform) 的 Y 分量保持不变,增量根位置 Y (Delta Root Position Y) 为 0。这表明该片段不会改变游戏对象的高度 (Game Object Height)。同样,在 UI 中会出现绿灯 (Green Light),提示某个片段是将 Y 动作合并到姿势的良好候选片段。大多数 AnimationClip 会启用这个设置,只有那些会改变游戏对象 (GameObject) 高度的片段,如跳上跳下的动画,才会关闭该设置。需要注意的是,Animator.gravityWeight 由合并到姿势 (Bake Into Pose) 位置 Y 驱动。启用该设置时,gravityWeight = 1;禁用该设置时,gravityWeight = 0。在状态之间转换时,gravityWeight 用于片段融合。
  • 基于 (Based Upon):开发者可以按照与根变换旋转 (Root Transform Rotation) 相似的方式,从原始方向 (Original) 或质心 (Mass Center)(身体 (Body))中进行选择。还有一个双脚 (Feet) 选项,对于那些会改变高度(合并到姿势 (Bake Into Pose) 已禁用)的 AnimationClip 非常实用。使用双脚 (Feet) 选项时,根变换位置 Y (Root Transform Position Y) 会为所有帧匹配最低的脚 Y,这样融合点通常会停留在双脚周围,从而防止在融合或转换时出现浮动问题。
  • 偏移 (Offset):可以按照与根变换旋转 (Root Transform Rotation) 类似的方式,使用偏移 (Offset) 设置手动调整 AnimationClip 的高度。

根变换位置 (XZ)

同样,该项使用了根变换旋转 (Root Transform Rotation) 和根运动位置 (Root Motion Position) (Y) 中描述的相同概念。合并到姿势 (Bake Into Pose) 通常用于“空闲 (Idles)”状态,在这种情况下,开发者希望将增量位置 (Position) (XZ) 强制设为 0。经过多次评估后,它会停止累计增量变化。它也可用于具有基于 (Based Upon) 原始方向 (Original) 的关键帧片段,以强制更改美工设置的授权位置。

循环姿势

循环姿势 (Loop Pose) 会在引用根变换 (Root Transform) 时出现,就像混合树 (Blend Trees) 或转换 (Transitions) 中的姿势融合 (Pose Blending) 一样。在计算完根变换 (Root Transform) 之后,姿势 (Pose) 就会与之相关。开始 (Start) 和停止 (Stop) 帧之间的相对姿势 (Pose) 差异会被计算出来,并分布在 0 - 100% 的片段范围中。

通用根运动 (Generic Root Motion) 和循环姿势 (Loop Pose)

此项的工作原理本质上与类人根运动 (Humanoid Root Motion) 相同,但它不使用身体变换 (Body Transform) 来计算/预计根变换 (Root Transform),而是使用根节点 (Root Node) 中的变换集。姿势 (Pose)(在根运动 (Root Motion) 骨骼下变换的所有骨骼)与根变换 (Root Transform) 相关。

作者信息

boke

boke

共发布了 3994 篇文章