根骨骼运动

一般,在游戏动画中,角色的碰撞胶囊体(或其他形状)在场景中是通过控制器来驱动的。然后,使用该胶囊体的数据来驱动动画。比如,如果一个胶囊体正在向前移动,那么系统知道要在角色上播放一个跑动或走动的动画,来呈现出角色正在靠自己的力量移动的效果。

然而,这种类型的运动并不适合于所有情形。在某些情形中,使用复杂动画来实际地驱动碰撞胶囊体是有意义的,而反过来则不行。这就是在您的游戏中根骨骼运动处理变得至关重要的地方。

比如,设想下,如果网格物体受到玩家的特殊攻击后,预设置网格物体产生向前猛击的动画。如果所有角色动作都基于该玩家胶囊体,那么这样的动画将会使得角色迈到胶囊体的外面,从而丢失碰撞。一旦播放完动画,玩家又会滑回到它们的碰撞位置。这是有问题的,因为胶囊体一般会被作为所有计算的中心。超出胶囊体之外的角色将会穿过几何体,不能对它们的环境做出适当的反应。另外,在动画结束时滑回到它们的胶囊体是不真实的。

对于这个概念的初学者来说,可能不能仅通过阅读一段介绍就能明白正确的根骨骼运动的重要性。下面,我们有个角色,它执行了预先设置好的攻击动画,向前猛击,然后向下抡动锤子。请注意,角色的向前移动的动画不是在游戏中处理的,是美术师那样设计的。

See the Animation Content Examples page under section 1.9 for another example of Root Motion.

根骨骼运动处理需要应用 AnimMontage 。如果您稍微熟悉一点这个资源,那么将是有用的。请参照 AnimMontage documentation 文档获得详细信息。

什么是根骨骼运动?

简单地讲,根骨骼运动是指角色基于骨架根骨骼动画的运动。大部分游戏中的动画都是通过循环处理的,在这里角色的根骨骼仍然是固定的。但正如我们在上面的例子中所看到的,并不总是这样的情形。要想处理这个问题,我们需要去除角色的根骨骼的运动,而是将将它应用到角色胶囊体上。这是UE4中根骨骼运动的精髓。

您可以在动画编辑器中可视化地查看动画的根骨骼的运动。只需简单地打开包含正在移动的根骨骼的任何动画,在视口中选择 Show(显示) > Bones(骨骼) 。您将注意到红色的线代表角色的根骨骼运动。这解释了动画的根骨骼运动。

RootMotionBone.png

一旦我们将该动画应用给AnimMontage(动画蒙太奇)(稍后将在本文中处理的东西),我们将可以启用Root Motion Translation(根骨骼平移)和Rotation(旋转)。完成这个处理后,角色的根骨骼将不会再从它的原始位置开始移动。在该图片中,我们已经在角色上启用了Root Motion(根骨骼运动)。注意,我们处在和上面的图片一样的框架中,但是角色的位置发生了改变。

RootMotionAppliedBone.png

那么,这是什么意思哪? 由于系统正在考虑角色动画的根骨骼运动,所以稍后就可以将那个同样的运动重新应用给角色的碰撞胶囊体。这意味着,角色仍然可以具有动画设计师期望的完全一致的运动效果,但是它也可以在游戏中对碰撞、其他物理及游戏事件做出正确的反应。在下面的部分中,我们将看到这个额处理的运作效果。

启用 Root Motion

Root Motion can be enabled inside the Anim Asset Details panel of Persona for your Animation Sequence .

RootMotion.png

Early versions of the engine (Versions previous to 4.5) required the use of an Animation Montage to define Root Motion. Since version 4.6, Root Motion is now handled per Animation Sequence and can be toggled on/off in the animation's properties in Persona. For networked games however, Root Motion still requires the use of an Animation Montage, see Root Motion from Montages Only below.

While defining if Root Motion is enabled in done inside the Animation Sequence, you will still need to determine how that sequence is handled inside of an Animation Blueprint . There are several different ways in which you can handle Root Motion within Animation Blueprints. You can define this through the Root Motion Mode drop down menu inside the Anim Blueprint Editor inside Persona.

