第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 动画工作流

  1. 创建/导入骨架网格体
  2. 创建/导入动画序列
  3. 创建动画蓝图
  4. 设置动画状态机
  5. 添加混合空间和动画蒙太奇
  6. 实现IK和物理动画
  7. 在游戏中应用动画

8.2 骨骼系统深入

8.2.1 骨骼层级结构

  • 根骨骼:骨骼层级的起点
  • 父骨骼:控制子骨骼的运动
  • 子骨骼:受父骨骼控制的骨骼
  • 骨骼链:一系列相连的骨骼

8.2.2 骨骼属性

  • 名称:唯一标识骨骼
  • 变换:位置、旋转、缩放
  • 约束:限制骨骼的运动范围
  • 权重:影响蒙皮的权重

8.2.3 蒙皮 (Skinning)

蒙皮是将3D模型的顶点绑定到骨骼的过程:

  1. 刚性蒙皮 (Rigid Skinning):每个顶点只绑定到一个骨骼
  2. 平滑蒙皮 (Smooth Skinning):每个顶点可以绑定到多个骨骼
  3. 权重绘制:调整顶点对各个骨骼的权重

8.2.4 物理骨骼 (Physics Bone)

物理骨骼允许骨骼受物理引擎的影响:

  1. 启用物理骨骼

  2. 在骨架网格体的物理资产中设置

  3. 选择要启用物理的骨骼
  4. 设置物理属性(质量、摩擦力等)
  5. 物理骨骼的应用

  6. 布料模拟(如披风、头发)

  7. 物理碰撞响应
  8. 自然运动效果

8.3 动画蓝图 (Animation Blueprint)

动画蓝图是控制骨架网格体动画的核心工具,使用可视化编程来实现复杂的动画逻辑。

8.3.1 创建动画蓝图

  1. 创建动画蓝图

  2. 右键点击内容浏览器→动画→动画蓝图

  3. 选择父类(AnimInstance)
  4. 选择目标骨架网格体
  5. 命名并保存
  6. 动画蓝图编辑器界面

  7. 视口:预览动画效果

  8. 我的蓝图:显示蓝图的结构
  9. 动画图表:创建动画逻辑
  10. 事件图表:处理外部事件
  11. 混合空间/状态机编辑器:编辑混合空间和状态机

8.3.2 动画蓝图的类型

  1. Anim Blueprint

  2. 基于AnimInstance类

  3. 用于控制单个骨架网格体的动画
  4. 支持状态机、混合空间等
  5. Anim Blueprint Function Library

  6. 可重用的动画函数集合

  7. 可在多个动画蓝图中使用

8.3.3 动画蓝图的执行流程

  1. 更新事件

  2. Event Blueprint Update Animation:每帧调用,更新动画参数

  3. Event Blueprint Begin Play:动画开始时调用
  4. 动画评估

  5. 基于参数和状态评估当前动画

  6. 混合多个动画片段
  7. 应用IK和物理动画
  8. 输出动画

  9. 将最终的骨骼变换应用到骨架网格体

  10. 更新动画曲线

8.4 动画状态机 (Animation State Machine)

动画状态机用于管理角色的不同动画状态和状态之间的转换。

8.4.1 创建动画状态机

  1. 在动画蓝图中添加状态机

  2. 右键点击动画图表→添加状态机

  3. 命名状态机
  4. 双击打开状态机编辑器
  5. 状态机构成

  6. 状态 (State):表示角色的一种动画状态(如Idle、Walking、Running)

  7. 转换 (Transition):状态之间的切换
  8. 入口点 (Entry):状态机的起始状态
  9. 出口点 (Exit):状态机的结束状态

8.4.2 状态机设计

  1. 设计原则

  2. 每个状态对应一个清晰的行为

  3. 转换条件要明确
  4. 避免过度复杂的状态机
  5. 使用分层状态机管理复杂行为
  6. 状态设置

  7. 动画序列:状态播放的动画

  8. 混合设置:进入和退出状态的混合时间
  9. 状态逻辑:状态内的额外逻辑
  10. 转换设置

  11. 条件:触发转换的条件(如速度>100)

  12. 混合时间:状态转换的混合时间
  13. 转换规则:转换的优先级和规则

