最近在做动画系统的一些重构工作, 顺便就看了下成熟的引擎的动画部分. 之前做过一个动作游戏的预研, 所以对这部分感触比较大, 因为相比业界一流的厂商, 动画技术可以说是国内游戏开发最落后的的一部分了
在我看来, 动画系统分成这么几个级别吧:
- 可以把DCC中制作的动作导入播放, 有Play/Stop/Pause之类的接口. 开源或者自研的引擎多停留在这一阶段
- 在多个动画之间可以定义混合转换方式, 可以很好地处理不动动作之间的衔接过渡. 如GameBryo, Vision等
- 有动画状态机和BlendTree, 可以使用参数控制播放不同的动作, 如Unity, Unreal, Havok, Morpheme等
- 把动画与物理系统结合, 实现环境交互, IK, 碰撞反应, Ragdoll等. 通常实现了3的也会把4顺便做了
- 把动画与行为系统结合, 做出真实的人物行为表现. 这部分就上升到AI层次了, 这方面NaturalMotion业界领先
苦逼的我们还在2挣扎. 引入动画中间件可以快速上升到4, 5的话目前游戏应用比较少
下面是一些最近阅读文档遇到的一些技术名词, 来源于Unity, Vision, Havok:
- Animation Clip(同Animation Sequence)
-
- 动画数据单位, 如一个"Idle" Clip, 一个"Run" Clip, 一个"Walk" Clip等
- Body Mask(同Skeleton Partitioning)
-
- 用于标记身体哪些部分包含或者从骨架中排除
- Animation Retargeting
-
- 把一个模型的动画应用到另一个模型上, 动画师就不用为每个角色重复做类似的动画了
- T-Pose
-
- 原始骨架在没有动画时通常是"T"型的
- 在强动作交互游戏中使用动画控制角色位移朝向, 而不是靠程序
- Root Motion(同Motion Extraction)
-
- 角色的"根"的运动, 可能由动画自己控制或者外部控制
- Animation Layer
-
- 控制模型动画或者局部动画的状态机. 通过与Body Mask一起用作肢体动画, 半身动画等
- Animation State Machine
-
- 控制动画交互状态
- Animation Blend Tree
-
- 根据浮点数参数在相似的Animation Clip之间进行连续混合, 比如设置一个方向值, 在前后左右4个行走动画之间进行平滑过渡
- Inverse Kinematics(IK)
-
- 根据世界空间的物体反向控制角色身体部位的变换, 如以应用:
-
- 两脚根据地表斜率放置到不同高度
- 头部锁定朝向目标
- Wrap Mode
-
- 动画的播放方式: 单次播放, 循环播放, 单次播放停在最后
- Transition
-
- 从一个动画到另一个动画的转换方式, 以Vision为例:
-
- Immediate: 在Source和Target之间直接进行插值, 期间不处理动画数据(不播放)
- CrossFade: 在Source和Target之间进行平滑过渡, 期间处理动画数据(进行播放)
- Intermediate: 使用一个Animation Sequence在两个动画之间进行混合
- Transition Table
-
- 定义每两个动画之间Transition方式的二维表(见Gamebryo, Vision)
- Animation Event
-
- 动画时间轴上的事件定义, 比如左右脚的落地时间点可以用于触发脚步声
- Animation Compression
-
- 在动画数据量比较大的情况下内存和磁盘占用会比较高, 所以需要进行压缩
- Animation Blending
-
- 把多个动画的Pose混合到一个Pose上渲染
- Normal Blending
-
- 通常在多个AnimationTrack间根据权重进行平均
- Additive Blending
-
- 一细节动画可以叠加到已有的Pose上, 通常做法是把动画的当前Pose减去第一帧的Pose得到相对变换, 再加到目标Pose上
- Animation Job
-
- 一些计算密集的操作会封装成任务扔进线程池里去计算, 如采样, 混合, 解压缩等
- Skeleton Mapping
-
- 把一个骨架的Pose转换到另一个, 一般有两种情况:
-
- 把简化的骨架映射到正常骨架上, 用于"Ragdoll Mapping"(角色物理中使用)
- 在两个不同角色骨架之间转换, 用于"Animation Retargeting"
- Local Hit Reaction
-
- 角色对身体局部的撞击产生相应的动作. 这是由Ragdoll驱动的, 可以代替受击动画之类
- Animation Driven Ragdoll Death
-
- 由Ragdoll驱动模拟死亡/击飞的动作. 由物理实时运算, 不需要动画师进行数据制作
- 待补充...