RootMotionMode.png

Make sure that you are setting this inside the Edit Defaults tab and not the Edit Preview.

The options are as follows:

Property Description
No Root Motion Extraction Root Motion is left as is (applied to the root bone).
Ignore Root Motion Root Motion is extracted (and removed from the root bone), but not applied to the character.
Root Motion from Everything See Below.
Root Motion from Montages Only See Below.

Root Motion from Everything

When this option is set as the Root Motion Mode, each animation asset (AnimSequence, Blendspace, AnimMontage, etc.) that contributes to the final character pose has its Root Motion extracted (if it has been set as containing Root Motion). Each piece of extracted Root Motion is blended based on the weight of the source assets contributing to the pose.

For example:

FromEverything.png

In the image above, the Root Motion of Jog_Loop_Fwd_RM and Jog_Loop_Right_RM would each be blended together with a weight of 0.5. The resulting animation in this case is a character running diagonally forwards and right across a map.

Root Motion from Montages Only

This method is intended for network games which is the reason for its more restricted functionally. Because Root Motion from Everything is designed to be unrestricted, it is recommended that it only be used in games where animation isn't replicated over a network.

运作中的根骨骼运动

下面详细介绍了没有处理根骨骼动画导致的问题以及根骨骼运动对您的动画的好处。我们将使用上面的向前猛冲动画。

没有根骨骼运动

没有根骨骼运动,该动画将会使得角色脱离它的胶囊体,正如下面所示。注意,出现了难看的迅速返回到胶囊体位置处的情形。这之所以发生是因为,一旦该完成播放该动画,角色控制器就会把它拉回到它的原始位置处。

点击进行播放

为什么角色同胶囊体分离是糟糕的情形

在这个实例中,快速回退问题不是唯一要解决的问题。因为角色离开了碰撞包围框,它穿过了世界中的对象,打破了整体的连续性。在这个示例中,我们可以看到角色的攻击行为使得它穿过了墙壁,然后又跳了回来。

点击进行播放

根骨骼运动处理如何解决这个问题

一旦您的动画设置为使用根骨骼运动,那么动画师临时设置的运动就变成了该胶囊体的驱动力。这使得我们可以继续从动画的结束处继续播放。您可以看到,我们第二次触发攻击时,我们从新的位置处开始的。当然,我们首先要转个身,以便我们不会脱离相机。

点击进行播放

根骨骼运动和物理

由于胶囊体保持同步,这意味着物理碰撞仍然可以使用,从而我们就解决了角色穿透墙壁的问题,同时缓解了角色需要快速返回到胶囊位置处的问题。在下面的图片中,动画使用了Root Motion(根骨骼运动),这使得胶囊体和角色可以保持同步,从而使得角色和墙壁产生碰撞,而不是穿过墙壁。

您将会注意到,这并不是非常完美,因为角色的弯腰动画使它在某种程度上穿过了墙壁。然而,这个可以通过处理墙壁或角色上的碰撞体积来解决。较重要的一点是,胶囊体和运动保持同步,从而防止角色径直穿过墙壁又必须立即返回的情形。

点击进行播放

设置根骨骼运动

根骨骼运动处理需要应用 AnimMontage 。如果您稍微熟悉一点这个资源,那么将是有用的。请参照 AnimMontage documentation 文档获得详细信息。

UE4中设置根骨骼运动非常简单。从较高的层次讲,这个过程包括:

  1. 将需要根骨骼控制的动画分配给一个AnimMontage资源。

  2. 在那个AnimMontage中,确保命名包含该运动的插槽。

  3. 同时在AnimMontage,确保选中 Enable Root Motion TranslationEnable Root Motion Rotation 属性。

  4. 在动画图表中,确保动画连入通过一个 Slot(插槽) 节点,且将给Slot节点分配和AnimMontage的插槽一样的名称。

  5. 在动画蓝图的事件图表中播放您的AnimMontage。

在本文档中,我们将介绍如何设置上面的示例来应用根骨骼运动。

设置概述

