为“古代山谷”中的机器人制作动画和绑定

2021年8月4日
大家好,我是Epic Games引擎动画技术产品经理Jeremiah Grant。这篇博文将讲述在虚幻引擎5抢先体验版项目“古代山谷”中,我们为结尾出现的巨型机器人“The Ancient One”制作动画和绑定时的心路历程,以及实现过程和使用的工具。“The Ancient One”通过充分利用虚幻引擎5抢先体验版中的Nanite和动画功能,拓展了动画和绑定系统的极限,这一成果离不开与Aaron Sims Creative Company的紧密合作。

现在,就让我们一探究竟吧。
 

构建蓝图

在构思The Ancient One的时候,我们就确定了要使用Nanite来加深机器人的几何体细节。这就引出了一些关于设计和工作流程的注意事项。我们的设计不依赖于骨架网格体和传统的蒙皮,而是通过蓝图在骨架上附着高分辨率的Nanite网格体,由这些网格体牢固地相互铰接,组成机器人。这意味着每个铰接元素都必须是一个独特的网格体,为了避免混乱,需要明确定义组织结构。

我们在解决组织问题时采用的方法与构建关卡时类似,即使用清晰的命名模式和文件夹结构。每个网格体元素都遵循特定的命名模式,并与骨架中的骨骼名称配对。几何体和材质按身体部位在文件夹中组织,确保更方便地在项目组织结构中导航,例如直接导航到头部、锁骨或腿。通过采用这种方法,我们能够使用BP_AncientOne中一个简单的函数快速推导出几何体应该如何附着到骨架上。这也意味着,当加入新的几何体和骨骼时,同一函数也会自动将它们附着上去。

AttachMeshesToRig函数会单纯地在蓝图中遍历BodyParts组件中的所有子项,并使用Attach Component to Component。为了将新的几何体添加到绑定,我们会将几何体导入虚幻引擎,然后将它拖到BodyParts组件下。
BP_AncientOne中的Attach Meshes to Rig函数。

骨架

骨架本身源于MetaHuman骨架,它利用了相同的基本层级,但手指更少,并移除了扭转骨骼(AncientOne_skeleton_Skeleton)等矫正骨骼。骨架在Maya中被修改成适当的比例,并被蒙皮到一个简单立方体上,这样,我们就能在虚幻引擎中生成骨架网格体,并将Nanite网格体附着在它上面。使用MetaHuman骨架作为基础,意味着我们能够立即在虚幻引擎中使用MetaHuman控制绑定开始动画制作。为了在不严重影响动画或骨架的前提下更方便地迭代角色,我们将机器人构建成与MetaHuman相同的比例,然后在引擎中进行缩放。在摸索环境规模以及角色的互动性时,这提供了很大的灵活性。
附着有全部网格体的The Ancient One骨架。

控制绑定

目前,在虚幻引擎5抢先体验版的控制绑定编辑器中,我们无法查看静态网格体或Nanite网格体。因为控制绑定会一直进行求值,我们将绑定放置在关卡中,并在控制绑定中做出更改,通过这种方式对该绑定进行测试——编译会更新和传播绑定的变化,使我们能够在拥有5千万个三角形的网格体上实时查看绑定,并测试它的性能。
左侧是关卡编辑器。右侧是控制绑定编辑器。
为了创建机器人的控制绑定,我们将MetaHuman项目的控制绑定当作基础,并做了一些修改,请参考:AncientOne_Body_CtrlRig。首先,我们将绑定层级和预览网格体更新为新的几何体。右键点击绑定层级,选择“刷新层级”,然后选择正确的骨架网格体,即可更新绑定层级。此操作将使用更新后的骨架层级替换原有的骨架层级,并尽可能确保绑定层级的剩余部分(如控件、空间和自定义骨骼)完好。

控制绑定有三种模式:Setup Event、Forward Solve和Backward Solve。在MetaHuman绑定中,Setup Event模式会将所有控件调整到已导入的绑定层级中,使我们能够复用该绑定。它会读取骨骼的初始值并设置“控件偏移变换”,从而将控件放置到骨架的适当位置。因为这是用户生成的图表,所以我们可以执行一些复杂的操作,如定义极矢量的位置,放置FK和IK控件,或者设置初始值,以供我们稍后在图表中使用。

MetaHuman控制绑定假设角色是对称的,因此我们对其做了一些调整,以创造不对称的机器人。在Setup Event图表中,我们复制了Setup Left Arm部分,在字段中填入了适当的信息,并将这些字段连接到了图表中。我们还在Forward Solve和Backward Solve图表中更改了引用手指骨骼的项目集合,使它们引用在Setup Event的初始流程中所设置的变量,在开发角色时,这使我们能够轻松改变被引用手指的数量,而无需在多处进行修改。
用于定义左腿、放置IK和FK并设置极矢量控件的Setup Event图表。
我们可能还希望装甲板直接动起来,因此,除了更改基础MetaHuman控制绑定,我们还为装甲板增加了控件。动画团队提出了将手臂预设为IK而非FK的特别要求。通过更改IKFK布尔控件上的初始布尔值(例如arm_l_fk_ik_switch和leg_l_fk_ik_switch),就能轻松实现。

我们希望由程序驱动The Ancient One的众多内部机制和动作,从而减少动画师的工作量,并允许我们通过剧情和操作间的过渡动画检验程序性动画工作流程。我们并没有通过扩展MetaHuman绑定来为角色注入自动化驱动元素,而是打破了所有程序性驱动机制,全部集中到一个独立的控制绑定:AncientOne_Mechanics_CtrlRig。在骨架网格体资产细节(AncientOne_Post_AnimBP)中,已将“Post Process Anim BP”指定为后期处理动画蓝图,而这个控制绑定会被添加到该蓝图中。一切内容(包括关卡序列或状态机)处理完毕之后,后期处理动画蓝图将开始求值。这意味着,无论是在Sequencer中为该绑定制作动画,还是播放一段开火动画,所有程序性动画都将上演开火。
 
手臂活塞、齿轮和臀部装甲等部件都按照程序执行动作。

虚幻引擎5抢先体验版为控制绑定引入了新功能。这使我们能够非常轻松地区分绑定的各个部分(如机器人肩部和胸部的活塞),并复用这些部位的行为。

查看函数clavicle_pistons,可了解它的结构。两个项目集合被传递进来,分别用于活塞的起始骨骼和结束骨骼。在函数内部,起始骨骼和结束骨骼通过名称匹配,并相互瞄准。在循环遍历所有项目后,函数会传回最终姿势,然后移动到绑定图表中的下一个节点。在各个活塞组中使用该函数后,我们就能得到更小、更清晰的图表,并在同一位置解决所有问题。
AncientOne_Mechanics_CtrlRig中的Piston函数将重复用于绑定中的各个活塞分组。
如果要在图表中根据传入的动作来调整姿势(即根据手臂动画自动调整活塞姿势),这个活塞函数是一个很好的示例。查看另一个函数core_gears,可以了解控制绑定图表的另一个用例。在这里,我们设置了程序性动作,为核心传动装置和圆盘创造了类似于时钟摆动的效果。Accumulated Time节点创建了一个时间值,我们可以使用该值或将其输入其他节点,从而驱动旋转动作,或通过正弦运算产生摆动。为了提供对该行为的高级别控制,我们公开了gear_weight变量,并将其传入Accumulated Time节点的Speed值中,这将允许我们通过蓝图禁用或停止该行为。在这个特定示例中,一旦The Ancient One被击败,这个变量就会停止齿轮的动作。
通过使用core_gears函数,我们能够以美术导向的方式控制程序性的齿轮动作。

在Sequencer中制作动画

在开发“古代山谷”时,我们的目标始终是让The Ancient One尽可能地展现UE5 EA版的动画性能。虚幻引擎的非线性动画工具Sequencer最近得到了大量改进,而这个项目赋予了我们探索极限的机会。
 
利用不断完善的工具套件,在关卡编辑器中与动画绑定互动。

在为机器人创建动画前,我们首先在关卡中创建了一个关卡序列,并在其中添加BP_AncientOne。需要注意的是,机器人在环境中的位置和比例是通过场景细节面板中的Actor变换完成的,而非通过控制绑定。我们接下来会在Sequencer中将它设为关键帧,以确保它的位置始终正确。这意味着我们能够自由缩放角色,而不影响动画性能。也意味着动画与动画Actor的位置将始终保持对应,当展现游戏操作动画或在影片镜头间跳转时,确保位置相对以原点为中心。这无缝地融合了关卡序列和动画蓝图。

