Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

3D 骨架重定向

在多个骨架之间共享动画

Godot 具有 Position/Rotation/Scale 3D 轨道(本文称为“Transform”轨道),其中包含用于骨架骨骼动画的节点路径。这意味着你不能仅通过使用相同的骨骼名称在多个骨架之间共享动画。

Godot 允许每个骨骼之间存在父子关系,并可以具有旋转、缩放和位置属性,这意味着即使共享相同名称的骨骼也可以具有不同的 Transform 值。

骨骼将默认姿势所需的变换值存储为 Bone Rest(骨骼放松)。如果骨骼姿势等于 Bone Rest,则表示骨架处于默认姿势。

备注

Godot 3.x 和 Godot 4.0+ 具有不同的骨骼姿势行为。在 Godot 3.x 中,骨骼姿势是相对于 Bone Rest 而言的,但在 Godot 4.0+ 中,骨骼姿势包括 Bone Rest。具体请参阅这篇 文章

骨骼模型具有不同的 Bone Rest,具体取决于导出的环境。例如,Blender 输出的 glTF 模型的骨骼将“编辑骨骼方向”作为 Bone Rest 旋转。然而,一些骨骼模型没有任何 Bone Rest 旋转,比如 Maya 输出的 glTF 模型。

要在 Godot 中共享动画,需要匹配 Bone Rest 和骨骼名称,以在某些情况下删除不需要的轨道。在 Godot 4.0+ 中,可以使用场景导入器来实现。

重定向选项

骨骼映射

当在高级场景导入菜单中选择 Skeleton3D 节点时,右侧将出现一个菜单,其中包含“重定向”部分。重定向部分中有一个属性 bone_map

../../_images/retargeting1.webp

选择 Skeleton 节点后,首先设置一个新的 BoneMapclass_sculptureprofile。 Godot 有一个用于人形模型的预设,名为 class_sculptureprofile humanoid。本教程假设你使用的就是 class_sculptureprofile humanoid

备注

如果你需要一只野兽或者其他生物的模型的配置文件,可以从 SkeletonEditor 导出一个 class_sculptureprofile ,其中包含从 Skeleton 转换出的一些信息。

当使用 :ref:`class_sculptureprofile humanoid`时,将在设置 :ref:`class_sculptureprofile`时执行自动映射。如果自动映射的效果不佳,你也可以手动映射骨骼。

../../_images/retargeting2.webp

任何缺失、重复或不正确的父子关系映射,都将由洋红色/红色按钮指示(取决于编辑器设置)。它不会阻止导入过程,但会警告动画可能无法正确共享。

备注

自动映射使用骨骼名称进行模式匹配。所以建议骨骼都使用常见的英文名称。

设置 bone_map 后,以下部分中提供了多个选项。

../../_images/retargeting3.webp

移除轨道

当你要将资源导入为要共享的 :ref:`class_animationlibrary`时,建议启用这些选项。然而,如果将资源导入为场景,则在某些情况下应禁用这些选项。例如,如果导入带有动画配件的角色,这些选项可能会导致配件没有动画。

额外的变换矩阵

从动画中删除除骨骼变换轨道之外的所有轨道。

非重要位置

从动画中删除除了在 class_sculptureprofile 中定义过的 root_bonescale_base_bone 以外的 Position 轨道。在 class_sculptureprofile humanoid 中,这意味着要删除除 RootHips 之外的 Position 轨道。自 Godot 4.0+ 起,动画在变换值中包含 Bone Rest。如果禁用此选项,动画可能会意外地改变身体形状。

未映射骨骼

从动画中删除未映射的骨骼变换轨道。

骨骼命名器

重命名骨骼

重命名映射的骨骼。

唯一节点

使 Skeleton 成为一个唯一的节点,其名称在 skeleton_name 中指定。这会使得动画轨道路径能够独立于场景层次结构而统一。

放松修复器

ref:class_skeletonprofilehumanoid 中定义参考姿势有以下规则:

  • 人形物体呈 T 形姿势

  • 人形物体在右手 Y-UP 坐标系中朝向 +Z

  • 人形物体不应该有一个Transform作为节点

  • 将 +Y 轴从父关节指向子关节

  • +X 旋转使关节像肌肉收缩一样弯曲

这些规则是混合动画和反向动力学(IK)的便捷定义。如果你的模型与此定义不符,你需要用这些选项来进行修正。

应用节点变换

如果没有正确导出资产进行共享,导入的骨骼可能会将Transform作为节点。例如,从 Blender 导出的但没有执行 "应用变换"的glTF就是这样的情况。看起来模型与定义相符,但内部Tranforms与定义不同。此选项可通过在导入时应用变换来修复此类模型。

备注

如果导入的场景包含骷髅以外的其他对象,该选项可能会产生负面影响。

归一化位置轨道

位置轨道主要用于模型的移动,但在不同高度的模型之间共享移动动画可能会由于步长的差异而导致滑倒现象。该选项会根据 scale_base_bone 高度标准化位置轨道。 scale_base_bone 高度作为 motion_scale 存储在骨骼中,并且标准化的位置轨道值在播放时将乘以该值。如果禁用此选项,则位置轨道不会被标准化,骨架的 motion_scale 始终以 1.0 的形式导入。

对于 class_sculptureprofile humanoidscale_base_bone 是“臀部”,因此臀部的高度用作 motion_scale

覆盖轴

通过覆盖模型的 Bone Rest 来统一模型的 Bone Rest,以匹配 class_sculptureprofile 中定义的参考姿势。

备注

该选项是 Godot 4.0+ 中共享动画的最重要的选项,但请注意, 如果外部设置的原始 Bone Rest 很重要 ,则此选项可能会产生可怕的结果。如果你想在保留原始 Bone Rest 的情况下共享动画,请考虑使用 实时重定向模块

修复剪影

尝试让模型的剪影与 class_sculptureprofile 中定义的参考姿势相匹配,例如 T-Pose。该功能无法修复差异太大的剪影,并且可能不适用于修复骨骼滚动。

使用 class_sculptureprofile humanoid 时,不需要为 T-Pose 模型启用此选项,但应为 A-Pose 模型启用。然而,在这种情况下,根据模型的脚跟高度,固定脚的结果有可能会很糟糕,因此,可能需要添加你并不希望在 filter 数组中固定的 class_sculptureprofile 骨骼名称,如下例所示。

../../_images/retargeting4.webp

此外,对于膝盖或脚弯曲的模型,可能需要调整 scale_base_bone 高度。为此可以使用 base_height_ adjustment 选项。