面部动画共享

介绍使用姿势资源、动画蓝图和动画曲线共享面部动画的方法。

Windows
MacOS
Linux

FacialAnimationSharing.png

如果您的项目中有多个类似的角色并共享同一个骨架资源,则可能需要考虑使用曲线驱动动画来制作面部表情。这样,您就可以共享这些动画曲线,并通过姿势资源驱动它们以产生您所需的面部表情,甚至在多个骨架网格体之间共享它们。 

但必须注意的一点是,动画不得包含任何骨骼变形数据。任何骨骼变形数据,哪怕只有一个网格体的参照姿势,也无法对其他网格体发挥作用,因此如果想要在不同网格体之间共享曲线,必须移除骨骼变形(仅保留曲线),并从每个网格体自己的参照姿势入手。这样您就可以在不同面部之间共享面部曲线。 

以下是一个示例工作流程,您的工作流程可能根据资源和所需结果而有所不同。

创建和使用主骨架

首先需要导入基础骨架网格体,并创建将被视为主骨架的骨架资源(这是想要共享面部表情的每个其他骨架网格体将会使用的资源)。您导入的任何其他网格体应当拥有相同的骨骼层级和命名约定,以便共享骨骼资源。

MasterSkeleton_01.png

请参阅骨骼资源 文档页面以了解关于骨骼的更多信息。

创建姿势资源

接下来需要在DCC内部,烘焙姿势到FBX序列,并将该FBX导入到UE4中。这样将产生一个动画序列,其中包含处于最小/最大混合值的每一个曲线。 

单击查看大图。

在上图中,导入的动画序列包含所有曲线以及给定帧处的最大值。

导入了包含所有曲线数据的序列后,可以从该动画序列创建姿势资源 ,继而用来将动画曲线数据转换为角色的实际面部动画。 

AnimationSequence_02.png

您可以右键单击动画序列,并用快捷菜单根据它创建姿势资源。

在姿势资源内部,需要手动输入每个名称,或者复制粘贴剪贴板中存储的数据来定义姿势名称。 

以下是58帧动画序列中识别的所有姿势列表,这个序列包含了我们导入的所有姿势: 

Facial_Poses.png

然后,我们可以将它们作为姿势资源中的姿势名称应用: 

PoseAssetBlank.png

然后您将会在随着骨架资源一起存储的 动画曲线(Anim Curves) 窗口中看到这些曲线。 

单击查看大图。

每一个使用主骨架的角色都会访问这些曲线,并用每个曲线中表示的不同值驱动自己的面部表情,同时姿势资源将所有曲线数据转换为角色采用的实际动画姿势。 

AnimationSequence_03.png

在上面,我们将jaw_open_pose的默认值从0更改为1,这样让角色张开了嘴。

在姿势资源中输入您的姿势名称时,通常最好从 动画曲线(Anim Curves) 窗口中删除不使用的曲线,以尽量减少要显示的不使用的曲线数量。

在下面的姿势资源中,我们可以看到所有的姿势名称,同时它们也会出现在动画曲线(Anim Curves)窗口中:

PoseRename1-1.png

当我们将 Pose_0 更改为 l_eye 时,Pose_0 保持为动画曲线(Anim Curves)中的一条曲线,单击右键并选择 删除曲线(Delete Curve) 可以将它删除。

PoseRename2.png

建立父/子动画蓝图

有了姿势资源后,需要为该角色创建 动画蓝图 来利用曲线驱动的动画,最后创建 姿势资源(Pose Asset) 节点(分配姿势资源)来正确地将曲线数据转换为角色可以使用的姿势。 

单击查看大图。

如果将曲线驱动的动画直接插入到最终动画姿势,动画姿势就不会知道如何将曲线转换为姿势数据。这时就轮到姿势资源发挥作用了,它负责拦截动画,正确地将曲线转换为角色可以使用的实际姿势数据。 

当您有其他角色时,如果从该主动画蓝图为它们创建并分配子动画蓝图,可以使用每个角色的特有姿势资源数据覆盖此姿势资源。这样就可以实现角色的特定差量,确保比如尖叫等效果能够在各种比例上都看起来正确。 

单击查看大图。

以上图中我们有另一个角色在使用基于主蓝图的子动画蓝图。

在子动画蓝图中,我们覆盖了姿势资源以使用特定于该角色的资源,让我们可以使用差量来驱动特定于该角色的面部姿势,并且显示的动画来自于父代。

引入动画

开始为角色引入面部动画时,除了曲线驱动的面部动画之外,通常需要一些由角色骨骼驱动的肢体动画。为了共享肢体动画,而不是通过曲线驱动面部动画,您需要从面部动画移除任何骨骼轨道,仅留下曲线,或者使用动画修饰符来移除指定的骨骼轨道,并驱动面部曲线。 

具体的工作原理是怎样的呢?例如,我们以下面的动画序列为例: 

BringInAnimation_01.png

我们的动画序列包含所有曲线和这些曲线的键值,它们表示不同的面部姿势。但问题是曲线也是基于任何骨骼驱动的动画播放的,这样就会导致双重变形和不正确的结果。在这种情况下,您需要移除这些骨骼变形,仅留下曲线。 

您可以从"资源(Asset)"菜单中的动画下面移除所有骨骼轨道: 

BringInAnimation_04.png

您还可以使用动画修饰符移除特定骨骼,但前提是您只想共享肢体动画,而不是面部的驱动曲线。通常,您需要有骨骼驱动的肢体动画,而不是曲线驱动的面部表情,此时我们可以选择使用动画修饰符。 

BringInAnimation_02.png

这里,动画序列和指定的要移除的骨骼轨道(包括其子代)在应用修饰符后就完成了。

您可以将父类 设置为动画修饰符来创建蓝图,从而创建动画修饰符。

在您导入的任何动画上,可以前往动画修饰符部分,应用您创建的动画修饰符来移除骨骼变形。 

BringInAnimation_03.png

添加动画修饰符后,可以单击以应用修饰符。

对于仅保留曲线,您可以通过动画蓝图中的姿势资源运行动画,这样就会获得可以共享的曲线驱动姿势。在下文,我们将曲线驱动动画直接连接到最终动画姿势,但是没有使用这个姿势,因为它不知道如何处理曲线。然后我们将它连接到姿势资源以驱动这些曲线,让角色执行面部表情。 

每个角色都使用子动画蓝图和它们分配到的姿势资源,因此现在可以使用相对差量来共享面部表情。由于我们没有骨骼变形,动画完全是由曲线驱动的,因此我们看不到双重变形,可以将它与任何其他骨骼驱动的动画数据(例如全身动画)相混合。 

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback