如果不需要 HumanIK 控制角色骨架中的某些关节,可以通过不解算这些关节的新位置来提高反向运动学解算器的性能。
例如,如果要编写一个使用 HumanIK 旋转角色髋部和上身以将武器瞄准玩家的控制器,可以跳过对角色的腿部和脚部进行 IK 解算。
有两种可能的方法可以向反向运动学解算器标识要解算的身体部位,详细介绍如下
必须先在 HIKEffectorSetState 中指定 IK 解算器应执行的解算步骤,才能直接或间接地通过重定目标解算器使用反向运动学解算器。要指定解算步骤,请调用 HIKSetIKSolvingStep() 函数,并提供 HIKSolvingStep 枚举中列出的任意一个或多个元素。
在反向运动学解算和重定目标解算下提供的示例中,调用了值为 HIKSolvingStepAll 的 HIKSetIKSolvingStep() 函数,这将激活所有解算步骤。但是,在调用 HIKSetIKSolvingStep() 函数时,可以仅指定 HIKSolvingStep 枚举中提供的一部分解算步骤,这会将反向运动学解算器配置为仅执行相应的计算。
例如,以下调用将反向运动学解算器配置为解算髋部以上的所有身体部位,而忽略髋部、腿部、脚部、滚动提取、地板接触以及挤压与拉伸。
HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepBodyPull | HIKSolvingStepLeftShoulder | HIKSolvingStepRightShoulder | HIKSolvingStepLeftArm | HIKSolvingStepRightArm | HIKSolvingStepLeftHand | HIKSolvingStepRightHand | HIKSolvingStepHead | HIKSolvingStepSpine);
HumanIK 反向运动学解算器分解为多个较小的函数,其中每个函数负责控制一组有限的角色关节,或执行整个 IK 过程中涉及的特定一部分计算。通过调用 HIKSolveForEffectorSet 函数调用反向运动学解算器时,会按顺序调用以下特定函数:
作为调用 HIKSolveForEffectorSet() 函数的备用方法,您可以单独调用各个函数。此方法主要用来充分利用辅助处理单元,以免由于内存限制而无法调用整个 IK 解算器。但是,也可以用作限制解算特定身体部位的备用方法,并适用以下限制:
反向运动学解算器在解算过程开始时执行 HIKSolvingStepBodyPull 步骤。此步骤会影响骨架中的所有关节。在解算器尽最大能力满足所有效应器的拉动设置后,它会继续执行其他活动解算步骤,以满足应用到这些活动解算步骤中涵盖的每个关节的效应器位置、旋转、到达平移 和到达旋转要求。
因此,使用上述方法之一让反向运动学解算器不予考虑某个关节链不一定意味着该关节链将与在原始 FK 动画中时完全一样。相反,这表示您放弃控制这些关节的最终状态,使其完全受指定给骨架中其他关节的 Pull 值支配。例如,角色手部的 Pull 值的可能会将角色的髋部、腿部和脚部拖到另一个位置,即使未明确对腿部和脚部执行解算。
如果想要控制为某个关节计算的最终位置,不论是将其固定到原始 FK 动画还是将其固定到场景中的某个特定位置,您都应为该关节启用 IK 解算,并相应地设置其 Reach、Pull 和 Resist 值,以便该关节能够按所需的平移和旋转进行放置。请参见概述下有关 Reach、Pull 和 Resist 的详细描述。