Metlivi 博客

移动角色身体时如何让 IK 脚部目标保持固定

要让 IK 脚部保持固定,在移动角色身体控制器时,让每个脚部目标的世界位置保持不变。让腿部求解器调整移动的身体与固定目标之间的关节。如果目标会继承身体的移动,就分离这种变换关系,或在 IK 求解前进行补偿。

本指南适用于摆姿势的创作者:他们操作的是绑定好的虚拟角色,希望身体可以上下起伏、倾斜或移动,同时双脚保持原位。以下工作流程结合了有文档说明的变换与 IK 行为,以及实用的诊断步骤;Unity 和 Godot 的术语提供了具体的参考。

2026年10月29日阅读约需 7 分钟作者:Metlivi Editorial Team
第 1 节

为什么脚部目标会跟着身体移动?

目标的局部坐标即使没有变化,也仍可能在场景中移动。局部变换描述的是对象相对于父级的位置,因此移动祖先节点也会改变子节点的世界变换。Godot 通过 transform 和 global_transform 说明了这一区别。使用 3D 变换 — Godot Engine

先显示脚部目标控制器,并将身体稍微向一侧移动。观察目标和可见的脚部,注意区分两者。如果目标跟着身体移动,请检查它的祖先节点:它可能位于骨盆、身体控制器或其他会移动的组之下。

不要只根据局部位置字段来判断设置是否正确。记录移动前后目标的世界位置。这样可以区分两个重要问题:目标是否偏离了预定位置,还是腿部没有跟随静止的目标?

第 2 节

身体控制器和脚部控制器应如何组织?

为身体运动和固定的脚部目标使用独立的控制分支。一种实用的结构是将骨架和身体控制器放在一个分支中,将左右脚部目标放在另一个分支中,并置于一个静止的场景控制器之下。关键是,你操作的身体控制器不能移动目标分支。

整体角色控制器仍可包含这两个分支,只要你移动的是它下方的身体。但移动这个整体控制器时,两个分支都会移动。选择控制器之前,先确定你的操作是“让身体在固定的双脚上方移动”,还是“移动整个角色”。

如果应用程序支持独立设置变换继承,也可以采用这种方式。例如,Godot 的 Node3D.top_level 属性会让节点停止继承其父级的变换。这是有文档说明的变换功能;它本身不会配置 IK 求解器。Node3D — Godot Engine

更改目标的父级或继承模式时,要保留目标当前的世界姿态。先记录其世界位置和朝向,再更改关系,然后恢复该姿态。在再次移动身体前,先验证结果。

第 3 节

如果目标必须位于会移动的父级之下,该怎么办?

单独保存固定的世界姿态,并根据父级当前的变换计算目标所需的局部姿态。位置的关系为:目标局部位置 = 当前父级世界变换的逆 × 已保存的目标世界位置。Unity 通过 InverseTransformPoint 提供从世界空间到局部空间的转换。Transform.InverseTransformPoint — Unity

来看一个仅涉及平移的示例。目标固定在世界 X = 1.0 的位置,父级起初位于 X = 0.0。因此它的局部 X 坐标为 1.0。将父级移动到 X = 0.3 后,目标的局部 X 坐标需要变为 0.7,才能继续保持在世界 X = 1.0 的位置。如果局部 X 仍为 1.0,目标就会移动到世界 X = 1.3。

这个减法只适用于简化示例。父级发生旋转或缩放时,需要进行完整的变换转换。Unity 的 TransformPoint 会将局部位置转换到世界空间,并明确包含缩放,因此位置转换应使用点操作,而不是方向操作。Transform.TransformPoint — Unity

脚部进入固定状态时,保存固定姿态。在身体移动期间重复使用这个已保存的值。如果目标继承移动后才重新保存,就会把偏移当作新的参考位置。如果朝向也必须保持不变,请同时保存并转换目标的朝向和位置。

第 4 节

如何配置腿部 IK,使其跟随目标?

在测试大幅度姿势变化前,先检查求解器的骨链分配。在 Unity Animation Rigging 1.4.1 中,Two Bone IK 使用 Root、Mid 和 Tip 变换、一个 Target,以及可选的 Hint。对于由两段骨骼组成的简单角色腿,这些分别对应大腿关节、膝关节和脚踝关节。Hint 用来控制弯曲方向。Two Bone IK — Unity Animation Rigging

