Skip to content

骨骼动画与变形目标

程序化动画适合演示,但实际项目中的角色动画通常来自美术工具(Blender、Maya)。Bevy 通过 glTF 格式导入骨骼动画——glTF 文件包含骨骼层级(armature)、蒙皮权重(skin)和动画剪辑,加载后自动成为 Bevy 的 AnimationClip 资产。

骨骼动画的工作流

在 glTF 中,骨骼动画的流程是:

  1. 美术在 DCC 工具里创建骨骼(Armature)和蒙皮网格(Skinned Mesh)
  2. 绑定权重:每个顶点关联到哪些骨骼、权重多少
  3. 制作动画:在时间线上 K 帧,记录每根骨骼的位移 / 旋转 / 缩放
  4. 导出为 glTF / glb

Bevy 加载 glTF 后:

  • 骨骼成为 ECS 实体,层级关系保留
  • 每根骨骼实体带有 AnimationTargetId 组件(由骨骼路径的哈希生成)
  • AnimationClip 里的曲线通过 AnimationTargetId 匹配骨骼
  • AnimatedBy 组件把骨骼链接到 AnimationPlayer 实体

加载 glTF 动画

rust
let (graph, indices) = AnimationGraph::from_clips([
    asset_server.load(GltfAssetLabel::Animation(0).from_asset("models/character.glb")),
    asset_server.load(GltfAssetLabel::Animation(1).from_asset("models/character.glb")),
]);

GltfAssetLabel::Animation(n) 取第 n 个动画剪辑。from_clips 一次性把多个片段加入图,返回 (graph, Vec<AnimationNodeIndex>)

变形目标(Morph Targets)

变形目标是另一种动画形式——不移动骨骼,而是直接修改顶点位置。典型用途是面部表情:每种表情是一个"目标形状",权重决定该表情的强度。

Bevy 通过 MorphWeights 组件支持变形目标。glTF 中的 morph targets 加载后自动映射。在代码中可以通过动画曲线驱动 MorphWeights 的权重,也可以直接在系统里设置。

变形目标与骨骼动画可以共存——同一个网格可以既有蒙皮骨骼又有 morph targets,两者独立计算后叠加。