大多数动画是通过将骨架中的关节角度旋转到预定值来生成的。子关节的位置根据父关节的旋转而改变,因此可从父关节包含的各个关节的角度和相对位置来确定关节链的终点。这种构建骨架的方法被称为前向运动学(Forward Kinematic, FK)。
然而,从相反视角看待构建关节的任务通常很有用:在空间中选择一个位置后,向后找到一种有效的关节定位方法,使终点落在该位置。如果您希望角色触摸位于用户选定位置的对象或让角色的双脚牢牢扎入不平坦的表面,这种方法可能很有用,此方法称为逆向运动学(Inverse Kinematic, IK)。
在团结引擎中,除了支持原生的 IK 使用之外,还扩展了额外两种使用方式:
TRig 资产:针对通用角色进行定制化的 IK 绑定;
TIK 系列组件:任意角色均可以使用的简易 IK 后处理。
接下来将分别介绍这两种方式。
TRig 资产储存了用于重定向的骨骼链信息,绑定的 IK 求解器组和预设的 IK 目标,用于动画重定向(与 TRetargeter 资产结合使用)和 Play Mode 下的 IK 求解。
要生成 TRig 资产,请执行以下方式之一:
在 Project 界面下,可以通过右键 Create -> TRig 创建资产。创建后,在 TRig Inspector 界面中绑定 Generic Avatar。如果先选中 Avatar,再右键创建资产则会自动绑定。
在 TRig Inspector 界面下你可以查看绑定的相关信息,其中只有绑定的 Avatar 能够被修改,其余均为只读信息,想要修改这些内容需要进入 TRig Configuration。绑定的 Avatar 一旦被修改其余信息将会被清空,因此此处修改时会有提示如下。如果不慎操作失误,可以通过 Undo 撤回。
Avatar Rig Tab 下可以通过点击 Create New TRig 按钮直接创建绑定了该 Avatar 的空 TRig 资产,默认名称为 “{角色名}_TRig.tRig”,引擎中也会默认将后缀 “.tRig” 的文件视为一个 TRig 资产。
NOTE:一个 Generic Avatar 可以关联多个 TRig 资产,但是一个 TRig 资产只会绑定一个 Generic Avatar。
可以通过双击 TRig 资产或者在 TRig Inspector 中点击 Configure TRig 按钮进入 TRig 编辑界面。在 Avatar Rig Tab 下也列举了与该 Avatar 相关联的所有 TRig 资产,可以点击 Configure 进行跳转。编辑界面如下:
该编辑界面主要包含了三个部分:Hierarchy 界面、Scene 界面和 Inspector 界面,下面分别详细介绍。
Hierarchy 界面的右侧会被遮盖,“Character Root” 标明模型根节点。模型骨骼的右侧会显示其所在的骨骼链名称,IK目标的右侧则会显示其绑定的骨骼名称。若名称较长被遮挡,可以通过修改 Skeleton Information Overlay 中的 Hierarchy Column Size 来调节宽度。
若想隐藏部分骨骼,可以在 Hierachy 界面下选中它们右键,点击 Toggle Active State,将他们设置为 Disable;或者勾选最左侧的眼睛图标,则不会在场景中显示。
在 Scene 界面下有一个 Skeleton Information Overlay,显示该模型的相关信息(骨骼数量、顶点数量、面片数量等等)。同时,也可以修改场景中一些可视化的设置,详细见下表。General Settings 右侧的旋转按钮可以恢复初始设置。
参数 | 说明 |
---|---|
Draw Goal | 绘制 IK 目标 |
Goal Size | 绘制 IK 目标的大小,可以根据角色的尺寸进行调整 |
Draw Bone | 绘制骨骼 |
Show All Bones | 默认情况下,Hierarchy 界面和 Scene 界面下均隐藏了挂载有 Renderer 的游戏对象,不会将其作为骨骼进行绘制。如果需要显示可以勾选该选项。 |
Bone Color | 骨骼绘制颜色 |
Chain Color | 骨骼链绘制颜色 |
Goal Color | IK 目标绘制颜色 |
Bone Display Mode | 可以选择显示全部骨骼还是只显示选中的骨骼 |
Hierarchy Column Size | Hierarchy 界面下右侧的显示信息宽度,如果骨骼(链)名称过长可以调整来避免遮盖 |
TRetarget Configuration 界面中的 Skeleton Information Overlay 与 TRig Configuration 界面中相似,但可以针对源模型或目标模型单独应用。对于骨骼比较复杂的模型,开启 Draw Bone 会极大影响性能,如果不需要可视化骨骼可以选择关闭。
在团结引擎中,动画重定向是基于骨骼链匹配的机制。TRig 中的骨骼链用于建立动画重定向中的骨骼对应关系,但如果您仅需进行 IK 求解,可以忽略这一部分。
用户可以通过右下角的 +/- 按钮新增/删除骨骼链,并设置每个骨骼链的名称、起始骨骼、终止骨骼和 IK 目标(假如存在)。
对于类人形的角色,可以点击 Auto Generate 按钮自动生成,如果选择 Auto Generate (Exclude Fingers) 则不会生成手指相关的骨骼链。自动生成的骨骼链不会覆盖原来设置的骨骼链,如果需要清空骨骼链可以点击 Clear 按钮。
当骨骼链的设置符合要求时,最左侧的状态为绿色,否则为红色。
正确设置 | ![]() |
---|---|
错误设置 | ![]() |
骨骼链的状态包括以下情况:
ChainState | 说明 |
---|---|
Valid | 有效的骨骼链 |
Duplicate | 骨骼链之间有重复 |
DuplicateName | 骨骼链名字重复 |
Missing | 缺失起始骨骼或终点骨骼 |
InvalidHierarchy | 骨骼链层级结构不符合链状结构 |
将鼠标悬浮在状态处会显示具体错误原因。
修改结束后记得点击右下角的 Apply 按钮进行应用,只有当所有的骨骼链都是符合要求的才能正确被存储,否则会弹出提示。
可以通过 Revert 按钮撤销所有修改。如果退出该场景的时候存在未应用的修改,也会弹出提示窗口,进行二次选择 Apply 按钮或者 Revert。
成功修改的骨骼链在 Scene 界面中会以不同的颜色呈现,骨骼链的显示颜色可以在 Skeleton Information Overlay -> General Settings -> Bone Color/ Chain Color 进行修改。
在 Hierarchy 界面下创建的位于角色根骨骼下的所有非骨骼游戏对象均被视为 IK 目标(即除了父节点为空的游戏对象外,所有非骨骼游戏对象均视为 IK 目标)。除了手动创建游戏对象外,部分求解器的右键菜单中也提供了自动生成目标的选项。在场景中点击 IK 目标会优先选择该游戏对象而不是该位置上的骨骼。
可以在 Inspector 界面下修改该目标所绑定的骨骼,以及它的默认位移和旋转。如果该目标的父节点是一个骨骼,则会初始化将其绑定到该骨骼上。
选中 IK 目标后,Inspector 界面中会出现对应的 IK Goal Settings,可以修改目标的相关设置。
选项 | 说明 | 示例 |
---|---|---|
Target Bone | 绑定的目标骨骼。 | |
Shown In Scene | 影响 Scene 窗口下场景中目标是否可见,这个功能可以用于具有层级关系的目标组,或者隐藏不用于求解器 IK 目标。 | ![]() |
Default Offset Position/Rotation | 可以修改目标的默认位置和旋转,默认情况下目标的位置相对于目标骨骼是不变的,但是可以通过修改这个值,使得初始位置发生变化。右键 IK Goal Settings 有菜单选项 Set Current Transform 和 Reset Transform,方便进行设置。 | ![]() |
可以通过右下角的 +/- 号按钮来增加/删除 IK 求解器,目前支持以下求解器:
求解器 | 对应 TIK 组件 | 说明 |
---|---|---|
OverrideTransform | TOverrideTransform | 作用于单个骨骼对象 |
TwoBoneIK | TTwoBoneIK | 作用于三关节骨骼链 |
ChainIK | TFABRIK | 作用于超过三个关节的骨骼链 |
FullBodyIK | TFBIK | 实验性功能效果不稳定,作用于任意骨骼模型 |
IK 求解器的部分设置不会在 IK 重定向过程中生效,譬如:
TwoBoneIK 的 Hint Goal
OverrideTransform 中非 Global Space 的设置。
IK 求解过程会根据该顺序依次执行求解器,可以拖动求解器来修改求解器的求解顺序。当 IK 目标绑定上 IK 组件的时候,会跟对应的骨骼绑定在一起。
部分求解器组件右键可以进行快速设置,以 TwoBoneIK 为例,只需要设置好 End Bone,即可以点击 Auto Setup From End Bone 一键完成设置,完整的骨骼链和 IK 目标会被自动生成。
求解器组件修改后可以勾选 Live Display 来预览效果,可以实时地拖动 IK 目标。在 IK 求解器组上方有几个按钮提供了一些便捷操作:
按钮 | 说明 |
---|---|
Auto Setup IK | 自动生成 IK 求解器组,目前提供两种形式: (1)Standard IK Setup:使用 TwoBoneIK 或者 ChainIK 配置四肢 (2)Experimental FullBodyIK:使用实验功能组件 TFBIK 配置全身。 |
Display All | 开启所有求解器的预览效果 |
Undisplay All | 关闭所有求解器的预览效果 |
Reset Goals | 恢复所有 IK 目标的初始位置 |
Reset Pose | 恢复角色骨骼初始位置 |
Lock Pose On/Off | 默认情况下,角色姿势只会被通过 IK 修改,如果想手动修改姿势,需要设置 Lock Pose Off |
修改结束后,不要忘记和骨骼链一样通过 Revert 和 Apply 按钮来撤销和应用修改。
团结引擎中结合 AnimGraph 来实现运行时的 IK。AnimGraph 提供了 AnimationIKNode 节点来对动画添加 IK 效果,该节点可以关联 TRig 资产,在运行时修改 IK 目标的相关设置。可以在在添加 IK Node 后的 AnimGraph Inspector 界面关联 TRig 资产,也可以直接将 TRig 资产拖入图中自动生成 IK Node。
当 IK 节点的 Input 为空时,它将以对应 Avatar 的默认姿势作为输入姿势,它也可以使用 Clip 节点或者任意的动画流作为输入。
选择 IK Node 后,可以在 AnimGraph Inspector 界面下开放 IK 目标的位置或旋转,每一个端口会自带一个权重端口,这些端口可以通过连接 Parameter Node 来动态地设置。对于开放的位置端口,可以在 AnimGraph Inspector 窗口内设置对应的目标位移或旋转坐标系,默认下为世界空间(Global),也可以修改为角色空间下相对于目标骨骼的相对空间(Relative)。
在 TRig 的求解中,我们提供了一部分的 IK 求解器,这一部分的求解器也能够被作为组件进行使用,用于简易快捷的 IK 功能。目前可以单独作为组件的有以下求解器:
IK 组件的更新流程如下,FixTransforms 会用默认变换还原骨骼姿势,在进行了动画更新后再更新 IK 求解作为后处理。用户如果想通过脚本设置目标可以将代码放在 LateUpdate 中。
可以通过 Add Component 添加求解器,使用右键菜单中的 Move Up/ Down 来调整组件的位置来修改多个求解器之间的优先级,越上方的求解器将优先进行求解。
用户也可以通过 Enable/ Disable 组件来控制特定 IK 是否启用。
在 Play Mode/ Live Dipslay 开启状态下,通常用户不能修改 IK 组件里绑定骨骼对象,因为修改这些对象往往涉及重新初始化,但可以修改其他允许被修改的参数。
当 IK 组件内的设置不符合条件时,会有警告提示。不符合条件的 IK 不会进行求解计算。
对于有些求解器,骨骼的初始状态会影响求解的结果(例如 TTwoBoneIK)。可以将模型先修改到期望的姿势后,右键组件标题栏选择 Re-initialize 进行手动初始化。
每个 TIK 组件的第一个选项均为 Live Display,该选项勾选后会在场景下展示求解结果,如果设置有错误则不显示,Play Mode 下无法勾选该选项。
最基础的双骨骼(三关节) IK 求解器,同时也包含了对中间骨骼的 Hint 目标求解,其中 Hint 目标为可选项。该方法与原 Unity 内置 IK 系统中的求解方式相同。
参数 | 说明 |
---|---|
Stretch | 骨骼的可伸缩比例。 |
Translation Weight | 目标位移权重。 |
Rotation Weight | 目标旋转权重。 |
Hint Weight | 中间关节 Hint 目标的影响权重。 |
选择末骨骼(End Bone)后,右键组件标题栏选择 Auto Setup From End Bone,组件将自动添加根骨骼和中间骨骼,并初始化默认的 Hint 目标和 IK 目标。
控制人形对象的朝向,分为头部、脊柱和眼睛的朝向。该方法与原 Unity 内置 IK 系统中的求解方式相同。
参数 | 说明 |
---|---|
Clamp Weight | 控制其他权重范围到 0~(1-ClampWeight) |
Body Weight | 身体(脊柱)朝向权重 |
Head Weight | 头部朝向权重 |
Eye Weight | 眼睛朝向权重 |
该组件调用 CCDIK(Cyclic Coordinate Descent Inverse Kinematics)来求解单链状骨骼的 IK 问题,是一种基于骨骼旋转的贪婪算法。可以与 TFABRIK 组件比较,选择效果更佳的进行使用。
可以通过点击 Bones 列表的 +/- 号按钮来添加/删除要进行求解的骨骼,每个骨骼的右侧可以调整其权重,权重会影响该骨骼在 CCDIK 求解过程中对结果的影响程度。
参数 | 说明 |
---|---|
Weight | IK 目标的位置权重 |
Tolerance | 判断提前退出迭代的条件 |
Max Iterations | 最大迭代次数 |
Use Rotation Limit | 是否使用旋转约束 |
Max Angle | 若开启旋转约束,每个骨骼的最大旋转角度不能超过该值 |
End Rotation Weight | 末骨骼旋转和 IK 目标旋转的权重 |
在 Bones 中添加根骨骼和末骨骼之后,右键组件标题栏选择 Auto Setup,组件将自动添加根骨骼到末骨骼之间的所有骨骼,并新增一个初始目标对象。
该组件调用 FABRIK(Forward and Backward Reaching Inverse Kinematics)来求解单链状骨骼的 IK 问题,是一种基于骨骼位移的贪婪算法。可以与 TCCDIK 组件比较,选择效果更佳的进行使用。
和 TCCDIK 组件一样,该组件通过点击 Bones 列表的 +/- 号按钮来添加/删除要进行求解的骨骼,但是不同的是 FABRIK 算法中不考虑单个骨骼的权重。
参数 | 说明 |
---|---|
Weight | IK 目标的位置权重 |
Tolerance | 判断提前退出迭代的条件 |
Max Iterations | 最大迭代次数 |
End Rotation Weight | 末骨骼旋转和 IK 目标旋转的权重 |
同 TCCDIK,在 Bones 中添加根骨骼和末骨骼之后,右键组件标题栏选择 Auto Setup,组件将自动添加根骨骼到末骨骼之间的所有骨骼,并新增一个初始目标对象。
该组件可以设置目标对单个骨骼的影响,该骨骼可以用于一对一或多对一的覆盖,也可以与其他链状 IK 求解器共同使用来实现更真实的全局效果。
Target 为要作用的目标,Sources 可以单个或多个,通过点击右下角的 +/- 号进行增加或删除。每个目标的右侧可以单独调节对应的权重,该权重会被归一化。
参数 | 说明 |
---|---|
Translation Weight | 目标平移的权重 |
Translation Weights | x, y, z 三个轴分开的目标平移权重,最终结果会与 Translation Weight 相乘 |
Rotation Weight | 目标旋转的权重 |
Translation Offset | 对最终结果应用一个平移上的偏移 |
Rotation Offset | 对最终结果应用一个旋转上的偏移 |
Maintain Offset | 是否保持原本目标和源对象之间的相对关系,有四个选项: (1) Position and Rotation:同时保持旋转和位移 (2) Position Only:只保持位移 (3) Rotation Only:只保持旋转 (4) None:均不保持 |
Mode | 如果目标骨骼只有一个,可以选择作用于目标骨骼的坐标系: (1) Direct:应用到目标的全局坐标系 (2) Relative:应用到目标的相对坐标系 |
Space | 如果选择应用到目标的相对坐标系,则可以进一步选择坐标系: (1) Global:相对源对象的全局坐标系 (2) Local:相对源对象的局部坐标系(如果源对象没有父对象则等同于 Pivot) (3) Pivot:相对源对象相对于目标的坐标系。 |
该组件使用迭代优化的方法来求解 IK 问题,适用于任意的树状/链状结构模型。提供了两种求解方式: * 阻尼最小二乘伪逆法(Pseudo-Inverse Damped Least Sqaures, PIDLS) * 基于位置的动力学(Position Based Dynamics, PBD)
后者计算速度更快效果更稳定,推荐使用后者。
使用该组件需要设置一个根骨骼(Root)和不限数量的 IK 目标,每一个 IK 目标需要绑定一个对应的骨骼。在 IK 目标的设置选框内,用户可以通过 Enable Translation/ Rotation 来开启或关闭是否启用目标位置和旋转,若启用,则可以修改对应的权重来控制目标和初始值之间的插值。
开启 Live Display 或者 Play Mode 下无法增加或删除 IK 目标。
添加约束需要添加对应的骨骼,可以设置的参数如下:
参数 | 说明 |
---|---|
Translation/Rotation Scale | 设置为 0.0 表示希望该骨骼的局部位移/旋转保持不变(仅用于 PIDLS 算法) |
Translation/Rotation Stiffness | 设置为 1.0 表示希望该骨骼的位移/旋转不参与迭代优化 (仅用于 PBD-Based 算法) |
X/Y/Z Axis Type | 设置对应X/Y/Z轴旋转的类型,具体分为: (1) Free:不设置约束; (2) Range Limited:约束在 MinMax 之间; (3) Frozen:约束保持不变。 |
Use Preferred Angles | 设置是否启用偏好角度,若启用,可以设置偏好角度作为求解的初始值。 |
参数 | 说明 |
---|---|
Solver Type | 求解器可以使用下列两种算法: (1) PIDLS (2) PBD-Based |
Iterations | 最大迭代次数 |
Pre Pull | 在求解之前根据目标的移动修改根节点位置。可以使用 TOverrideTransform 组件进行代替。 |
Freeze Root | 固定根的变换不会被迭代求解影响 |
Damping | 阻尼因子会影响结果的稳定性和收敛速率,数值越大越稳定但也会越慢收敛。 |
Translation/Rotation Strength | 骨骼平移/旋转的强度(仅用于 PIDLS 算法) |
Stretch Ratio | 拉伸倍率,设置为 0 为不允许拉伸(仅用于 PBD-Based 算法) |