UE4动画系统笔记

目录

0、UE4动画基础概念

1、模型 - 骨骼 - 动画 - 动画蓝图基础

2、 动画/模型导入及骨架重定向

3 、动画类型&动画融合

UE中动画相关类型主要包括:

UE中动画融合主要有两类方法:

混合动画的轴向设置(Axis Settings):

瞄准偏移动画

蒙太奇动画:

4、蒙太奇动画专题

5 、动画蓝图中的重要节点

事件图表特定事件和重要节点:

动画图表重要节点:

6、装备物品附加到角色

7、RootMotion

8、动画IK

9、动画通知

10、动画曲线


0、UE4动画基础概念

  • 骨架(Skeleton):Skeleton是整个动画系统的基础,其主要作用是记录了骨架以下信息:

    • 骨骼层级信息

    • 参考姿势信息

    • 骨骼名称

    • 曲线(Curve)信息

    • 动画通知(Animation Notify)信息

    • 插槽数据(插槽名称、所属骨骼、Transform等)

    • 虚拟骨骼信息

    • 骨骼名称Index映射表

    • 其他骨骼设置信息:包括位移重定向(Translation Retarget)设置,LOD设置等信息

  • 骨骼模型(Skeletal Mesh):顾名思义,骨骼模型是在骨骼基础之上的模型,通俗来说就是绑定骨骼后的网格体,也就是我们在游戏中能够看到的角色的“肉身”。其主要包含以下信息:

    • 模型的顶、线、面信息

    • 顶点的骨骼蒙皮权重

    • 模型的材质信息

    • 模型LOD信息

    • 所属骨架

    • Morph Target信息

    • Physics Asset设置信息

    • 布料系统相关设置

  • 动画序列(Animation Sequence):动画序列是用来记录骨骼运动状态的资源,也是让动画动起来的关键之一,其主要包含了一下信息:

    • 动画关键帧信息

    • 包含运动的骨骼信息

    • 每帧骨骼的Transform信息:包含了骨骼的旋转、位移和缩放

    • 动画通知信息:记录了触发通知的类型和时间

    • 动画曲线信息:记录了随时间轴变化的曲线信息

    • 其他基础信息:包括了叠加动画设置、根骨骼位移设置等信息

  • 混合空间(BlendSpace):其主要作用是根据输入的float值从若干临近的动画中采样并输出一个融合后的Pose。根据数据维度不同分为BlendSpace和BlendSpace1D两种类型。

  • 瞄准偏移(AimOffset):是BlendSpace的一种特殊形式,区别在于其内部的所有采样点都是叠加动画。主要用在游戏过程中叠加角色瞄准和看的方向。

  • 蒙太奇动画(AnimationMontage):对Animation Sequence资源的扩充,可以方便的使用蓝图、代码控制动画资源的播放,并且可以方便的实现根骨骼动画和动画播放结束后的回调。要使用Montage就需要将相应的动画拖入其中,在Montage编辑器中可以对动画进行编辑、裁剪、拼接等操作。Montage编辑器中有一个Slot(插槽)的东西,通俗的解释就是,插槽是对应在动画蓝图中播放Montage的播放点,同一个Montage可以有多个不同的Slot。

  • 动画蓝图(Animation Blueprint),主要负责动画的混合驱动逻辑以及后处理的相关工作。一般大部分动画程序的工作就是在这里完成。动画蓝图中可以搭建动画状态机以及动画后处理逻辑,例如IK、叠加动画等。

  • 骨骼动画系统大致可以分为两步:

    1. 计算骨骼Pose:每一根骨骼可以看做一个点,而我们的Pose就是所有骨骼Transform(位移+旋转+缩放)的集合,注意,一般来说,这个Pose是基于骨架参考姿势(Reference Pose)的变换矩阵。

    2. 蒙皮:骨骼计算好后我们还是无法看到一个角色的造型,这时需要将3D美术制作好的网格体的顶点按照骨骼Pose进行变化。这里变换的依据是顶点的蒙皮权重和参考姿势的信息(一个顶点可能受到多个骨骼的影响)。

  • 动画系统更新过程:UE4里主要承担上述两步职责的是Skeletal Mesh Component。在SkeletalMeshComponent创建时,会创建一个Animation Instance,这就是主要负责计算最终Pose的对象,而我们制作的AnimationBlueprint也是基于UAnimationInstance这个类的。在SkeletalMeshComponent进行Tick时,会调用TickAnimation方法,然后会调用Animation Instance的UpdateAnimation()方法,此方法会调用一遍所有动画蓝图中连接的节点的Update_AnyThread()方法,用来更新所有节点的状态。然后后续根据设置的不同会从Tick函数或者Work线程中调用SkeletalMeshComponent的RefreshBoneTransforms()方法,此方法进而会调用动画蓝图所有节点的Evaluate_AnyThread()方法。Evaluate的含义就是指根据特定的条件(从Update时获得的参数)计算出动画所有骨骼的Transform信息,最后输出一个Pose给到渲染线程并存在本地Component上。

  • 动画多线程:UE4的动画系统支持多线程的处理,一般来说Game线程会触发一系列Game Play逻辑,最后调用到动画系统的Update内,然后这个方法里面把所有动画系统所需要的信息收集起来,存到一个Proxy里,然后计算具体Pose的工作就交给工作线程去完成,这时主线程可以继续进行后续的处理工作。需要注意的是,虽然此时Game线程未被Pose计算阻塞,但是渲染线程会等待RefreshBoneTransform结束后再开始工作,如果Evaluate Pose的时候有很多高消耗的操作,会发现渲染线程的时间会增长。

     

