您当前的位置: 首页 >  ue4

开发游戏的老王

暂无认证

  • 3浏览

    0关注

    803博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

[玩转UE4/UE5动画系统>基础篇] 之 动画曲线混合-易被忽视的知识点与技巧

开发游戏的老王 发布时间:2021-07-31 20:58:29 ,浏览量:3

本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|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. 动画图

准备2个动画资源:

  • Anim A :test曲线值恒定为3
  • Anim B :test曲线值恒定为5
2.1 使用 Blend节点混合

整个动画蓝图就这么简单,后面再没有其它混合了。

在这里插入图片描述使用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(曲线混合选项)**有若干选项,下面老王就来逐一介绍一下

在这里插入图片描述

2.2.1 Override模式

将 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
2.2.2 Do Not Override模式

和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:曲线值取最大值。
2.3 其它混合节点

诸如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的曲线值。
关注
打赏
1656935939
查看更多评论
立即登录/注册

微信扫码登录

0.0390s