第8章 动画与骨骼系统进阶
动画与骨骼系统是创建生动角色和物体运动的核心技术。本章将深入探讨UE5的动画系统,包括动画蓝图、状态机、混合空间、IK系统等高级功能。
8.1 动画系统概述
UE5的动画系统提供了一套完整的工具链,用于创建、编辑、混合和控制3D角色与物体的动画。
8.1.1 核心概念
- 骨架网格体 (Skeletal Mesh):包含骨骼系统的3D模型
- 骨骼 (Bone):骨架网格体的基本组成部分
- 动画序列 (Animation Sequence):单个动画片段
- 动画蓝图 (Animation Blueprint):控制骨架网格体动画的蓝图
- 混合空间 (Blend Space):基于参数混合多个动画
- 动画蒙太奇 (Animation Montage):组合和播放多个动画片段
8.1.2 动画工作流
- 创建/导入骨架网格体
- 创建/导入动画序列
- 创建动画蓝图
- 设置动画状态机
- 添加混合空间和动画蒙太奇
- 实现IK和物理动画
- 在游戏中应用动画
8.2 骨骼系统深入
8.2.1 骨骼层级结构
- 根骨骼:骨骼层级的起点
- 父骨骼:控制子骨骼的运动
- 子骨骼:受父骨骼控制的骨骼
- 骨骼链:一系列相连的骨骼
8.2.2 骨骼属性
- 名称:唯一标识骨骼
- 变换:位置、旋转、缩放
- 约束:限制骨骼的运动范围
- 权重:影响蒙皮的权重
8.2.3 蒙皮 (Skinning)
蒙皮是将3D模型的顶点绑定到骨骼的过程:
- 刚性蒙皮 (Rigid Skinning):每个顶点只绑定到一个骨骼
- 平滑蒙皮 (Smooth Skinning):每个顶点可以绑定到多个骨骼
- 权重绘制:调整顶点对各个骨骼的权重
8.2.4 物理骨骼 (Physics Bone)
物理骨骼允许骨骼受物理引擎的影响:
-
启用物理骨骼
-
在骨架网格体的物理资产中设置
- 选择要启用物理的骨骼
- 设置物理属性(质量、摩擦力等)
-
物理骨骼的应用
-
布料模拟(如披风、头发)
- 物理碰撞响应
- 自然运动效果
8.3 动画蓝图 (Animation Blueprint)
动画蓝图是控制骨架网格体动画的核心工具,使用可视化编程来实现复杂的动画逻辑。
8.3.1 创建动画蓝图
-
创建动画蓝图
-
右键点击内容浏览器→动画→动画蓝图
- 选择父类(AnimInstance)
- 选择目标骨架网格体
- 命名并保存
-
动画蓝图编辑器界面
-
视口:预览动画效果
- 我的蓝图:显示蓝图的结构
- 动画图表:创建动画逻辑
- 事件图表:处理外部事件
- 混合空间/状态机编辑器:编辑混合空间和状态机
8.3.2 动画蓝图的类型
-
Anim Blueprint
-
基于AnimInstance类
- 用于控制单个骨架网格体的动画
- 支持状态机、混合空间等
-
Anim Blueprint Function Library
-
可重用的动画函数集合
- 可在多个动画蓝图中使用
8.3.3 动画蓝图的执行流程
-
更新事件:
-
Event Blueprint Update Animation:每帧调用,更新动画参数
- Event Blueprint Begin Play:动画开始时调用
-
动画评估:
-
基于参数和状态评估当前动画
- 混合多个动画片段
- 应用IK和物理动画
-
输出动画:
-
将最终的骨骼变换应用到骨架网格体
- 更新动画曲线
8.4 动画状态机 (Animation State Machine)
动画状态机用于管理角色的不同动画状态和状态之间的转换。
8.4.1 创建动画状态机
-
在动画蓝图中添加状态机
-
右键点击动画图表→添加状态机
- 命名状态机
- 双击打开状态机编辑器
-
状态机构成
-
状态 (State):表示角色的一种动画状态(如Idle、Walking、Running)
- 转换 (Transition):状态之间的切换
- 入口点 (Entry):状态机的起始状态
- 出口点 (Exit):状态机的结束状态
8.4.2 状态机设计
-
设计原则
-
每个状态对应一个清晰的行为
- 转换条件要明确
- 避免过度复杂的状态机
- 使用分层状态机管理复杂行为
-
状态设置
-
动画序列:状态播放的动画
- 混合设置:进入和退出状态的混合时间
- 状态逻辑:状态内的额外逻辑
-
转换设置
-
条件:触发转换的条件(如速度>100)
- 混合时间:状态转换的混合时间
- 转换规则:转换的优先级和规则
8.4.3 分层状态机
分层状态机允许将复杂的动画逻辑分解为多个层次:
-
创建分层状态机
-
在父状态机中添加子状态机
- 每个子状态机处理一个行为组
-
分层状态机的优势
-
提高可维护性
- 便于团队协作
- 减少状态和转换的数量
8.5 混合空间 (Blend Space)
混合空间用于基于一个或多个参数混合多个动画片段,创建平滑的过渡效果。
8.5.1 混合空间的类型
- 1D混合空间:基于一个参数混合动画(如速度)
- 2D混合空间:基于两个参数混合动画(如速度和方向)
8.5.2 创建混合空间
-
创建1D混合空间
-
右键点击内容浏览器→动画→混合空间1D
- 选择目标骨架网格体
- 命名并保存
- 设置参数范围(如速度:0-600)
- 添加动画序列并设置参数值
-
创建2D混合空间
-
右键点击内容浏览器→动画→混合空间2D
- 选择目标骨架网格体
- 命名并保存
- 设置两个参数的范围(如速度:0-600,方向:-180-180)
- 添加动画序列并设置参数值
- 调整混合区域
8.5.3 使用混合空间
-
在动画蓝图中使用
-
将混合空间添加到动画图表
- 连接参数输入(如速度、方向)
- 输出混合后的动画
-
高级混合技术
-
方向混合:基于角色朝向混合动画
- 运动混合:基于角色速度混合动画
- 姿态混合:基于角色姿态混合动画
8.6 动画蒙太奇 (Animation Montage)
动画蒙太奇用于组合和播放多个动画片段,支持复杂的动画序列和交互。
8.6.1 动画蒙太奇的特点
- 支持多个动画轨道
- 可以定义动画片段的起始和结束时间
- 支持通知事件
- 可以在运行时动态调整
8.6.2 创建动画蒙太奇
-
创建动画蒙太奇
-
右键点击内容浏览器→动画→动画蒙太奇
- 选择目标骨架网格体
- 命名并保存
-
编辑动画蒙太奇
-
轨道面板:管理动画轨道
- 时间轴:编辑动画片段的时间
- 通知轨道:添加动画通知
- 属性面板:设置蒙太奇属性
-
添加动画片段
-
拖拽动画序列到轨道面板
- 调整片段的起始和结束时间
- 设置循环和混合选项
8.6.3 使用动画蒙太奇
-
在蓝图中播放蒙太奇
-
获取动画实例引用
- 使用"Play Animation Montage"节点
- 设置播放参数(循环、速度、起始位置等)
-
控制蒙太奇播放
-
停止:使用"Stop Animation Montage"节点
- 暂停/继续:使用"Pause Animation Montage"/"Resume Animation Montage"节点
- 设置时间:使用"Set Animation Montage Position"节点
-
动画通知
-
添加通知:在通知轨道上点击添加通知
- 选择通知类型(如AnimNotify、AnimNotifyState)
- 在蓝图中处理通知事件
- 用于同步音效、粒子效果等
8.7 IK系统 (Inverse Kinematics)
IK系统用于计算骨骼链的位置和旋转,使末端效应器(如手、脚)到达目标位置。
8.7.1 IK的类型
- FK (Forward Kinematics):从根骨骼到末端骨骼依次计算
- IK (Inverse Kinematics):从末端骨骼反向计算到根骨骼
8.7.2 常用IK解算器
-
Two Bone IK:用于四肢(手臂、腿部)
-
两个骨骼链
- 支持目标位置和旋转
- 支持极点控制
-
IK Rigs:用于更复杂的骨骼链
-
可视化IK编辑工具
- 支持多骨骼链
- 支持约束和控制
-
Full Body IK:用于全身姿势调整
-
同时控制多个骨骼链
- 支持约束和优先级
- 用于复杂的角色姿势
8.7.3 在动画蓝图中使用IK
-
Two Bone IK节点
-
添加"Two Bone IK"节点到动画图表
- 设置起始骨骼、末端骨骼、目标位置
- 调整极点位置
- 应用IK效果
-
IK Rigs
-
创建IK Rig资产
- 设置骨骼链和控制
- 在动画蓝图中使用"IK Rig Component"节点
8.8 物理动画 (Physics Animation)
物理动画允许骨骼受物理引擎的影响,创建更自然的运动效果。
8.8.1 物理动画的应用
- 布料模拟(如披风、头发)
- 物理碰撞响应
- 自然摆动效果(如尾巴、链条)
- 受击反应
8.8.2 实现物理动画
-
启用物理骨骼
-
在骨架网格体的物理资产中设置
- 选择要启用物理的骨骼
- 设置物理属性(质量、摩擦力、阻尼等)
-
物理约束
-
添加约束限制骨骼的运动范围
- 支持各种约束类型(如球铰、铰链、滑动等)
-
物理动画混合
-
在动画蓝图中使用"Physics Blend"节点
- 混合动画和物理效果
- 控制物理影响的强度
8.8.3 高级物理动画
-
Chaos物理
-
UE5的新物理系统
- 提供更真实的物理模拟
- 支持破坏、布料、流体等
-
布料模拟
-
使用Niagara或Chaos布料系统
- 模拟衣物、披风、旗帜等
- 与骨骼系统集成
8.9 面部动画
面部动画用于创建角色的表情和口型同步。
8.9.1 面部骨骼系统
- 形状键 (Shape Keys):通过变形顶点创建表情
- 骨骼驱动:使用骨骼控制面部表情
- 混合形状 (Blend Shapes):组合多个形状键创建复杂表情
8.9.2 面部动画蓝图
-
创建面部动画蓝图
-
基于骨架网格体的面部骨骼
- 使用状态机和混合空间控制表情
-
表情控制
-
使用参数控制表情强度
- 创建表情混合空间
- 实现表情过渡
8.9.3 口型同步 (Lip Sync)
-
语音识别
-
使用语音识别系统分析音频
- 生成口型参数
-
Phoneme映射
-
将语音音素映射到口型
- 使用预定义的口型形状
- 实现实时口型同步
8.10 动画性能优化
8.10.1 减少动画复杂度
- 使用LOD减少远处角色的骨骼数量
- 简化骨骼层级结构
- 减少动画曲线的数量
8.10.2 优化动画蓝图
- 简化状态机结构
- 减少混合空间的动画数量
- 避免在动画更新中使用复杂逻辑
- 使用动画通知代替每帧检查
8.10.3 内存优化
- 使用压缩动画格式
- 减少动画序列的长度
- 复用相似的动画序列
- 延迟加载不常用的动画
8.10.4 渲染优化
- 使用GPU蒙皮
- 减少骨骼渲染的复杂度
- 使用实例化渲染
- 避免过度绘制
思考与练习
- 动画系统的核心概念有哪些?包括骨架网格体、骨骼、动画序列等。
- 如何创建和使用动画蓝图?动画蓝图的执行流程是什么?
- 动画状态机的作用是什么?如何设计一个合理的状态机?
- 混合空间和动画蒙太奇的区别是什么?分别适合什么场景?
- IK系统的作用是什么?常用的IK解算器有哪些?
- 如何实现物理动画?包括物理骨骼、约束和混合。
- 面部动画的实现方法有哪些?包括形状键、骨骼驱动和口型同步。
- 动画性能优化的技巧有哪些?从复杂度、蓝图、内存和渲染方面分析。