反向运动学 (IK) 是一种常见的计算机动画技术,用于高效地使角色移动并与其环境进行逼真的互动。为角色创建逼真的运动过程通常需要对各种关节进行多次迭代和微调。使用 IK,您可以通过调整单个对象来对多个角色部件进行姿势和动画设置。
这种动画技术可以为以下示例提供解决方案:
IKControl
您可以使用 IKControl 在 动画编辑器 之外为角色模型程序性地添加 IK。Studio 允许您以编程方式将 IK 应用到所有角色,以在游戏中创建逼真的运动和互动。
在添加 IKControl 时,请正确设置 必需属性,以避免意外和不自然的动画结果。与所有动画一样, 测试您的 IKControls 以确保您实现所需的行为。
必需属性
在将 IKControl 添加到角色的 Humanoid 或 AnimationController 时,您必须设置以下必需属性以启用 IK:
| 属性 | 描述 |
|---|---|
| Type | 指定 IK 控件的行为类型。有关行为选项的列表,请参见 Enum.IKControlType。常见的行为类型有 Position 或 Transform。 |
| EndEffector | 您角色模型中的 BasePart 或 Bone,它跟踪指向 Target。例如,您可以将 LeftHand 骨骼设置为 EndEffector,以到达设置为 Target 的门把手对象。 |
| Target | EndEffector 到达或指向的对象。Target 可以是任何具有世界位置的对象。 |
| ChainRoot | 定义 IKControl 影响的 BaseParts 或 Bones 的链条。所有连接的部件在 ChainRoot 和 EndEffector 之间都受到 IKControl 的影响,使用定义的行为类型。 例如,如果您角色的 LeftHand 设置为 Target,您可以通过将 ChainRoot 设置为 LeftUpperArm 来对整个左臂应用 IK。要仅对肘部以下的部件应用 IK,请将 ChainRoot 设置为 LeftLowerArm。 |
测试 IKControls
您可以通过编程或直接通过 资源管理器 添加和编辑 IKControl。您甚至可以在 Play 测试期间添加和更改 IKControl,以快速检查各种属性如何影响角色的运动。
要使用 Attachment 作为目标快速测试您的 IKControl:
从 Studio 的中层, 启动游戏测试。
单击角色模型的 HumanoidRootPart 旁边的 ⊕ 图标并添加一个 Attachment。

选择 Attachment,并使用 移动 工具将对象放置在角色前方的视口中。

在 资源管理器 窗口中,选择角色的 Humanoid 旁边的 ⊕ 图标并添加一个 IKControl。

选择 IKControl,并在 属性 窗口中设置以下属性值:
- 类型:从下拉菜单中选择 Transform。
- 目标:在 资源管理器 中选择新创建的 Attachment 对象。

IKControl 属性 
资源管理器 - 角色模型 您角色的左臂现在应该可以伸向目标 Attachment。您可以尝试移动 Attachment 或编辑 IKControl 属性以获得不同的结果。
添加约束
您可以使用 Constraints 来限制关节在到达目标时的移动方式。约束可以确保肘部和膝盖等关节自然弯曲,或使机械关节以特定方向旋转。


要使用 IKControl 为角色添加约束,您的 IKControl 和约束必须满足以下条件:
- 约束和 IKControl 共享相同的父级 Model。
以下说明描述了添加 HingeConstraint 以限制角色肘部的旋转,并添加 BallSocketConstraint 到手腕以限制旋转角度的过程。
肘部
具有 R15 骨架 的角色已经在其关节中包含了附件,您可以使用这些附件来应用肘部约束。对于肘部,LeftUpperArm 和 LeftLowerArm 都包含一个 LeftElbowRigAttachment。除了添加约束外,您还需要在每个部件的 LeftElbowRigAttachment 中添加额外的子附件,以指定肘部可以围绕哪个轴旋转。
要添加 HingeConstraint 和子附件:
在 资源管理器 窗口中,找到您模型的 LeftLowerArm 并单击 ⊕ 按钮。
添加一个名为 LeftElbowConstraint 的 HingeConstraint。
在 资源管理器 窗口中,导航到 LeftUpperArm.LeftElbowRigAttachment 并添加一个附件:
单击 ⊕ 按钮 添加一个名为 LeftElbowConstraintAttachment0 的 Attachment。
在视口中选择该附件,并使用 旋转工具 旋转附件,使黄色 PrimaryAxis 成为肘部预期旋转的轴。

将 LeftElbowConstraint.Attachment0 属性设置为此新附件。
在 资源管理器 窗口中,导航到您模型的 LeftLowerArm.LeftElbowRigAttachment 并添加一个附件:
- 单击 ⊕ 按钮 并添加一个名为 LeftElbowConstraintAttachment1 的 Attachment。
- 将 LeftUpperArm.LeftElbowConstraint.Attachment1 属性设置为此新附件。
- 复制 LeftElbowConstraintAttachment0.CFrameOrientation 属性并将其粘贴为 LeftElbowConstraint.Attachment1.CFrameOrientation 值。

测试您的 IKControl 以验证肘部仅围绕其铰链轴旋转:
手腕
即使有肘部约束,IKControl 仍然可能在手腕处产生不现实的姿势。

您可以通过添加 BallSocketConstraint 来限制手腕的旋转,从而改善这一点。虽然这与为肘部添加 HingeConstraint 的过程类似,但您可以在此约束上使用 LimitsEnabled 属性来进一步控制手腕的运动范围。
要为手腕添加 BallSocketConstraint:
- 在 资源管理器 窗口中,找到您模型的 LeftHand 并单击 ⊕ 按钮。
- 添加一个名为 LeftWristConstraint 的 BallSocketConstraint。
- 找到您模型的 LeftLowerArm.LeftWristRigAttachment 并添加一个附件:
- 单击 ⊕ 按钮 并添加一个名为 LeftWristConstraintAttachment0 的 Attachment。
- 在视口中选择该附件,并使用 旋转工具 旋转附件,使黄色 PrimaryAxis 指向模型的指尖。

- 将 LeftWristConstraint.Attachment0 属性设置为新的 LeftWristConstraintAttachment0。
- 找到您模型的 LeftHand.LeftWristRigAttachment 并添加一个附件:
- 单击 ⊕ 按钮 并添加一个名为 LeftWristConstraintAttachment1 的 Attachment。
- 复制 LeftWristConstraintAttachment0.CFrameOrientation 属性并将其粘贴为 LeftWristConstraintAttachment1.CFrameOrientation 属性。
- 将 LeftWristConstraint.Attachment1 属性设置为此新 LeftWristConstraintAttachment1。
- 在 资源管理器 窗口中,选择 LeftWristConstraint。
- 在 属性 窗口中,设置以下内容:
- 启用 LimitsEnabled。
- 将 UpperAngle 设置为 80。这控制约束的轴可以旋转的角度,80 度大约是手腕应该能够弯曲的角度。
- 根据您的角色,您可能希望调整锥体指向的方向。您可以使用 旋转工具 来旋转约束的 Attachment0。
选择 LeftWristConstraint 时,会出现一个绿色锥体,显示手腕的运动范围。

设置好约束后,测试 IKControl,手指指向角色前方,手腕应该更逼真地旋转和弯曲。