始于技术,但不止于技术,公众号的目的就是,带着程序员们玩转技术并且玩转人生。
往期回顾:
背景
身为游戏开发从业者经历了些项目游戏引擎教程,从业务到语言到框架到引擎积累了些经验,引擎作为游戏的基础建设是游戏研发的基础和依赖,这些年下来对引擎有了些自己的认知同时对引擎剖析后对它有了一些了解。
机缘巧合的机会让我有了解剖游戏引擎的想法,因此想借着这股勇气对引擎做一个彻底的剖析,文章主要剖析引擎的模块结构、流程、技术原理和实现方式,同时也会解剖当下热门的开源引擎和商业引擎中的结构。最近几年一直都在做性能优化相关工作,优化工作的很重要一部分就是理解引擎架构以及各模块的运作原理、结构、流程并对它做改造和优化,因此对引擎的熟悉程度也越来越多。
分析文章我想用图的方式来描述,把原理、流程和结构说清楚,因此把这个系列命名为《图解游戏引擎》,希望能用图形象化解读技术,同时也让读者更容易理解,写作过程也是我的学习过程,学习和回顾帮助自己更深入理解。
文中将以系统性的视角来分析游戏引擎,会从历史、架构、框架、模块、流程、算法等角度系统性的了解引擎,也会通过自制引擎的案例来完成对引擎技术的实践。
目录
1、UE动画概述
1.1 序列帧概述
1.2 骨骼资源概述
1.3 动画蓝图概述
1.4 动画混合概述
1.5 状态机概述
1.6 蒙太奇概述
2、UE引擎动画框架
2.1 动画框架结构
2.1.1 框架结构
2.1.2 动画蓝图结构
2.2 动画逻辑流程
内容
1、UE动画系统概述
1.1 序列帧概述
在UE4动画序列帧窗口打开动画序列帧资源可以看到,动画序列帧和曲线,动画的关键帧、曲线都展示在界面上,可以通过这个窗口在动画序列帧资源中,增加动画事件、动画曲线、以及动画关键帧。
其中动画序列帧的压缩方式如上图,实际上有5种:
1、按位压缩,动画文件中的数据会更紧凑
2、隔帧移除,如字面意思会损失些精度
3、线性帧移除,移除作为周围键的线性插值键的关键帧游戏引擎教程,即移除密集关键帧,对密集的关键帧做冗余优化
4、按轨道移除关键帧并按位压缩,在线性插值上做优化冗余剔除的同时按位压缩
5、移除琐碎帧,即冗余关键帧移除,移除相同或无用的关键帧
1.2 骨架规则概述
(骨架规范图)
骨架资源的一个重要特性是单个的骨架资源可以由多个骨架网格体使用。每个骨架中的骨骼层级无需完全一致。但其需要拥有相同的整体结构。最重要的是一个骨架网格体到另一个的骨骼层级不能被改变。这意味着骨骼命名和骨骼的排序必须一致。
可以将同一个骨架资源用于所有这些角色,此时骨架资源会包含3种类型的关节层级信息。动画将使用骨架资源来确定应用到每根骨骼的旋转,因为骨架网格体为设计制作,因此其基础骨骼层级均相同,动画将在它们之间完美兼容。唯一的差异是可能需要一些特殊动画来驱动这些角色上多出的躯干或马尾辫。当未包含在骨架网格体中的骨骼接收到动画数据时(例如马尾辫动画被用于使用相同骨架资源的角色,但此角色不带马尾辫),该动画数据将被忽略。
其中动画事件的添加和编辑与Unity类似,可添加组件、物体、音效等事件逻辑。
1.3 动画蓝图概述
在动画蓝图中,我们可以在创建动画蓝图时绑定骨骼资源
(UE4动画蓝图)
动画蓝图,蓝图中包括事件图标、动画图标、动画层、函数、宏、变量等。可在事件图表中增加动画更新的逻辑,在动画图标中增加动画状态,在动画状态中可增加融合节点,在动画层中增加不同层所播放的动画,同时可增加函数、变量用于蓝图调用。
1.4 动画混合概述
(蓝图中的动画混合节点)
UE4蓝图中混合节点包括:
1. Apply Additive,应用递增混合
2.Blend,标准混合
3.Blend Poses by bool,按布尔值混合
4. Blend Poses by Int,按整数值混合姿势
5. Blend Poses by Enum,按列举混合姿势
6. Layered blend per bone,按骨骼分层混合
7. Inertialization,惯性混合
这7种混合可在蓝图中任意搭配使用,同时也可以自行增加自定义蓝图动画混合节点。
(应用递增混合)
Apply Additive,应用递增混合。根据阿尔法值向基本普通动画姿势添加递增姿势。
(标准混合)
Blend,标准混合。节点就是两个输入姿势根据阿尔法值的混合结果。
(Blend Poses by bool,按布尔值混合)
按布尔值混合姿势(Blend Poses by bool) 节点使用布尔值作为键,基于时间混合两个姿势。当布尔值为true时,使用与true输入引脚相连的姿势;当布尔值为false时UI界面,使用false姿势。每个姿势都有一个浮点值"混合时间(Blend Time)",用来控制混入这个姿势所需的时间。
(Blend Poses by Int,按整数值混合姿势)
按整数值混合姿势(Blend Poses by Int) 节点使用整数值作为键,基于时间混合任意数量的姿势。对于每个输入整数值,将使用与该值输入引脚关联的姿势。例如,当整数设为0时,将使用与"混合姿势0(Blend Pose 0)"相连的姿势。每个姿势都有一个浮点值"混合时间(Blend Time)",用来控制混入这个姿势所需的时间。
(按列举混合姿势 Blend Poses by Enum)
按列举混合姿势(Blend Poses by Enum) 节点将列举值用作键,并基于时间在姿势间进行混合。可使用默认姿势,也可通过 活跃列举值(Active Enum Value),在连接列举中添加已辨识值的额外姿势。此外,各姿势均具有用于控制混合到姿势所需时长的浮点值"混合时间"。
(按骨骼分层混合 Layered blend per bone)
按骨骼分层混合(Layered blend per bone) 节点执行遮掩混合,这种混合方式仅影响骨架中的一小部分特定骨骼。例如,如果您只想对一个角色腰部以上的部位应用动画,可以使用 按骨骼混合(Blend Per Bone) 来实现。
(惯性混合)
Inertialization节点位于惯性混合请求源之后的位置。Inertialization节点追踪姿势运动和曲线变化3D素材,以便在激活惯性混合后继续向目标动画移动。此节点由流入源姿势的惯性混合请求来激活。状态机过渡、混合节点、链接动画图表、链接动画层均可触发惯性混合.
(2D混合空间)
混合空间与Unity中的BlendTree类似,可通过配置1D、2D、自由的混合方式来设置动画混合,同时可直接拖拽动画放入到混合空间中来配置混合动画。
配置的混合空间可与蓝图结合,根据逻辑来变化混合状态。
1.5 状态机
(动画状态机)
(状态机之间的转换)
(状态转换条件)
状态机包括状态本身、转换条件、转换方向以及转换中间点。
UE状态机与其他引擎类似,功能包括有状态节点、转换方向以及转换条件。逻辑代码或蓝图通过改变变量值来使状态机发生改变。
1.6 蒙太奇概述
(蒙太奇编辑界面)
(蒙太奇拼接动画片段界面)
蒙太奇封装了动画的播放方式,通过蒙太奇可将多个动画中的某些片段组合起来播放。同时,蒙太奇可在动画蓝图(Animation Blueprint)的事件图(Event Graph)中播放。动画播放可循环,也可在蒙太奇中添加事件。并且可根据不同的场景或模型匹配不同的动画,类似动画不同层级。
总之,蒙太奇组合了动画中许多功能,为开发提高了效率。
参考资料:
《UE动画官方文档》:
感谢您的耐心阅读
Thanks for your reading.
原创不易,多谢鼓励,顺手点个赞吧~
往期回顾
著作出版发行在新华书店、当当、京东、微信读书、UWA、机械工业出版社...等各大平台
自述经历: