UE5.0与5.1中动画系统更新内容的整理(猫都能看懂!)

您所在的位置:网站首页 ae怎么调整动画曲线 UE5.0与5.1中动画系统更新内容的整理(猫都能看懂!)

UE5.0与5.1中动画系统更新内容的整理(猫都能看懂!)

2023-04-21 11:31| 来源: 网络整理| 查看: 265

前言

前排提醒,本文约8700字,PPT约260页。

UE5发布也有好几年了,不过谈到UE5时,大部分人想到的都是其强大的渲染模块NaniteLumen,但其实动画系统也做了很多的更新优化!刷论坛时明显感觉动画相关讨论比较少(虽然也有动画本身不那么大众的原因),比如知乎上每次看到分享动画技术的文章感觉都是眼熟的那些大佬2333。

首先说明下写文背景:最近项目升级后看代码、翻文档的时候发现,UE5动画多了很多非常实用的功能,而这些功能平时都没怎么见人讨论过(比如支持了逻辑中设置状态机的状态等UE4的痛点),虽然新的文档有补充,但是把文档全部挨个翻一遍又非常无聊(尤其是对UE4动画已经比较熟的人)。

然后要吐槽下Epic,Epic在动画方面上的宣传重心基本上都在ControlRig、MetaHuman、IKRig等比较高大上的方面,但是很多日常开发中非常有用的新功能感觉宣传不到位啊!!

幸运的是前几天翻CEDEC的时候无意中发现了一个恰好满足我需求的分享,来自Epic Game Japan的 Kazuya Okada(冈田和也)的演讲《猫でも分かる UE5.0, 5.1 におけるアニメーションの新機能について》,也就是我这篇文章的标题。

这个演讲基本上涵盖了所有动画系统更新的内容,从CEDIL上可以下载pdf,pdf中附有完整PPT的链接。PPT有247页,1.62G,基本全是干货(和一些猫图)。。。

关于原作者,这个人名乍一看不太熟,但是看到推特ID一眼就认了出来,经常刷twitter上游戏动画相关话题的人对这个大佬应该非常熟悉,推特ID为おかず @pafuhana1213 ,经常发布/转发一些动画相关的分享。

分享的原PPT是日语的,虽然对着日语也能将就着看,不过为了组里的其他程序和美术同学也能方便的查阅,还是决定在阅读的时候顺便翻译一下(ChatGPT很方便),同时我去咨询了大佬并获取了大佬的转载许可,顺便文档中的一些链接也都替换成了中文官网链接方便查看。

由于原PPT中包含了很多视频演示、使用教程以及丰富的参考资料,为了方便浏览,我会结合自己的理解和经验,罗列(锐评)一下PPT上的一些重点内容。对动画比较熟悉的人可以快速浏览下查缺补漏即可;如果不太了解的人,建议直接打开PPT,配合视频和图一起阅读(原PPT和翻译后的PPT都会放在文末链接)。

不过由于PPT干货、示例和注意点之类的都很多,还是推荐阅读一下!!!

正文PPT目录

PPT把更新的内容划分成了五个部分,标题、副标题如下:

1. Locomotion & Interactions - 提高动画质量,减少制作成本

2. Runtime Framework - 优化动画蓝图,增强调试功能

3. IK Rig & Retargeting - FullBody IK , 动画复用

4. Control Rig - 程序性动画, 在引擎中制作动画

5. 开发中的新功能

第一部分主要介绍的内容基本就是之前Paragon中用到的一些技术,如OrientationWarping、DistanceMatching等,相信感兴趣的人之前就已经研究甚至实现过了。

第二部分主要讲的内容是新的动画蓝图中的机制、新的调试器RewindDebugger等,这也是我觉得分享中最有价值的一部分(占了100多页),基本上把一些零散的更新都整理了起来,尤其是状态机、动画节点函数等。

第三部分和第四部分分别粗略地讲了IK Rig、ControlRig相关的东西,其中ControlRig部分由于Talk的时长原因没有放内容。不过由于IKRig和ControlRig这两个部分已经挺火了,资料也很多,本身也可单独拿出来讲,这里不详细介绍也没什么问题。我的文章中也不做详细介绍了。

第五部分介绍了一些还在开发中的新功能(部分功能现在5.2预览版应该已经可以玩到了,虽然我还并没仔细去看)。

顺带一提,Talk的时间是22.11,当时5.1应该还没有正式版;我写文章的日期是23.04,可能有些东西已经有一点点过时了,毕竟5.2 预览版都出了。

第一部分 Locomotion & Interactions - 提高动画质量,减少制作成本

正如前面所说,第一部分主要介绍UE5中提供的一些Paragon用到的技术。这里是Paragon分享的链接。第一部分技术的原理都可以在分享里找到。

关于这部分内容网上的实现和文章讨论现在已经很多了(哪像两三年前都只有官方论坛有几个帖子讨论),我的文章中就不详细介绍了,感兴趣的可以自行搜索了解~

1. Motion Warping 动作变形

MotionWarping可以根据目标对象的位置和方向来自动校正动画的移动和旋转量,能够轻松实现与场景中物体的交互。 官方文档:Motion Warping

2. Pose Warping 姿势变形

PoseWarping可以根据角色的移动和旋转速度以及地面信息,对相关骨骼的运动进行修正。 实际上 PoseWarping = StrideWarping + OrientationWarping + SlopeWarping。

2.1 Stride Warping

根据移动速度调整步幅,可以使用较少的动画数据减轻滑步的情况。其原理主要是通过调整脚步的ik、盆骨的位置来模拟移动速度改变时动画应该发生的变化,而不是直接生硬地去调整播放速度。

注意:其主要用途是减轻混合多个动画时出现的不自然感,而不是用 Run 动作去替代 Walk 动作等!

2.2 Orientation Warping

根据移动方向调整腰骨、脊柱的朝向,可以使移动方向与动画方向匹配,而无需准备 BlendSpace。

Tips:在一些情况下,如待机、开始移动和停止等情况下,方向扭曲(Orientation Warping)的效果可能不太好。可以通过调整 alpha 值,使其不起作用,以达到更好的效果。

2.3 Slope Warping

根据地面的倾斜程度,调整对应的腰部与脚部ik 。可以结合 Leg IK 来轻松使用。

注意:不适用于楼梯这种情景,需要使用其他IK方式(传统FootIK或者FBIK等)。 移动时 or 相机远离时:由于不会特别明显,可以用Slope Warping(低成本) 停止时 or 相机很近时: 由于很明显,可以用标准的Foot IK(高成本)

2.4 Foot Placement(5.1新增)

以上都是PoseWarping部分的内容。最后描述了一些使用该模块的注意点:

参考资料:Pose Warping

3. Distance Matching 距离匹配

可以通过调整动画的播放速度,让动画与角色运动相匹配,从而减轻滑步的问题。

原理是通过动画内预先设置的曲线信息反算出动画本身的位置,例如Stop时通过预先计算出最终停止的位置,从而得出当前位置到目标位置的距离,然后根据这个距离去从Stop动画中预设置的曲线去反算出Stop动画当前的帧数。