关卡序列设置完毕后,我们就可以开始制作动画了。点击BP_AncientOne上的“+轨道”,并导航至“控制绑定”->“基于资产的控制绑定”->AncientOne_Body_CtrlRig,即可在Sequencer中为控制绑定添加身体动画绑定。添加控制绑定轨道后,关卡编辑器模式将被自动切换为动画模式。也可以通过手动点击视口上方工具栏中的“跑步者图标”进行切换。在关卡序列中展开轨道后,将会显示一个接受键盘输入的控件列表,我们现在也可以在视口中看到接受操控的可动控件。
 
如何在Sequencer中设置机器人。

理解如何为机器人设置基本关卡序列后,我们可以将视线转向游戏操作动画关卡序列。这些序列位于以下文件夹:/AncientBattle/Characters/AncientOne/Animations/SourceSequences/。打开SEQ_Robot_Fire关卡序列后,机器人会被加载到场景中的合适位置,随后我们可以通过调整关卡序列来修改开火动画。

注意:在新关卡中打开任意源序列后,会在主关卡中生成机器人的位置加载它(而非原点)。这个偏移变换在关卡序列中被设置为关键帧。

虚幻引擎5抢先体验版中新增了一些动画工具,位于“动画模式”窗口的工具栏中。在这里,你可以快速地将视口模式更改为“仅选择控件”,从而更方便地在关卡编辑器中选择控件,并避免误选其他场景对象。你还可以在这里访问新的姿势库、补间工具和吸附工具。如需更多信息,可参阅虚幻引擎5抢先体验版文档。在项目开发期间,姿势库发挥的作用尤其引人注目。动画师能够创建多种控制绑定姿势以供日后使用,如手部姿势、全身姿势和待机姿势。由于姿势存储了受其影响的控件,因此也可将姿势当作选择集使用,帮助你快速选择需要频繁操作的控件。这些姿势被保存为资产,你可以在不同的关卡序列中应用它们。如果需要调整开场序列中的待机姿势,通过存储和粘贴其他关卡序列中的姿势,就能快速地将该姿势更新为其他动画状态。
姿势库是虚幻引擎5中新增的动画工具之一。
关卡序列有一个名为链接动画序列的较新功能,在4.26版本中首次引入。每当保存关卡序列后,链接动画序列将自动更新骨架动画序列。这意味着,在Sequencer中制作动画时,动画将被自动烘焙,以供在蓝图中使用,无需来回操作。为机器人创建游戏操作动画序列时,主要采用这种方法。

要创建链接动画序列,请在Sequencer中右键点击Actor(BP_AncientOne),并选择创建链接动画序列。引擎将提示你选择保存动画序列的位置。在创建链接后,务必记得保存关卡序列和新的动画序列。
可以从Sequencer Actor轨道创建链接动画序列。
在Sequencer中右键点击Actor,并选择打开链接动画序列即可导航到链接动画序列。同样,在动画序列编辑器中选择“在Sequencer中编辑”按钮,然后点击打开关卡序列,即可从动画序列转到原始关卡序列。

提示:若要为不同的动画状态创建额外的关卡序列,只需复制关卡序列资产,并删除关键帧以重新开始。如果复制的关卡序列已链接至动画序列,请创建新的链接动画序列,以免意外覆盖错误的动画序列。

在Sequencer中配合使用控制绑定和链接关卡序列的优势在于,当骨架被修改时,能够轻松更新动画。由于Sequencer驱动的是控件,而非骨骼,因此它将响应控制绑定中的任何更改。只需打开关卡序列并重新保存,即可更新动画资产,这将重新烘焙最新的骨架变化。

全身IK


最后,我们来看看全身IK层,添加它的目的是为了扩展和调整The Ancient One在瞄准主角时的姿势。这种效果是为了锦上添花,增强动画师的预期目标,而非取代。
 
全身IK增强了动画效果,让动画响应玩家行为。

在虚幻引擎5抢先体验版中,全身IK解算器已经得到改进,更快速、更易于操作。在控制绑定中,可将全身IK视作一个节点进行访问,CR_AncientOne_ArmAim_CtrlRig中就运用了这种特别的效果。