8.4.3 分层状态机

分层状态机允许将复杂的动画逻辑分解为多个层次:

  1. 创建分层状态机

  2. 在父状态机中添加子状态机

  3. 每个子状态机处理一个行为组
  4. 分层状态机的优势

  5. 提高可维护性

  6. 便于团队协作
  7. 减少状态和转换的数量

8.5 混合空间 (Blend Space)

混合空间用于基于一个或多个参数混合多个动画片段,创建平滑的过渡效果。

8.5.1 混合空间的类型

  1. 1D混合空间:基于一个参数混合动画(如速度)
  2. 2D混合空间:基于两个参数混合动画(如速度和方向)

8.5.2 创建混合空间

  1. 创建1D混合空间

  2. 右键点击内容浏览器→动画→混合空间1D

  3. 选择目标骨架网格体
  4. 命名并保存
  5. 设置参数范围(如速度:0-600)
  6. 添加动画序列并设置参数值
  7. 创建2D混合空间

  8. 右键点击内容浏览器→动画→混合空间2D

  9. 选择目标骨架网格体
  10. 命名并保存
  11. 设置两个参数的范围(如速度:0-600,方向:-180-180)
  12. 添加动画序列并设置参数值
  13. 调整混合区域

8.5.3 使用混合空间

  1. 在动画蓝图中使用

  2. 将混合空间添加到动画图表

  3. 连接参数输入(如速度、方向)
  4. 输出混合后的动画
  5. 高级混合技术

  6. 方向混合:基于角色朝向混合动画

  7. 运动混合:基于角色速度混合动画
  8. 姿态混合:基于角色姿态混合动画

8.6 动画蒙太奇 (Animation Montage)

动画蒙太奇用于组合和播放多个动画片段,支持复杂的动画序列和交互。

8.6.1 动画蒙太奇的特点

  • 支持多个动画轨道
  • 可以定义动画片段的起始和结束时间
  • 支持通知事件
  • 可以在运行时动态调整

8.6.2 创建动画蒙太奇

  1. 创建动画蒙太奇

  2. 右键点击内容浏览器→动画→动画蒙太奇

  3. 选择目标骨架网格体
  4. 命名并保存
  5. 编辑动画蒙太奇

  6. 轨道面板:管理动画轨道

  7. 时间轴:编辑动画片段的时间
  8. 通知轨道:添加动画通知
  9. 属性面板:设置蒙太奇属性
  10. 添加动画片段

  11. 拖拽动画序列到轨道面板

  12. 调整片段的起始和结束时间
  13. 设置循环和混合选项

8.6.3 使用动画蒙太奇

  1. 在蓝图中播放蒙太奇

  2. 获取动画实例引用

  3. 使用"Play Animation Montage"节点
  4. 设置播放参数(循环、速度、起始位置等)
  5. 控制蒙太奇播放

  6. 停止:使用"Stop Animation Montage"节点

  7. 暂停/继续:使用"Pause Animation Montage"/"Resume Animation Montage"节点
  8. 设置时间:使用"Set Animation Montage Position"节点
  9. 动画通知

  10. 添加通知:在通知轨道上点击添加通知

  11. 选择通知类型(如AnimNotify、AnimNotifyState)
  12. 在蓝图中处理通知事件
  13. 用于同步音效、粒子效果等

8.7 IK系统 (Inverse Kinematics)

IK系统用于计算骨骼链的位置和旋转,使末端效应器(如手、脚)到达目标位置。

8.7.1 IK的类型

  1. FK (Forward Kinematics):从根骨骼到末端骨骼依次计算
  2. IK (Inverse Kinematics):从末端骨骼反向计算到根骨骼

8.7.2 常用IK解算器

  1. Two Bone IK:用于四肢(手臂、腿部)

  2. 两个骨骼链

  3. 支持目标位置和旋转
  4. 支持极点控制
  5. IK Rigs:用于更复杂的骨骼链

  6. 可视化IK编辑工具

  7. 支持多骨骼链
  8. 支持约束和控制
  9. Full Body IK:用于全身姿势调整

  10. 同时控制多个骨骼链

  11. 支持约束和优先级
  12. 用于复杂的角色姿势