1、模型 - 骨骼 - 动画 - 动画蓝图基础

  • 无动画模型:静态网格staticMesh, 能指定动画的模型:骨架网格sketonMesh

  • 骨骼和动画一对多绑定,骨骼和模型也是一对多绑定(蒙皮),动画和模型(骨架网格体)没有关系, 模型通过设置动画蓝图来使用动画,动画蓝图用于管理各种动画的触发和状态转换

     

  • 动画序列包括 普通动画 和 混合动画BlendSpace(叠加动画)

  • 动画蓝图用于控制动画播放和切换的特殊蓝图,可以和绑定了骨骼网格体的蓝图类关联

  • 动画蓝图里通过动画图表(动画蓝图特有的图表,Pawn蓝图没有)设置动画的状态机,管理动画切换;事件图表设置动画状态机所需要的参数如速度方向等;动画蓝图里的变量在事件图表和动画图表里共享

  • 状态机包括规则和状态,规则用于控制状态的切换

  • 动画序列直接拖入状态机中会自动产生一个状态;状态机可以嵌套

  • pawn蓝图类中可以通过Mesh获取动画实例get anim instance,然后通过类型转换可以直接和动画蓝图的变量通信(读写动画蓝图类的变量),同理,动画蓝图中可以转换为pawn蓝图来反向通信

     

  • Pawn、Charactor蓝图中通过输入事件触发动画蓝图中的状态机切换,需要在项目中预先设置输入按键映射,没有需要新增:操作映射对应瞬时输入,轴映射为持续性输入

     

 

2、 动画/模型导入及骨架重定向

  • 动画导入常用格式fbx (obj为纯模型文件),只导入模型和导入动画的方法一样

    fbx可能包括sketal、sketal Mesh、动画序列,可以导入以下几种情况:

    • fbx不含动画序列,若指定已有兼容骨骼则只导入模型Mesh,不指定则同时导入骨骼

    • fbx包含动画序列,则可以导入骨骼和mesh的同时导入动画文件

    • 可以导入的同时创建材质和纹理(可以创建材质,不建议创建纹理)

  • 动画导入需要前确认几点并预处理:

    • 文件是否是原地动画(in place),不是需要maya中处理

    • 文件的骨骼是否有根骨骼root(原点位置),没有需要maya中处理

    • 文件的骨骼和游戏中已有的骨骼是否兼容,如果是导入时可以不用导入骨骼;如果不兼容需要同时导入骨骼并做后续处理

    • 不同的骨骼不能直接应用动画,需要先进行动画重定向,将不同骨骼的动画重定向到同一个骨骼,假设新导入的A骨架去匹配B:(另一种方法是在mixamo网站自动绑定!)

      • 角色 - 骨骼 - 所有层级

      • B骨架视图 - 重定向管理器 - 选择人形绑定

      • B骨架视图 - 修改参考姿势与A相同,修改完后,重定向管理器-修改姿势-使用当前姿势

      • A骨架视图 - 重定向管理器 - 选择人形绑定 - 指定B骨架 - 自动映射

      • 两边打开骨骼命名,对应调整骨骼映射,调整自动未匹配和匹配错误的后保存

      • 选择A骨架的动画右键- 重定向动画 - 复制动画并重定向 - change保存路径

      • 如果是是A套用B骨架及其动画,则右键B骨架的动画蓝图或动画序列进行复制动画并重定向即可

    • 动画包合集要确认动画是否包含有骨骼,一般有一个带有骨骼,其他的没有,需要先导入有骨骼的动画(不指定骨骼),再批量导入其他动画(指定刚才导入的骨骼)

       

 

  • CharactorCreator导入UE4使用插件可以直接指定UE4骨骼,自动绑定和渲染设置,Animation需要勾选Use T0 pose,避免Pose问题(详见踩坑记录0)

 

