UNREAL ENGINE 4
Animation
Epic Games
Wang Mi
mi.wang@epicgames.com
OVERVIEW
• 动画系统如何工作
• 资源
• AnimGraph
• 一些使用上的例子
• AnimInstance
• Sub Anim Instance
• AnimNode
• Live Link
• Immediate Mode Physics
• SpeedWarping
• 其他
• Child AnimBP
• DistanceCurve
• 优化
#UOD 2017
如何工作?
#UOD 2017
• 数据类资源
• AnimSequence – 最基础的资源,主要来自DCC工具导入
• AnimComposite – Sequence和Composite的组合,仍可以看作是
Sequence
• BlendSpace – 组合AnimSequence的基础资源
• Montage – 直接受逻辑控制的组合资源
• 绑定在基础资源上的MetaData
• Notify
• Curve
• 其他
动画资源
#UOD 2017
• AnimInstance
• 和骨骼结构耦合
• 在骨骼层次一致时可以Retarget
• EventGraph – Tick:普通的BP
• AnimGraph – Evaluate:混合Pose的地方
动画资源
#UOD 2017
• Pose
• 每一帧的最终输出状态是一棵叶子为数
据资源的树
• 输出的树根是所有分支混合完的
BoneMap
• 枝干接点进行混合(Evaluate)
• 每个节点的输出都是Pose
动画混合
#UOD 2017
叶子节点:仅输出是Pose
普通节点:输入输出都是Pose
动画混合
#UOD 2017
Blend by
bool
Blend by
Weight
Blend
per bone
Sequence BlendSpace
Pose
Sequence Sequence
#UOD 2017
多帧混合同步
• Sync Groups
#UOD 2017
多帧状态切换
分层混合
#UOD 2017
Cached
Pose A
Cached
Pose A
Cached
Pose B
#UOD 2017
LOCOMOTION
UPPER BODY LAYERS
AIMING + TURNS
MORE LAYERS…
POST-PROCESSING
子树类用例
#UOD 2017
Sub Anim Instance
#UOD 2017
• 类似Layered的子树
• 可以有一个额外的输入
• 可以把共享的逻辑分散放到多个Sub Anim Instance中来组
合
叶子类用例
#UOD 2017
Live Link
#UOD 2017
Pose Snapshot
#UOD 2017
枝干用例
#UOD 2017
Immediate Mode Physics
#UOD 2017
PhysX Scene
Body 1 Body 2 Body 3 Body N…
PhysX Solver
UE4
Immediate Mode Physics
#UOD 2017
Body 1 Body 2 Body 3 Body N…
PhysX Solver
Skeletal Mesh Component 1
UE4
Body 1 Body 2 Body 3 Body N…
Skeletal Mesh Component 2
…
Immediate Mode Physics
#UOD 2017
Speed Warping
#UOD 2017
Speed Warping
#UOD 2017
其他
#UOD 2017
Child AnimBP
#UOD 2017
Blend by
bool
Blend by
Weight
Blend
per bone
Sequence
Override
Sequence
Override
Pose
Sequence
Override
Sequence
Override
Distance Curve
#UOD 2017
Distance Curve
#UOD 2017
• Curve数值表示到达Marker点的距离,
靠近为负值,远离为正直
• 有两种假设,除了0,其他值不会
重复
• 单调递增
• 不希望妥协效果,本质上主要有两类方法:
• 降低低感知部分的采样频率
• 空间上的 – LOD
• 时间上的 – URO
• 更高效的利用硬件计算能力
• 并行计算
• 降低任务的依赖性
• 其他优化(略)
• 设计上的优化(略)
• 内容上的优化(略)
• 算法,代码上的细节优化(略)
优化
#UOD 2017
Update Flag
#UOD 2017
• 不重要的角色不渲染时可不更新
BoneMap
• 不渲染时不Tick可能会导致动画状态
更新被打断
LOD Threshold
#UOD 2017
• 任意枝干节点需要Evaluate Pose的,一般
都带有这个选项。
Blend by
bool
Blend by
Weight
Blend
per bone
Sequence BlendSpace
Pose
Sequence Sequence
Rigid Body节点的LOD优化
#UOD 2017
Update Rate Optimization
#UOD 2017
• 即使Tick,也可以使用URO,以1/4的频率Tick
• 使用LODMapForURO
USkeletalMeshComponent* CharMesh = GetMesh();
if (CharMesh)
{
// enable URO in code
CharMesh->bEnableUpdateRateOptimizations = true;
// UpdateRateParams customization
CharMesh->OnAnimUpdateRateParamsCreated.BindUObject(this,
&AMyChar::OnAnimUpdateRateParamsCreated);
}
• 不使用AnimInstance的EventGraph
• 使用Native Code在Proxy的UpdateAnimation中更新逻辑
• 可以把计算需要的数据放到Proxy上扔给其他工作线程
提高并行
#UOD 2017
• ACharacter::PostInitializeComponents()中
• Mesh->PrimaryComponentTick.AddPrerequisite(CharacterMovement, CharacterMovement-
>PrimaryComponentTick);
• 如果DS端不需要那么准确的当前帧动画位置同步,那么可以考虑自己继承类
中
• Mesh->PrimaryComponentTick.RemovePrerequisite(CharMoveComp, CharMoveComp-
>PrimaryComponentTick);
• 更有利于利用TaskGraph并行
提高并行
#UOD 2017
• 关闭Enable Physics on Dedicated Server
• 关闭bEnablePhysicsInteraction
• 从不Evaluate任何动画,需要保证不依赖骨骼位置(可以
使用Capsule做验证)
• 除非是Montage,其他一律关闭Tick;需要保证Notify都不
影响GamePlay只影响表现可被跳过;一般只有Montage中
会有GamePlay相关的Notify
• 即使Tick,也可以使用URO,以1/4的频率Tick
Server优化
#UOD 2017
Server优化
#UOD 2017
• 在初始化时设置Montage的Delegate
• 通过判断AnimInstance->IsAnyMontagePlaying(),决定是不是要允
许Tick。
Server优化
#UOD 2017
THANKS
#UOD 2017

Unreal Open Day 2017_Unreal Engine 4 Animation