8.7.3 在动画蓝图中使用IK

  1. Two Bone IK节点

  2. 添加"Two Bone IK"节点到动画图表

  3. 设置起始骨骼、末端骨骼、目标位置
  4. 调整极点位置
  5. 应用IK效果
  6. IK Rigs

  7. 创建IK Rig资产

  8. 设置骨骼链和控制
  9. 在动画蓝图中使用"IK Rig Component"节点

8.8 物理动画 (Physics Animation)

物理动画允许骨骼受物理引擎的影响,创建更自然的运动效果。

8.8.1 物理动画的应用

  • 布料模拟(如披风、头发)
  • 物理碰撞响应
  • 自然摆动效果(如尾巴、链条)
  • 受击反应

8.8.2 实现物理动画

  1. 启用物理骨骼

  2. 在骨架网格体的物理资产中设置

  3. 选择要启用物理的骨骼
  4. 设置物理属性(质量、摩擦力、阻尼等)
  5. 物理约束

  6. 添加约束限制骨骼的运动范围

  7. 支持各种约束类型(如球铰、铰链、滑动等)
  8. 物理动画混合

  9. 在动画蓝图中使用"Physics Blend"节点

  10. 混合动画和物理效果
  11. 控制物理影响的强度

8.8.3 高级物理动画

  1. Chaos物理

  2. UE5的新物理系统

  3. 提供更真实的物理模拟
  4. 支持破坏、布料、流体等
  5. 布料模拟

  6. 使用Niagara或Chaos布料系统

  7. 模拟衣物、披风、旗帜等
  8. 与骨骼系统集成

8.9 面部动画

面部动画用于创建角色的表情和口型同步。

8.9.1 面部骨骼系统

  • 形状键 (Shape Keys):通过变形顶点创建表情
  • 骨骼驱动:使用骨骼控制面部表情
  • 混合形状 (Blend Shapes):组合多个形状键创建复杂表情

8.9.2 面部动画蓝图

  1. 创建面部动画蓝图

  2. 基于骨架网格体的面部骨骼

  3. 使用状态机和混合空间控制表情
  4. 表情控制

  5. 使用参数控制表情强度

  6. 创建表情混合空间
  7. 实现表情过渡

8.9.3 口型同步 (Lip Sync)

  1. 语音识别

  2. 使用语音识别系统分析音频

  3. 生成口型参数
  4. Phoneme映射

  5. 将语音音素映射到口型

  6. 使用预定义的口型形状
  7. 实现实时口型同步

8.10 动画性能优化

8.10.1 减少动画复杂度

  • 使用LOD减少远处角色的骨骼数量
  • 简化骨骼层级结构
  • 减少动画曲线的数量

8.10.2 优化动画蓝图

  • 简化状态机结构
  • 减少混合空间的动画数量
  • 避免在动画更新中使用复杂逻辑
  • 使用动画通知代替每帧检查

8.10.3 内存优化

  • 使用压缩动画格式
  • 减少动画序列的长度
  • 复用相似的动画序列
  • 延迟加载不常用的动画

8.10.4 渲染优化

  • 使用GPU蒙皮
  • 减少骨骼渲染的复杂度
  • 使用实例化渲染
  • 避免过度绘制

思考与练习

  1. 动画系统的核心概念有哪些?包括骨架网格体、骨骼、动画序列等。
  2. 如何创建和使用动画蓝图?动画蓝图的执行流程是什么?
  3. 动画状态机的作用是什么?如何设计一个合理的状态机?
  4. 混合空间和动画蒙太奇的区别是什么?分别适合什么场景?
  5. IK系统的作用是什么?常用的IK解算器有哪些?
  6. 如何实现物理动画?包括物理骨骼、约束和混合。
  7. 面部动画的实现方法有哪些?包括形状键、骨骼驱动和口型同步。
  8. 动画性能优化的技巧有哪些?从复杂度、蓝图、内存和渲染方面分析。