在查看创造了这一效果的控制绑定资产之前,我们先来看看它的触发方式。机器人的动画蓝图AncientOne_AnimBP使用了一个简单的状态机来控制行为,然后在输出最终姿势之前,将姿势传递给了一个控制绑定节点。我们还收集了一些变量传递给控制绑定节点,并通过浮点变量AlphaCR驱动权重值,实现与控制绑定节点本身的混合/解除混合。
在状态机完成求值后,动画蓝图将控制手臂瞄准。
使用Alpha_CR变量,我们可以控制全身效果的应用时机,以及它与控制绑定anim节点中插值属性混合/解除混合的速度。选择该节点,并查看“细节”面板,我们可以看到“透明度缩放偏差限制”部分。有一个我们喜欢使用的绝妙技巧,那就是为混合和解除混合行为设置不同的速度。调整“内插速度提高”和“内插速度降低”就能做到这一点。控制绑定的混合速度将很快,但解除混合的速度会很慢。这反映在节点权重引脚描述中:FInterp(Alpha, (10:2))。

Reach Amount变量提供了一个便捷的浮点值,它介于0到1之间,通过对其进行设置,可调整机器人在开火时向主角Echo伸手的幅度。这不是通过游戏玩法驱动的,只不过是我们在AnimBP中设置的一个值,用于实现美术导向的额外控制性。Laser Location变量代表激光在场景中将击中的地面位置。这个值直接在BP_AncientOne中设置,并为控制绑定中的全身IK指示攻击目标。

我们可以通过双击AnimBP中的节点打开控制绑定。这张图表初看很简单。首先将LaserLocation的场景空间位置转换为与机器人的相对位置,然后使用它驱动名为actor_transform的控件。此控件用于代表机器人开火的位置。只需绕过Set Translation控件,即可手动移动该控件,从而直接在控制绑定编辑器中测试和调试机器人。
Arm Aim控制绑定使用了函数和分支,支持快速测试。
控制绑定默认使用全身IK,但也包含了基础IK变体作为简化方法。双击AimWithFBIK节点即可打开创建了全身IK效果的函数。
全身IK控制绑定函数及每个逻辑分段的注释。
AimWithFBIK函数可分解为几个部分:采集数据、调整臀部、计算伸手幅度、应用全身IK,以及调整手的方向。

简短引言:构思设置的过程也是一段探索之旅,有的片段被保留,但未被使用。

函数中首先出现的是Entry节点,然后是Sequence节点。我们经常使用Sequence节点将功能分解成逻辑步骤,从而提高可读性并降低调试难度。Sequence节点的“A”引脚用于采集数据和调整臀部。为了采集骨骼变换数据,我们使用了Get Transform节点,并将Transform的值提供给一个控件的Set Transform节点。要存储动画蓝图中传入的动画姿势,创建控件并将它们的变换形式设置为骨骼变换是一种绝佳方法,因为流程非常直观,而且即使出现问题也很容易调试。我们在控件中存储了一些骨骼变换,但我们最终使用的是foot_l、foot_r、hand_r bones和控件。

在成对的Get Transform和Set Transform将骨骼存储到控件上之后,紧跟着的是Offset Transform节点和一些逻辑运算,用于使骨盆轻微向前移动。这主要是为了模拟机器人在发射激光时的身体前倾。机器人发射激光冲击波时,一个较小的移动数值将被乘入Offset Transform。

将Sequence节点下移至B引脚后,我们开始为全身IK完善数据。要遵循的原理是,在激光发射时,我们要让右臂伸向Echo,但不能让手伸向地面。为此,我们将hand_r_ctrl的Z坐标与actor_transform的X和Y坐标结合起来。现在,我可以在传入的手部动画变换(存储于hand_r_ctrl)以及刚才计算的新变换之间执行插值运算。Interpolate节点的输出变换代表了右手的新目标姿势,它将被直接输入到全身IK解算器中。
计算伸手姿势的变换,使用Remap节点固定到安全姿势。
现在我们已经采集和完善了所有的数据,最后要将它们全部输入到解算器中。在将数据输入解算器之前,务必花时间检查采集到的数据是否干净并能提供预期的结果。
全身IK解算器使用存储的脚部动画变换和计算出的手部姿势变换来调整整个身体的姿势。
与其在这里解释各项解算器设置,不如观看我们最近录制的直播:运动扭曲及全身IK | Inside Unreal。在这个视频中,我们深入探讨了解算器的内部工作方式,及其在The Ancient One中的用法。总体而言,我们希望双脚保持站稳,然后调整身体其他部分,向Echo倾斜,同时让右手前伸。通过调整解算器中的骨骼设置,我们能够详细设置当解算器尝试完成我们提供的变换时,哪些骨骼可以扭转和移动。