对于初学者来说,我们简单地有一个基本的第三人称角色。这个角色实际上是第三人称角色模板的衍生物,该模板可以在UE4的项目模板中找到。唯一的特殊添加物是我们将设置一种特殊情形,在这里,按下R键将播放我们抡锤子的动画。没有代码来将它变成一次攻击,它不施加伤害。它仅是我们播放需要根骨骼运动的动画的一种方法。

有很多种进行这种设置的方法,我们将概述介绍一种方法,然后主要针对设置Root Motion(根骨骼运动)。

我们的设置从自定义的GameMode蓝图、PlayerController蓝图、角色蓝图及动画蓝图开始。我们使用一个蓝图接口来将一个事件从角色发送到动画蓝图中。这里是具体的详细介绍:

  • GameMode(游戏模式) - 决定Controller 和Pawn类,分别是我们的自定义的PlayerController和角色蓝图

  • PlayerController(玩家控制器) - 仅设置几个属性。这和第三人称模板中包含的玩家控制器一样。

  • Character(角色) - 这里我们设置静态网格物体组件、相机及输入处理。

  • Animation Blueprint(动画蓝图) - 该项处理我们角色动画的状态。

  • BlueprintInterface(蓝图接口) - 用于将一个事件从我们的角色蓝图发送到动画蓝图中。这是我们触发AnimMontage的方法。

所以,我们首先要在BlueprintInterface中创建一个函数。在我们的示例中,我们命名该函数为 UseHammer 。它没有输入或输出,它仅是简单地用于产生事件。

UseHammerFunction.png

接下来,在角色蓝图中,我们设置了如下的特殊网络。注意,第三人称控制的处理已经存在了,我们仅是专注于我们让抡锤子动画正常工作所需的处理。在这个示例中,我们设置了一个输入事件,以便当我们按下 R 时,我们在接口上调用 UseHammer 事件。

PressRUseHammer.png

注意, Get Anim Instance 节点的应用。这确保我们同适当的动画蓝图实例通信,对于我们把函数发给适当的对象是至关重要的。

接下来,在动画蓝图中,我们首先要确保实现我们的接口。

ImplementedInterface_AnimBP.png

现在,仍然是在动画蓝图中,我们在事件图表中为我们的函数调用设置一个简单的事件。

UseHammerFunctionCall.png

现在我们可以设置AnimMontage了。

建立AnimMontage

由于根骨骼动画是在AnimMontage中处理的,所以需要创建一个AnimMontage。完成这个处理的最简单方法是,右击需要根骨骼运动的动画,并选择 Create AnimMontage(创建动画蒙太奇)

CreateAnimMontage.png

命名您的AnimMontage,然后双击它来在角色编辑器中打开它。在编辑器的中心处,靠近下方,您可以看到一个SlotName域。为这个插槽输入一个有意义的名称。如果这是将要一同播放的一组动画的一部分,那么您应该选择那个名称。常用的插槽名称是 FullBody ,这就是我们所使用的名称。

SettingUpSlotinMontage.png

在离开我们的AnimMontage之前,请确保选中 Anim Asset Details(动画资源详细信息) 面板中的 Enable Root Motion Rotation 复选框。默认情况下,当我们查看AnimMontage时,动画资源详细信息面板位于角色编辑器界面的左下角。

EnableRootTranslation.png

接下来,我们返回到动画蓝图。在创建完我们的UseHammer函数事件之后,我们现在可以创建一个 Montage Play 。我们需要确保把这项和适当的AnimMontage关联到一起。

PlayMontage.png

我们就快要完成设置了! 最后,我们仅需要确保我们的插槽在我们最终的动画中计算。在动画蓝图中,我们需要跳转到AnimGraph选卡。创建一个 Slot 节点,将它的名称设置为您的AnimMontage中的插槽使用的名称。在我们的示例中,该名称是 FullBody 。该插槽要作为任何现有状态机或其他动画同您的Final Animation Pose间的中间人。

InsertSlotNode.png

这些就是全部的工作了! 现在您的动画通过AnimMontage进行播放,该蒙太奇设置为使用根骨骼运动,这样一切都可以正常工作了!

点击进行播放