骨骼动画与变形目标
程序化动画适合演示,但实际项目中的角色动画通常来自美术工具(Blender、Maya)。Bevy 通过 glTF 格式导入骨骼动画——glTF 文件包含骨骼层级(armature)、蒙皮权重(skin)和动画剪辑,加载后自动成为 Bevy 的 AnimationClip 资产。
骨骼动画的工作流
在 glTF 中,骨骼动画的流程是:
- 美术在 DCC 工具里创建骨骼(Armature)和蒙皮网格(Skinned Mesh)
- 绑定权重:每个顶点关联到哪些骨骼、权重多少
- 制作动画:在时间线上 K 帧,记录每根骨骼的位移 / 旋转 / 缩放
- 导出为 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,两者独立计算后叠加。