3 、动画类型&动画融合

  • UE中动画相关类型

    • 动画序列:导入的原始动画(一般为fbx格式)

    • 混合空间(1D/2D):融合轴向的动画序列,UE完成动画切换过渡

    • 瞄准偏移:瞄准朝向和身体其他动作混合,UE操作类似混合空间

    • 动画合成:对动画序列进行简单的组合

    • 蒙太奇动画:用于复杂动画或指定骨骼混合的动画

    • 利用时间轴+lerp实现简单动画效果

    • 逆向动力学IK:Two Bone IK / Fabrik IK

  • UE中动画融合主要有两类方法

    • 混合空间动画 + 状态机切换

    • 蒙太奇动画 + 分层骨骼融合

  • 混合动画的轴向设置(Axis Settings)

    设置动画图表所依赖的参数,如水平设置一个Direction变量,垂直设置一个Speed变量,这两个变量影响混合动画在多个动画切换时的过渡效果

    • 最小/大轴值确定变量取值范围

    • 网格区分数确定动画拆分数

    • 内插时间影响动画过渡时间,值越大效果越明显:如run切idle时不会立马停下,会多跑几步后慢慢停下; 对于参数跳动导致的动画抖动问题,一般也可以调整该值解决

    • BlendSamples设置单个动画的播放速率,能解决类似滑步问题

  • 瞄准偏移动画

    • RInterp to节点:Rotation的一个插值的表述,该节点有四个参数,Current和Target分别表示当前角度和目的角度,DeltaTime为间隔时间,一般设置为我们计算机计算每帧的时间,Interp speed为调整的速度,越小速度越慢,一般调整为5左右效果比较好

    • 获取摄影机(控制器)和人物朝向的角度差:

      • get actor rotation

      • get controller rotation

      • delta / make rotator / break rotator

         

    • AimOffset不能添加动画解决办法:

       

 

 

  • 蒙太奇动画

    • 蒙太奇为动画片段剪辑组合而成,比如攻击过程PunchProcess = 攻击准备PunchBegin + 左拳PunchLeft * n + 右拳PunchRight * n + PunchEnd攻击结束,这些动作的组合都可以用一个蒙太奇片段组合实现

    • 蒙太奇有以下场景:

      • 不需要使用状态机来定义的短暂动作行为:比如,弯腰伸手拾取

      • 复杂的动作组合:比如,组合动作攻击

      • 只需要骨骼部分呈现的动作:比如,有一个伸手拾取的动画和walk_run状态,使用蒙太奇的分层骨骼混合可以实现边走路/跑步,边伸手拾取的动作

         

         

 