官方没有用动画节点来实现,而是利用SequenceEvaluator和AnimNode 函数来实现的。github上有个大佬之前做了动画节点版本的,个人觉得比较好用:RomanMerkushin/DistanceMatching: Distance matching plugin (http://github.com)

官方文档:Distance Matching

第一部分基本就这些内容了,最后小结:

第二部分 Runtime Framework - 优化动画蓝图,增强调试功能

第二部分总共谈到了9块内容。

1.Template Animation Blueprints 模板动画蓝图

Epic终于发现自己的蓝图复用性低的离谱,做出了一些改进。

不过从描述来看官方用这个模板的流程似乎还是类似以前的那一套,继承AnimBP然后创建ChildABP,从模板图创建的子图还是不能写自己的AnimGraph逻辑,只是和骨骼解耦了。(感觉不如我们用了很久的方案hhh)。 子图中资源替换提供了两种方式,可以按需选择。

2. Blendspace Update

混合空间有了不少的更新。

2.1 BlendSpace Graph

BlendSpace Graph可以不用额外创建资产就能在蓝图中实现BlendSpace的功能,方便更加自定义地去控制混合方式。一开始看到还担心相比原先的UBlendSpace会不会有效率的问题(毕竟UBlendSpace本身缓存了网格点的权重信息来加速运行时的采样计算),不过初步看了下代码似乎还是内置了一个UBlendSpace来进行采样的工作,所以这方面的效率应该没什么问题。

相比于传统的资产,一个明显的好处是将只能选Seq的输入拓展成了蓝图内可自定义逻辑的Pose,即给原本的 Seq->混合空间输入流程变成了 Pose->混合空间输入流程。(比如ALS4的六向移动状态机的每个状态内部用来混合多方向移动的BlendMulti节点我觉得应该可以换成这个)。

2.2 BlendSpace Analysis

Blend Space Analysis 相当于是一个内置了许多种分析函数的解析器,当将选中的多个资产拖到BlendSpace编辑器内时,可以根据选用分析函数将每个资产自动分配到它的位置。 这个功能用好了可以提高很多生产效率。估计业内很多UE4的项目都有实现这样的脚本:某些命名规范比较统一的混合空间资产比如AO,可以用脚本把多个Seq自动生成混合空间,免去人工处理的步骤。新的功能就是更高级的一个这样的脚本了。

不过还没细看实现,也不知道使用起来效果如何,还需要一些时间去学习、理解和验证。毕竟这是个偏流程向的工具,估计不会一上来就替代原本的流程。

官方文档:Blend Space Blend Space Analysis

3. Blend Mask & Blend Profile

类似于UE4下已有的BlendProfile,UE5中新增了专门给LayeredBlend节点用的一个预设,都是在Skeleton中进行配置,和Skeleton强绑定。

(这里再次吐槽Epic,明明新的TemplateAnimBP终于知道要把骨骼和动画逻辑解耦了,这里的节点却还是强绑定。实际使用时不同角色的分层混合之类的设置多半是不同的(要分的层、骨骼的权重等),而不管是BlendProfile还是现在的BlendMask的属性都不能暴露出来在运行期间修改,需要自己去改节点的一些更新逻辑才能在外部动态来改)

BlendMask 对应的功能是LayeredBlend节点中之前用来控制混合的BranchFilter。 BranchFilter有一个比较大的缺点就是它的分层混合配置不够灵活,只有一个Depth可以来控制混合的深度,遇到复杂骨架层次时,如果深度设成0或1,效果比较僵硬;如果深度设大让他线性衰减,部分情况下蒙皮会容易错乱。

我想细谈一下BranchFilter导致的蒙皮错乱的内容(刚踩这个坑没多久)。

以下面的骨架为例(只是随便搞了个符合情况的骨架来举例,没有其他意思,也不用考虑层级是否合理),从clavicle_r开始进行深度为3的混合,那么:

1. clavicle_r的权重为1/3

2. R_Shoulder_Fix_1_Jnt的权重为2/3

3. R_Coat_Fix_1_Jnt的权重为3/3

但实际上美术的蒙皮那边,可能是按同级的方式处理Shoulder和Coat这两个骨骼的,而分成父子可能只是为了动画方便。这种情况下两个骨骼权重不统一就很容易就会出现穿插的问题,而如果把深度调成0或者1可以解决穿插的问题,但是效果就比较差了。

而Blend Mask的出现可以解决这个痛点,毕竟可以手动指定这些骨骼的分层权重。(虽然要绑定Skeleton这一点还是不太爽)

Blend Mask 和 Blend Profile的创建是在同一个地方,感觉不熟的人很容易搞混...

BlendProfile本身是UE4的功能就不再详细介绍了,需要注意的是比起之前只能设置不同骨骼的Blend Time,现在也可以选择设置Weight了。

Blend Mask 和 Blend Profile的区别:

1. Blend Mask只是用来LayeredBlend节点在分层混合时使用的,方便分层的预设。

2. Blend Profile可以用在Blend节点、状态机过渡、Montage等所有用到Blend的地方,主要场景是在动作间的过渡、混合时。

官方文档:Blend Masks and Blend Profiles

4. Animation Mirroring.

Animation Mirroring类似的功能虚幻4里面似乎已经有了,记得看代码时候见过一些Mirroring的字样,不过因为一直没什么需求就没研究过,可能Motion Matching处理数据集时可以用到吧。这一部分不熟我就不多说了,大概放一些PPT的图。

(PPT里让我震惊的是他这个节点还做了镜像动画的时候插值的功能,感觉基本不会用到吧......)

官方文档:Animation Mirroring

5. State Machine Update5.1 State Alias(状态别名)

终于可以告别蜘蛛网地狱了!一些不能用子状态机处理的复杂逻辑也可以很清楚地表示出来。

状态别名用起来和状态很像,只是其并不会输出Pose(不能像State一样点进去)。

一个别名可以指定多个状态,而这些被指定的状态更新时,除了自己的Transition(状态转换)外,还会额外判断别名所关联的Transition。等于是用一个别名节点抽象管理了N个节点到指定状态的跳转。

不过看了下状态机跳转更新的地方似乎没看到有别名的引用,估计是编译器就处理好了这些操作。

5.2 Conduits(导管)

新增了支持状态机Entry可以直接连接Conduit的功能。 (不过感觉这个有点鸡肋?因为本身UE4就可以用一个空状态来做出这种分支的功能)

5.3 Event-based Transition 基于事件的过渡

终于支持了逻辑层去控制状态跳转!!UE4下经常为了一些简单的跳转逻辑专门去做变量来控制,这种痛苦,只能说懂得都懂!!!

5.4 State Machine Funtion Library

基本同5.3,让逻辑层可以更方便的获取状态信息、强制设置状态等。

这些基本就是状态机的更新,我觉得状态机的这些更新是所有更新里最不错的了,毕竟动画稍微复杂一点的角色就会充斥着状态机。。。

官方文档:State Machine

6. Thread Safety 线程安全

在Event Graph上实现的(大部分)逻辑可以在多线程中处理,极大地改善处理多个角色(动画蓝图)时的性能:

可以看出这个测试环境下,新的Blueprint Thread Safe Update Animation 函数多线程下优化非常明显。

从描述看主要是替代EventBlueprintUpdateAnimation这个蓝图函数的,不过一旦涉及到性能优化,动画蓝图的EventGraph和蓝图函数基本都是要被干掉的,还是需要c++去跑。所以这个功能感觉是为了让美术、策划之类的人员用的(但是他们真的会在乎性能吗??)。

类比到c++,其实相当于是之前官方就推荐的,用AnimInstProxy的Update来代替NativeUpdate,能跑多线程的尽量走多线程。

7. Property Access 属性访问

UE4中其实就已经有了PropertyAccess的功能,不过只在一些动画节点的Detail面板上绑定,现在是新增了一个支持绑定的节点,主要为了提高逻辑图的效率吧。

球球Epic想办法做个访问绑定属性时判空的处理,不然遇到UAsset->USeq这种绑定时要是UAsset为空就直接崩了,这种地方还要去做个判空的中间层。。。虽然运行效率是真的高。

8. Anim Node函数

AnimNode 函数是全新的功能,个人认为也是UE5中动画系统最优秀的一个更新(和State Machine的更新并列第一吧)。

回想UE4,想要在代码中获取动画状态简直难上加难,尽管可以绕着弯子拿到StateMachine或者State的信息,,但是在面对Blend这种非状态节点时还是无能为力。。。

题外话:不知道ALS4的作者会不会继续更新ALS5了,在UE4下仅靠曲线之类的功能都能玩的那么花,UE5下估计更加强了。。。

至于用途,直接放PPT:

9. Sequence Evaluator

算是偏程序控制的一个节点吧,官方的DistanceMatching就是配合这个实现的。

还有一点补充内容:

Lyra项目中有很多示例可以参考。

这个功能没细看,看描述应该是Mesh的动画模式设置为CustomMode情况下,可以选择RootMotion生效的对象?UE4下默认角色组件处理动画RootMotion的方式是作用到角色自身的,这个看起来是任意Actor都可以启用,并且可以选择把RootMotion作用在Actor上或者作用在Mesh上。

强烈建议重新审视Anim BP相关的涉及和工作流程!!!

强烈建议重新审视Anim BP相关的涉及和工作流程!!!

强烈建议重新审视Anim BP相关的涉及和工作流程!!!

官方文档:Graphing in Animation Blueprints

10. 调试相关

第二部分还介绍了新的蓝图调试功能

RewindDebugger依赖AnimationInsights,可以看作是AnimationInsights的一个升级版本吧(虽然我记得AnimationInsights本身也是支持回放的),不过他调试起来确实比AnimationInsights更强大些。

官方文档:Rewind Debugger

第三部分 IK Rig & Retargeting

IKRig的概念应该都挺熟悉的了,没看过火速去看育碧2016的GDC:

GDC Vault - IK Rig: Procedural Pose Animation

并且因为其实装到UE5已经一段时间了,用UE5的大多数应该都接触过,就不多说了。

IKRig的用法,其本身可以作为一个节点在运行时处理IK,同时也可以配合IK Retarget做离线和实时的重定向。(说到重定向,甚至把UE4的重定向界面都删了,虽然代码还在。。。)

官方文档:IK Rig

第四部分 ControlRig

ControlRig这一部分的PPT完全没做hhhh,毕竟内容量比较大可以单独拿出来讲了。我这里也不写了,相信感兴趣的已经刷过很多分享了~

第五部分 开发中的新功能

1. Physics Control Component(实验性)

原先PhysicalAnimationComponent的升级版,知乎也有一些介绍物理动画的文章,可以直接参考:

1. 虚幻引擎 Physics Control Component 简介 - Zero的文章 - 知乎

2. 【UE5】基于物理的角色动画(基础篇) - 爱吃菠萝不吃萝卜的文章 - 知乎

PPT内看到了熟悉的三个经典物理动画Talk:

1. Physics Animation in Uncharted 4: A Thief's End

2. Physics Driven Ragdolls and Animation at EA: From Sports to Star Wars

3. Physical Animation in Star Wars Jedi: Fallen Order

2. AnimToTexture

主要用途应该是用来处理一些集群动画的性能优化, 应该很早之前就有项目使用类似的技术了,这次算是官方帮实现了一版。(只要够懒就能等Epic给你实现新的需求)

3. MotionMatching

IK Rig和ControlRig都懒得介绍,这个更不用说了。

我们虚幻真是太厉害辣!

(毕竟这是实验性功能!)

4. Deformer

这个里面就比较高级了,应该涉及了些顶点动画的处理,和Shader要打交道。

5. Contextual Animation

非常适合用来做交互动画!不过因为还没尝试过,不知道实际体验如何,看起来还是很酷炫的。

总结演讲的总结

个人的体验

总体过了一遍后,感觉动画虽然不如渲染管线的更细那么引人注目(甚至当时看到5.0时以为动画只是加了个IKRig、加了些函数而已),但是其实动画系统整体的更新也是值得去翻新一下现有的动画流程的,一些原有的很绕的实现都可以干掉了。

不过之前都是在别人的评论区讨论技术,也是第一次在知乎分享技术相关文章,算是业余时间给国内论坛做点小小的贡献吧hhh,后续有空闲时间的话可能也尽量发一些文章。(吐槽知乎的编辑体验,bug太多了!!!受不了之后用有道云写md,结果有道的图链导不进来还要手动复制一遍)

ChatGPT翻译确实准确、更加人性化(对比PPT内置翻译功能和有道翻译),要是能直接喂它PPT就好了。

关于授权

以下为一个用日语的中国人和用英语的日本人的对话:

PPT的链接

先放到GoogleDrive上了,包含了原版和中文翻译版: GoogleDrive

度盘的还没传完,之后会更新.....



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3