初次测试时,将约束影响权重和目标位置影响权重都设为最大。单独检查目标的旋转影响权重。Unity 将它们作为不同的权重参数,因此可以分别测试位置跟随和朝向匹配。它的 Maintain Target Offset 设置会保留脚尖与目标之间初始的位置或旋转差值。Two Bone IK — Unity Animation Rigging

启用约束前,将目标对齐到预定的脚踝姿势。如果你有意设置偏移,请记录它代表什么。初始偏移含义不明,会让之后难以比较目标与求解后关节的位置。

用 Hint 或 pole 控制器确定预期的膝盖弯曲方向,然后小幅移动身体。在整个测试过程中,让 Hint 的摆放位置清晰易懂;如果同时改变目标、身体和弯曲控制器,就更难判断意外结果的原因。

第 5 节

双脚保持固定时,身体最多能移动多远?

目标固定并不意味着身体的所有位置都可达。对于不受关节限制且不会拉伸的理想两段式骨链,几何上要求腿根到目标的距离在 |上段长度 − 下段长度| 和 上段长度 + 下段长度 之间。实际关节限制可能会缩小这个范围。

以一条示例角色腿为例,两段长度均为 0.45 个场景单位,几何上的最大可达距离为 0.90 个单位。如果髋部比脚踝目标高 0.80 个单位,水平距离为 0.30 个单位,两者之间的距离就是 √(0.80² + 0.30²),约为 0.854 个单位,仍在理想范围内。若将水平距离增至 0.50 个单位,距离约为 0.943 个单位,就超出了这个范围。

用这个计算来区分可达范围问题和变换问题。如果目标保持固定,但骨链无法到达,就减少身体的位移,或调整身体位置以适应双腿。分别评估每条腿:向侧面移动可能让一条腿更接近目标,同时让另一条腿离目标更远。

首次测试时,让双腿都保持明显的弯曲,并进行小幅度移动。检查每条腿是否接近可达范围极限之后,再逐步扩大身体的运动范围。将这个范围视为特定绑定的结果,而不要照搬其他角色的位移数值。

第 6 节

如何让整只脚保持固定,而不只是脚踝?

先明确对你的绑定来说,“固定”意味着什么。静止的脚踝目标可以固定关节位置,但脚部还需要预定的朝向。脚底接触点和脚踝转轴是不同的参考点;放置控制器时,要保留它们之间经过设计的偏移。

一个有用的诊断方法是保持脚踝位置不变,只旋转身体。观察脚跟和脚尖。如果它们绕着脚踝移动,请检查脚部的朝向控制器和任何独立的脚趾控制器。这个测试能将可见的接触效果与目标位置区分开来。

将预定的固定朝向与位置一并保存。在身体移动期间,将两者都与已保存的姿态进行比较。Godot 的变换文档解释了变换如何由原点和表示朝向及缩放的基底组成,这有助于理解完整姿态。使用 3D 变换 — Godot Engine

第 7 节

如何按固定顺序诊断滑动问题?

将以下顺序作为基于上述变换和求解器行为整理的实用诊断辅助方法。一次只改变一个条件,从能够复现问题的最小身体位移开始。

观察结果 首先检查 接下来采取的操作
目标跟着身体移动 会移动的祖先节点和继承的变换 分离控制分支,或恢复已保存的世界姿态
目标保持固定,脚踝却没有到达目标 骨链分配、位置影响权重和可达范围 验证设置,然后减小身体位移
脚踝保持固定,脚跟或脚尖却在移动 脚部朝向和接触偏移 恢复预定的固定朝向
膝盖突然改变弯曲方向 Hint 或 pole 的位置 在身体小幅移动时测试弯曲控制器
拖动和播放时的结果不同 哪个系统在何时写入各个控制器 在播放期间检查求值后的变换

对于动画或程序化设置,使用明确的依赖顺序:先确定身体姿势,再恢复或转换已保存的目标,然后求解腿部 IK。确认应用程序如何安排这些操作。仅凭回调名称,无法确定求解器是否会在同一轮求值中读取更新后的目标。

最后进行一段简短的循环测试:将身体向侧面移动、下压、稍微旋转,然后返回起始姿势。整个过程中,将每个目标的世界姿态与其已保存的参考姿态进行比较。目标保持固定后,剩下的调整就会很具体:身体的可达运动范围、膝盖方向的一致性,以及维持预期接触所需的脚部朝向。

第 8 节

来源

相关阅读

继续探索这个主题