11. 3D动画与骨骼系统
2026/4/14大约 3 分钟
3D动画与骨骼系统
动画让你的 3D 世界"活起来"。静态的模型只是雕塑,加上动画后角色会走路、攻击、跳跃。
3D 动画的类型
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 骨骼动画 | 给模型装一副"骨架",移动骨骼来带动模型 | 角色走路、攻击、表情 |
| 属性动画 | 直接修改节点属性(位置、旋转、缩放) | 门开关、平台移动、UI动画 |
| 精灵动画 | 播放一系列图片帧 | 2D 风格特效 |
| 程序化动画 | 用代码实时计算动画 | 相机抖动、物理驱动运动 |
骨骼动画基础
什么是骨骼
想象一下人偶玩具——它有一副内部骨架(骨骼),外面是"皮肤"(网格模型)。你弯曲骨骼,外面的皮肤就跟着动。
在 3D 模型中:
- 骨骼(Bone):一根根的"棍子",连接在一起形成骨架
- 蒙皮(Skinning):把网格模型的顶点绑定到骨骼上
- 权重(Weight):每个顶点受哪些骨骼影响、影响多少
骨骼动画从哪来
骨骼动画通常在 3D 建模软件中制作(如 Blender),然后导入 Godot:
- 在 Blender 中给模型绑定骨骼(Rigging)
- 制作动画(如走路、跑步、攻击)
- 导出为
.glb格式 - 导入 Godot 后自动识别骨骼和动画
AnimationPlayer
AnimationPlayer 是 Godot 的核心动画节点。它可以:
- 播放导入的骨骼动画
- 创建自定义属性动画
- 调用函数(在动画的某个时间点触发代码)
播放动画
C#
// C#: 播放动画
var animPlayer = GetNode<AnimationPlayer>("AnimationPlayer");
animPlayer.Play("walk");
animPlayer.Play("attack");
animPlayer.Stop();GDScript
# GDScript: 播放动画
var anim_player = $AnimationPlayer
anim_player.play("walk")
anim_player.play("attack")
anim_player.stop()AnimationTree(动画状态机)
当角色有很多动画(站立、走路、跑步、跳跃、攻击……)时,需要一个系统来管理"什么时候播什么动画"。这就是 AnimationTree 的作用——动画状态机。
状态机是什么
想象一个流程图:每个圆圈是一个动画状态,箭头是切换条件。
[站立] --开始走--> [走路] --开始跑--> [跑步]
^ |
└---------- 停止移动 -----------------┘使用 AnimationTree
- 添加
AnimationTree节点 - 设置
Anim Player指向你的 AnimationPlayer - 选择
Tree Root类型:- AnimationNodeStateMachine:状态机(最常用)
- AnimationNodeBlendTree:混合树(用于平滑过渡)
混合空间(BlendSpace)
混合空间让你根据参数值(如移动速度)在多个动画之间平滑混合:
- 速度 0 → 站立动画
- 速度 0.5 → 走路动画
- 速度 1.0 → 跑步动画
C#
// C#: 通过 AnimationTree 设置参数
var animTree = GetNode<AnimationTree>("AnimationTree");
animTree.Set("parameters/MoveSpeed/blend_position", speed);GDScript
# GDScript: 通过 AnimationTree 设置参数
var anim_tree = $AnimationTree
anim_tree.set("parameters/MoveSpeed/blend_position", speed)代码驱动动画
有时候你需要用代码直接控制骨骼位置(比如让角色的头看向鼠标方向):
C#
// C#: 代码控制骨骼
var skeleton = GetNode<Skeleton3D>("Character/Skeleton3D");
int boneIdx = skeleton.FindBone("Head");
skeleton.SetBonePoseRotation(boneIdx, targetRotation);GDScript
# GDScript: 代码控制骨骼
var skeleton = $Character/Skeleton3D
var bone_idx = skeleton.find_bone("Head")
skeleton.set_bone_pose_rotation(bone_idx, target_rotation)常见问题
导入的模型没有动画?
检查导出设置,确保勾选了动画导出。Blender 导出 .glb 时需要选择 Animation → Include。
动画播放但模型不动?
检查 AnimationPlayer 是否指向正确的节点路径。确认动画资源确实包含了关键帧。
角色走路时脚"滑"?
这是"滑步"问题——移动速度和动画播放速度不匹配。需要根据角色的实际移动速度来调整动画速度。
