Notifications
Article
Unity 2D Inverse Kinematics资源包使用指南
Published 6 months ago
268
0
我们已经介绍过Unity 2D Animation资源包,你可能对新的Unity 2D Inverse Kinematics(反向动力学)资源包能为项目加入哪些功能感兴趣。
本文将介绍Inverse Kinematics反向动力学的基本概念和在Unity中的设置方法。

获取资源包

Unity 2D Inverse Kinematics目前作为独立的编辑器资源包推出,和Unity 2D Animation资源包一样,我们可以通过Package Manager资源包管理器进行安装。

反向动力学基础概念

为了理解反向动力学,我们首先需要知道反向动力学和正向动力学的区别,正向动力学表示在世界空间中手动移动和旋转骨骼到理想位置的常见过程。反向动力学的方法是获取骨骼Transform的链,然后使用算法来移动Transform,使最后的骨骼尽可能靠近特定目标的位置。
反向动力学是多种动画场景中的一种便利工具。例如:我们可以通过使用反向动力学,在凹凸不平的表面确保角色的脚部保持在地面上,或者模拟角色抓取对象的效果。在设计动画循环或构建动画循环的原型时,我们也可以使用反向动力学来轻松定位骨骼。
本文将从介绍2D Animation资源包时使用同一个绑定的维京人精灵开始。为了在骨骼绑定上使用反向动力学,我们首先向层级窗口中最高层级的对象添加IK Manager 2D组件。
在本示例中,绑定的精灵游戏对象还带有Sprite Skin组件,或者我们也可以将该组件附加到绑定的根骨骼。加入IK Manager 2D组件后,我们可以使用组件下方的“+”按钮和“-”按钮来添加和移除对象使用的不同IK解算器。

添加IK解算器