这个函数的最后一部分是让手瞄准激光击中的位置,存储为actor_transform控件。我们让解算器粗略地摆放出姿势,然后再加以完善,而不是完全依靠解算器确保手部方向正确。通过这种方式,我们将充分利用解算器的优势,并顺利保持美术导向。设置瞄准动作时,我们只是确定了手掌的轴,并提供actor_transform作为目标。 

讲述你的故事

动画即是讲述故事。在Epic,我们致力于为故事讲述者创造工具。我们刚才已经看到了Sequencer在角色动画中的作用,无论是手key动画还是动作捕捉动画。使用像控制绑定和全身IK这样的工具,结合运行时引擎,我们讲述的故事将更具活力、沉浸感和影响力。 

尽管角色绑定和运行时设置可能很复杂,但通过构建层次和划分逻辑,我们就能够在程序上以美术为导向,创建一个更易于调试、更灵活的角色。我们所创造的一切都是为了赋予美术师和设计师更强大的力量,提供了精细控制功能的控制绑定只是工具百宝箱中的一件。 

在最近的Inside Unreal直播中,我们会深入地探讨全身IK解算器和图表实现(以及我在此过程中所犯的错误)。 

虚幻引擎5仍处于抢先体验阶段,绑定和动画是我们目前的工作重心。欢迎提供反馈,帮助我们打造最完美的虚幻引擎5。请加入我们的论坛,也可以在Twitter上联系我。

要详细了解“古代山谷”中的动画功能以及该项目中的其他惊人成果,请在我们的“内容和示例”页面中通过导览阅读更多内容。


附加链接:
狐獴示例项目
MetaHumans
在4.26中使用控制绑定制作动画 | Inside Unreal
虚幻引擎推动动画进程

    立即获取虚幻引擎!

    获取全球最开放、最先进的创作工具。 
    虚幻引擎包罗万象,并提供完整的源代码访问权限,开箱即用,诚意十足。 
    新闻
    8月19日

    虚幻引擎4.27现已发布!

    各行各业的创作者都将为此发行版中的某些功能而欢呼:通过一系列效率、质量和易用性方面的改进,摄像机内视效上升到了新高度,同时,其他亮点包括通过路径追踪实现精美的最终图像,开箱即用的Oodle和Bink,可用于生产的像素流送等诸多功能。
    新闻

    虚幻引擎4.27现已发布!

    各行各业的创作者都将为此发行版中的某些功能而欢呼:通过一系列效率、质量和易用性方面的改进,摄像机内视效上升到了新高度,同时,其他亮点包括通过路径追踪实现精美的最终图像,开箱即用的Oodle和Bink,可用于生产的像素流送等诸多功能。
    聚焦
    9月7日

    Mold3D Studio与虚幻社区分享动画示例项目Slay

    为了启发和指导美术师,Mold3D Studio创建了一个动画内容示例项目,分享其数十年的行业经验。Slay完全在虚幻引擎中渲染,它将动画与现实主义相结合,营造出了一种独特的风格。
    聚焦

    Mold3D Studio与虚幻社区分享动画示例项目Slay

    为了启发和指导美术师,Mold3D Studio创建了一个动画内容示例项目,分享其数十年的行业经验。Slay完全在虚幻引擎中渲染,它将动画与现实主义相结合,营造出了一种独特的风格。
    聚焦
    7月21日

    虚幻引擎全新摄像机内VFX工具集试运行

    即将发行的虚幻引擎4.27将包含丰富的虚拟制片工具。最近,Epic Games和电影人团体Bullitt召集起一支队伍试用了其中的摄像机内视觉特效工具集。为了测试到每一种新工具,他们拍摄了一部测试短片来模拟制片流程。
    聚焦

    虚幻引擎全新摄像机内VFX工具集试运行

    即将发行的虚幻引擎4.27将包含丰富的虚拟制片工具。最近,Epic Games和电影人团体Bullitt召集起一支队伍试用了其中的摄像机内视觉特效工具集。为了测试到每一种新工具,他们拍摄了一部测试短片来模拟制片流程。