IK 设置

IKWithWithout.png

左侧图片,角色没有使用IK设置。中间的图片,使用IK将脚部放到一个小的碰撞对象上。右侧图片上,当角色碰到移动的障碍物时,使用IK来停止角色的用拳猛击动画。

概述

逆运动学(IK)提供了一种处理末端效应器位置处的关节旋转的方法,而不是通过直接的关节旋转处理。实际应用中,您提供一个效应器位置和IK解决方案,然后处理该旋转,以便最终的关节可以同那个位置保持高度一致。这可以用于将一个角色的脚部放到不平的地面上,并以其他方式同世界产生逼真的交互。

虚幻引擎使用2根骨骼的IK系统,这对于类似于手臂和腿这样的东西是非常理想的。

IK(逆向运动学) 和 FK(正向运动学)

如果您已经熟悉了IK的工作原理,那么你可以跳过阅读这个部分!

虚幻引擎中的大部分动画骨骼都是通过传入到角色或骨架网格物体的骨骼中的直接旋转数据驱动的。这可以认为是 正向运动学 ,或直接给关节或骨骼应用旋转。以下表格解释了这个概念:

diagram_FK.png

正如它的名称所预示的, 逆运动学 是从另一个方向工作的。这里,我们不是给骨骼应用旋转,而是给骨骼链一个目标(也称为 末端效应器 ),提供一个链条末端应该尝试到达的位置。用户或动画师移动该效应器,IK解决器(IK系统中驱动旋转的算法)旋转骨骼,以便链条中的最终骨骼在目标位置处结束。在以下的图片中,末端效应器由红色的叉指出。

diagramIK.png

在虚幻引擎4中,IK可以用于覆盖及扩展现有动画,使得角色或骨架网格物体的运动对它们的环境产生更多反应。

设置IK

有很多种给您的角色应用IK的方法,包括保持脚部或爪子根植于地面上、让角色抓住并紧握移动的对象。处于本文档的目的,我们将仅讲述最常见的设置: 将脚部放到不平的地面或楼梯上。

对于IK应用来说,其中一个较重要的注意事项是需要在几个不同的地方进行设置。从较高的层次讲,这些是:

  1. 处理效应器位置的设置。该设置通常在Pawn或角色蓝图中完成。

  2. 蓝图事件图表中的设置,以便从Pawn或角色取入效应器位置。这个设置用于IK解算器。

  3. 角色动画蓝图图表中针对2根骨骼IK节点的设置。

规划

和所有其他事情一样,在处理过程中需要进行一些规划。请确保您明确您需要让您的IK设置做 什么 。是针对角色的脚部的设置? 针对手部的设置? 在它们需要做出反应的地方它们要做什么? 如果您在早期就可以尽可能多地回答这些问题,那么设置就会越简单。幸运的是,通过使用虚幻引擎4的蓝图可视化脚本,后续添加功能将变得非常简单。

脚部放置IK设置

在第一个例子中,我们将概述地介绍在角色上设置简单IK来辅助它们把脚部放置在不平的地面上。

这个示例可以在Content Examples项目中找到。只需打开命名为Animation.umap的地图,并查找示例1.8即可。

Pawn 或 角色蓝图设置

第一部是设置Pawn或角色蓝图来正确地处理必要数据。这实质上意味着我们需要执行一些脚部跟踪,以便可以跟踪角色在出现某种障碍物时迈到其上面的时机。

请注意,在以下的示例中,添加了几个变量,这仅是为了简化蓝图中的连接,使得文档看上去不那么令人费解。这些变量在实际的 Content Example 项目中是不存在的。

构建脚本

角色蓝图的构建脚本实际上进设置了两个重要数据:

  1. 一个针对角色Z-高度的Scale(缩放比例)变量。

  2. 一个IKTraceDistance变量,它使用物理胶囊体一半的高度乘以上述的Scale所得的值。

点击图片来获得更大的视图或者右击并另存为

事件图表

对于该设置,事件图表实际上负责跟踪操作,它简单地投射光线穿过角色脚部,来查找某些障碍物。如果找到了某障碍物,那么它存储该距离,以便稍后可以在动画蓝图中使用它来移动该IK的效应器。

关于该图表,其中一个非常重要的点是自定义函数IKFoottrace的应用。该函数取入一个距离和插槽名称,使用这些数据作为基础来进行跟踪操作。然后它基于这些结果返回一个偏移量值,稍后会使用该值来偏移IK效应器的位置。

在该图片中,您可以看到IKFoottrace函数。点击图片来获得更大的视图或者右击并另存为

这里是事件图表。在上面函数的帮助下,您可以看到该实例的主要任务是执行左脚和右脚的跟踪。

这里是基本的事件图表。点击图片来获得更大的视图或者右击并另存为

这样处理的结果是,在每次游戏更新过程中,发生一次向下跟踪,查找碰撞点,这些碰撞点指出了要考虑的一些不平的地面。当发现碰撞点时,将到那个点的距离存储为IK偏移量,稍后会在动画蓝图上应用它。

IKTrace.png

在上面的图片中,绿色的钻石代表作为跟踪起始点的插槽的位置。红色的箭头代表跟踪本身。

动画蓝图设置

关于动画蓝图,我们要看的第一部分是事件图表。一般来讲,动画蓝图中的动画图表的主要作用是从其他源头(比如角色或Pawn蓝图)取入数据,然后将这些数据变换为动画图表中可以使用的变量更新。

事件图表

在这个示例中,我们要做的第一件事情是获得当前Pawn,然后确保将它类型转换为我们在其中进行所有设置的基于Pawn的类。这使得我们可以直接同那个Pawn蓝图的特定实例交互,并读取存储在它的变量中的数据。

通过使用Pawn蓝图中存储的IK偏移量数据,我们可以生成位置向量,稍后在IK效应器会应用它。

点击图片来获得更大的视图或者右击并另存为

动画图表

动画图表通过应用我们到目前为止进行的所有设置,并使用它来更新为角色创建的现有动画,从而结束了我们的设置过程。对于这个示例,动画图表是非常简单的,因为它实际上仅播放了一个动画。在大部分情况下, Play JumpingJacks 节点会被多个其他节点所代替,从而产生期望的运动。

比较重要的部分是将我们当前空间从局部空间切换到组件空间的地方。在角色上播放的所有动画都是在局部空间中完成的。这是计算它的最快方法,因为局部变换是相对于骨架层次结构中每个骨骼的父项的。然而,骨骼操作必须在组件空间中完成,比如应用2根骨骼的IK,操作是相对于根骨骼进行的。

由于这个原因,我们必须将数据从局部空间切换到组件空间的时间要足够长,以便执行我们的IK计算。同时,Final Animation Pose仅能取入 Local Space数据,所以一旦应用了该IK,我们必须转换回去。

关于动画的坐标空间的信息,请参照坐标空间术语

点击图片来获得更大的视图或者右击并另存为