继续下一步前,首先简要介绍以下本文将使用的反向动力学相关术语,以确保我们对这些术语有着相同的理解。
IK链(IK Chain)表示具有嵌套关系的骨骼分组,它将受到IK算法的影响。例如,骨骼链可以是角色的手臂或腿部,但骨骼链不仅限于肢体,骨骼链可以跨越任何数量的骨骼,包括从最远端骨骼到根部骨骼。例如:你可以使手臂的骨骼和角色脊梁部分包含在一条骨骼链上。
效应器(Effector)是终点骨骼,或称为IK链最后的子对象。IK算法的目的是让效应器尽可能靠近目标,例如:在精细的骨架上,效应器可以是手部骨骼或手指骨骼。
目标点或目的点表示在执行算法后,效应器应该到达的世界空间目标位置。例如:如果你想让角色握住武器对象,你可以使用武器对象的位置作为目标点。
我们需要决定自己的用例中最合适的IK解算器。在这种情况下,IK解算器(IK Solver)指的是用于在IK链旋转骨骼的算法,直到效应器到达目标位置或耗尽迭代次数。我们可以使用多种不同的IK算法,也可以自己编写算法。默认情况下,Unity的IK资源包提供三种常用解算器,以便轻松设置IK。
首先,我们拥有CCD或循环坐标下降解算器。这是游戏最常用的IK算法。它通过迭代骨骼链上的所有骨骼进行工作,从骨骼链的效应器部分开始,它会对每个骨骼执行旋转,使效应器尽可能接近目标点,直到效应器到达目标点或用完允许的最大迭代次数。
设置CCD解算器,我们需要先添加该解算器到IK Manager组件。然后在层级窗口,我们会看到精灵对象新增了一个“New CCDSolver2D”子对象。我们可以配置该对象的行为,并设置它会影响的骨骼。
下面我们将演示如何添加IK到维京人角色的手臂上。
我们选中手臂链最末端的骨骼,在层级窗口单击右键并选择Create Empty,创建空白Transform对象。新对象会自动成为该骨骼的子对象。我们可以点击Transform辅助图示并将其移动到手部骨骼的末端。该对象会同时被用作目标点和效应器。
现在选中新创建的CCD解算器时,我们会发现几个需要设置的属性。首先,要设置Target字段和Effector字段来指定目标对象和效应器对象。我们可以将刚创建的空白游戏对象设置到Target字段。该对象将作为IK链的末端Transform对象,在角色的手部骨骼末端朝目标旋转。
下一步,为IK解算器指定合适的链长度(Chain Length)。一旦拖动该属性的滑块,我们会注意到骨架上出现了黄色的辅助图示,表示链的组成部分。
本示例的链长度为4,骨骼链包含手部末端的Transform、手部骨骼以及手臂骨骼的上半部分和下半部分。对链长度满意后,我们可以单击Create Effector按钮,自动生成表示IK链将到达的Transform位置。
这样就设置好了。我们现在可以使用维京人手部的新IK辅助图示来修改目标点,IK解决方案会相应地变化。
我们可以注意到CCD解算器上还有其它设置,包括:
Iterations (迭代):该设置确定在到达目标点前,算法可以处理的最大迭代次数。请注意,大多数解算器是迭代算法,因此我们需要设置限制,以应对无法到达目标点的情况。
如果在运行时使用IK,我们需要使用较小的迭代次数。如果只将IK用于在动画中定位,在录制动画时,我们可以根据需要尽可能提高迭代次数。
Tolerance (容差):该属性确定效应器和目标点之间的最大可容许距离。
Velocity (速度):该属性确定算法每次迭代时旋转的执行强度。通常情况下,Velocity值越大,到达目标点的速度越快。
Weight (权重):该属性确定IK解决方案的总体强度,它受到IK Manager组件中全局权重设置的影响。
如果我们不希望让角色手部末端随IK一起旋转,只想使手腕定位在特定点,我们可以在Target字段设置手部骨骼,并以此创建效应器。然后取消勾选Constrain Rotation 复选框来手动定位骨骼,或旋转效应器进行定位。
2D IK资源包拥有另一种IK解算器,称为Limb 解算器,它在为Humanoid角色设置动画时非常实用。该解算器由CCD算法修改而来,被限制为使用3个Transform的骨骼链。
Limb解算器适用于定位肢体,拥有“翻转”IK结果的选项,以避免肢体的关节朝错误的方向弯曲;但是,Limb解算器的可自定义选项没有CCD算法的多。
我们还有FABRIK解算器,FABRIK是前向和后向到达的反向动力学(forwards and backward reaching inverse kinematics)的英文首字母缩写。
该算法首先沿着骨骼链进行向后传递,从目标点的效应器开始,然后从层级窗口最高的骨骼向前传递,在向后传递期间,将正确长度应用到获得的点。
通常FABRIK解算器到达目标的迭代次数比CCD解算器的少,但如果骨骼链应用了旋转限制,FABRIK解算器每次迭代的速度比CCD解算器慢。
如前所述,你可以编写自定义2D解算器,并基于资源包的现有解算器进行构建。更多相关信息,请查看GitHub上的文档:
https://github.com/Unity-Technologies/2d-animation-samples/blob/master/Documentation/2DIK.md
请注意,如果二个不同解算器影响着一个或多个相同骨骼,IK优先级将由IK Manager组件中安排的解算器顺序决定,靠近列表顶部的解算器拥有最高优先级。
即使移除了IK解算器,对象也不会回到默认位置,除非你在动画中给它们设置关键帧,所以移除解算器具有一定破坏性。
如果你想撤销IK解决方案的影响,在解算器组件中有Restore Default Pose选项,它可以恢复骨骼到IK应用前的位置。单击该选项后,你就可以安全地移除IK解算器。

在动画中使用IK

如果想在动画剪辑中使用IK,在更改动画剪辑时,IK效应器的位置会作为关键帧添加到动画中,这样做的前提是,效应器是设置动画主游戏对象的子对象。
我们可以在开始时为所有IK效应器添加关键帧,但如果想在之后移除关键帧,则需要对受到效应器修改的骨骼设置关键帧,这样才能移除IK。
通过这种方法,我们可以将骨骼的Transform保留在正确的位置。但要注意,骨骼会以不同的方式到达Transform位置,因为此时动画帧上没有使用IK解决方案,除非在每一步都添加关键帧。
现在我们已经可以使用Inverse Kinematics资源包处理自己的动画。二个2D资源包的功能可以完美地结合使用。你可以随意进行实验,通过自己的方法利用IK。
下图是给IK效应器附加碰撞体后实现的示例效果。

资源下载

2D IK库有使用IK的相关信息,还包含了最新的文档。你可以了解该工具的API,以及如何编写IK解算器。在2D 示例库中,你还可以找到多个可用示例项目,它们将展示本文介绍的工作流基础内容。
2D IK库:
https://github.com/Unity-Technologies/2d-animation-samples/blob/master/Documentation/2DIK.md
2D示例库:
https://github.com/Unity-Technologies/2d-animation-samples

小结

我们希望看见你使用Unity最新推出的这些资源包创作出精彩的2D游戏。Unity 2D开发挑战赛12月18日就要截止了,希望参加的开发者不要忘记参赛提交你的作品。
更多Unity功能介绍,尽在Unity官方中文论坛(UnityChina.cn)!
Unity China
576
Comments