4、蒙太奇动画专题

  • section用于分段和重组,基本操作技巧:

    • 点击绿线可以拖动,控制起始位置,重命名

    • 衔接:点击一个section后点击另一个

    • 循环:点击同一个两次(变蓝, 常用于组合动作idle循环)

    • 移动帧条到指定时间,添加notifier

  • 轨迹可以设置多条,用于跳转控制

  • montage jump section,用于多条轨迹跳转或循环状态的跳出

  • 设置动画序列的Root Motion启动根运动,使用移动动画,可以攻击带位移(前提是动画序列是带位移的而不是inplace)

  • 蒙太奇动画的制作步骤总结

    1. 制作蒙太奇动画,设置section,轨迹,自定义slot,notifiers

    2. 动画蓝图中使用slot进行pose混合

      事件图表:

      • begin play(动画蓝图初始化)时获取所属pawn等相关的外部变量并保存:如Try get pawn owner,通过设置pawn中的变量控制普通蓝图中的蒙太奇调用

      • update animation(更新动画蓝图)时更新动画蓝图中的变量,用于姿势blend的控制变量

      动画图表:

      • 在指定pose后添加slot

      • 分层骨骼节点设置,指定骨骼的所有子骨骼生效

      • 根据布尔型 / 整型 / 枚举型 / 分层骨骼 等方式进行pose混合

    3. 普通蓝图中调用蒙太奇相关节点:如Montage play (注意!使用动画里的蒙太奇播放,可以精准控制section 和 position,不需要获取动画实例 )

     

5 、动画蓝图中的重要节点

  • 事件图表特定事件和重要节点

    • Update Animation事件:每帧都会更新动画的事件

    • Try get pawn owner节点

    • get movement component节点

    • get velocity + get vector length:计算移动速度(0 ~ max speed)

    • get actor rotation + get velocity + calculate direction:计算方向(-180~180)

  • 动画图表重要节点

    • save pose / use cached pose:保存姿势 / 使用姿势

    • 动画融合:

      • blend posses by bool / int / enum:根据条件播放不同动画

      • apply additive融合

      • layered blend per bone:只对某些骨骼进行混合,其他骨骼保持原姿势,对哪些骨骼进行混合以及混合的权重,都可以由我们自己决定。比较典型的用法是在奔跑的时候切换武器,就可以将上半身用 站立时切换武器的动画 进行混合, 而下半身保持原奔跑姿势不变

      • play aim montage:播放蒙太奇动画,常和分层骨骼融合结合使用

 

6、装备物品附加到角色

  • 骨架对应位置添加slot

    • 如手持物品在hand_r骨骼下添加slot

    • 挂在背上的物品在spine_02骨骼下添加slot

  • attach / detach actor到组件

  • 获取插槽变换get slot transform

 

7、RootMotion

  • 动画序列细节面板中启用rootMotion

  • 动画蓝图中设置 - animation preview editor - edit defaults - root motion

  • UE4 RootMotion要求RootMotion动画的根骨骼不能有旋转移动等信息,因此需要先maya中处理一下根骨骼,可以添加一个新的根骨骼用于root motion

  • AI MoveTo要替换自定义task

 

8、动画IK

  • 双骨骼IK

  • Fabric IK

 

9、动画通知

三种类型动画通知:

  1. montage或sequencer中直接add notify, 动画蓝图中实现通知事件
  2. 新建继承AniNotify类,montage或sequencer中添加(单帧通知),重写received notify
  3. 新建继承AniNotifyState类,montage或sequencer中添加并控制长度(状态通知),重写received notify begin/end/tick

 

10、动画曲线

  • 动画曲线是一种在动画播放时更改骨骼属性,材质属性或变形目标值的方法

    • 指定要修改的资源(材质或者变形目标),相应的命名曲线,然后在动画的持续时间内调整关键帧值

  • 动画曲线(Anim Curves) 面板显示选定骨架的 变形目标(Morph Target)属性(Attribute)材质(Material) 曲线的曲线值。 可以在此处删除和重命名曲线,以及预览曲线数据。

     

    • 打开方式:

       

    • 曲线取消选中了 自动(Auto) 复选框,将不再从曲线中提取数据,选择性地关闭曲线的影响并预览结果

    • Type默认为属性,点亮对应Type切成材质或变形目标

    • 添加新动画曲线:右键单击任意曲线并从下拉菜单中选择 添加(Add)

  • 动画蓝图获取曲线信息

    • 动画蓝图 的AnimGraph里,调用一些蓝图节点来访问曲线信息或获取曲线名称

       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrlturtle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值