本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏《玩转UE4/UE5动画系统》。教程中使用的资源及工程将以开源项目的形式更新到GitHub:玩转UE4上。
工程文件: 玩转UE4(GitHub)
- 前言
- 实验步骤
- 1. 事件图
- 2. 动画图
- 2.1 使用 Blend节点混合
- 2.2 使用 Layered blend per bone节点混合
- 2.2.1 Override模式
- 2.2.2 Do Not Override模式
- 2.2.3 Blend by Weight模式
- 2.2.4 Normalized by Weight模式
- 2.2.5 其它模式
- 2.3 其它混合节点
- 小结
在使用UE4/UE5开发项目时免不了要和动画曲线打交道,但是动画曲线经过动画蓝图的各种运算之后,我们再使用GetCurveValue方法取到曲线值的时候,到底时从哪里获取的曲线值,并且曲线值经历了怎样的计算,这些问题往往让初学者一头雾水,本文就通过一些列的小实验,帮助大家搞把曲线混合的问题搞清楚。
实验步骤 1. 事件图我们在动画蓝图的事件图使用GetCurveValue节点获取名为test的动画曲线并输出
准备2个动画资源:
- Anim A :test曲线值恒定为3
- Anim B :test曲线值恒定为5
整个动画蓝图就这么简单,后面再没有其它混合了。
使用Blend节点对两个动画资源进行混合
- Alpha = 0 结果为3
- Alpha = 0.5 结果为4
- Alpha = 1 结果为5
即此时用GetCurveValue获取到的曲线值为AnimA*(1-Alpha)+ AnimB*Alpha。这个结果和使用Blend节点混合Pose的逻辑是相同的。并且要牢记:不管有多少个动画资源携带test曲线,使用GetCurveValue获取的曲线值一定是最终汇入Final Pose时的test曲线值。
Blend节点在混合曲线值的同时也一定会根据Alpha将Pose进行混合,但有些时候,我们只想用AnimB为最后的结果提供曲线值,而不像让它改变AnimA的动画。这时,我们可以使用Layered blend per bone节点实现。
2.2 使用 Layered blend per bone节点混合Layered blend per bone节点的**Curve Blend Option(曲线混合选项)**有若干选项,下面老王就来逐一介绍一下
将 Layered blend per bone节点的Curve Blend Option设为Override,无须指定骨骼,这时只要Blend Pose 0(AnimB)参与混合(Blend Weight 0> 0)且Blend Pose 0携带有效的曲线(test),那么Blend Pose 0的曲线值就会覆盖掉AnimA的曲线值。
- Blend Weight 0 = 0 结果为3
- Blend Weight 0 = 0.01 结果为5
- Blend Weight 0 = 1 结果为5
和Override模式相反,只要Base Pose(AnimA)携带有效的曲线(test),那么最终的曲线值就会取自Base Pose
2.2.3 Blend by Weight模式将 Layered blend per bone节点的Curve Blend Option设为Blend by Weight,这时你会发现无论将Blend Weight 0设为多少,GetCurveValue的结果都是Base Pose(AnimA)的值:3 。
这时因为,Blend by Weight模式下,必须要为 Layered blend per bone节点设置Branch Filter骨骼。如果不想让骨骼参与咋办呢?那就在骨架上添加一个虚拟骨骼,比如VB Curves,然后让VB Curves作为Branch Filter骨骼就可以了。
- Blend Weight 0 = 0 结果为3
- Blend Weight 0 = 0.1 结果为3.5
- Blend Weight 0 = 0.2 结果为4
- Blend Weight 0 = 1 结果为8
- Blend Weight 0 = 100 结果为8
即曲线值为Min(Base Pose + Blend Weight 0 * Blend Pose 0,Base Pose + Blend Weight 0)。
2.2.4 Normalized by Weight模式和Blend by Weight模式一样,Normalized by Weight模式也必须指定Branch Filter骨骼,不同的是
- Blend Weight 0 = 0 结果为3
- Blend Weight 0 = 0.2 结果为3.3333
- Blend Weight 0 = 0.5 结果为3.6666
- Blend Weight 0 = 1 结果为4
- Blend Weight 0 = 100 结果为4
即曲线值为**(Base Pose1 + Min(Blend Weight 0 ,1) Blend Pose 0)/(Min(Blend Weight 0 ,1)+ 1)**。
2.2.5 其它模式- Use Base Pose:曲线值仅取自Base Pose。
- Use Min Value:曲线值取最小值。
- Use Max Value:曲线值取最大值。
诸如Blend Poses by bool节点、Blend Poses by int节点等可以进行动作混合的节点都可以进行曲线的混合,它们的混合逻辑类似于Blend节点,本文就不再赘述了。
注意: 另外还有一些节点,诸如Apply Additive节点、Apply Mesh Space Additive节点以及Make Dynamic Additive节点,它们可以接受多个Pose的输入,也会伴随着曲线值的改变,但是并不建议过份计较它们对曲线值的影响,而是采取更为简单有效的方法控制曲线,即ALS V4中的解决方案,详见本专栏中《[玩转UE4/UE5动画系统>应用篇>架构设计] 之 ALS V4的Overlay框架详解》一文中的曲线覆盖方法。
小结- 根据不同的需求选择不同的节点进行曲线混合。
- 使用GetCurveValue获取的曲线值是整个动画蓝图最终汇入Final Pose的曲线值。