如概述中所述,HIKEffectorSetStates 存储角色骨架中每个节点的反向运动学目标点,以及控制效应器对其相应节点的影响程度与它对角色骨架中其他关节的影响程度的一组参数。反向运动学解算器平衡所有效应器的位置、旋转和参数以构建包含角色最终姿势的新 HIKCharacterState。
每次调用反向运动学解算器时,首先需要使用角色节点的目标点以及每个效应器的 Reach、Pull 和 Resist 约束的相应值设置 HIKEffectorSetState。请参见反向运动学解算。
仅使用 HumanIK 重定目标解算器时,通常不需要使用平移、旋转和缩放值或使用约束值设置效应器,因为重定目标解算器已在内部完成。
如设定和检索 HIKCharacterState 中的数据中所述,HumanIK 在规格化空间内部运行:每个 HIKCharacterState 存储每个节点的旋转和缩放值,而不包含在角色默认 T 形站姿中针对相应节点包含的所有偏移。同样,HIKEffectorSetState 中包含的 IK 目标点也位于同一规格化空间。将 HIKEffectorSetState 提供给反向运动学解算器以便生成角色新姿势时,解算器期望 HIKEffectorSetState 中保存的旋转和缩放值已位于规格化空间中。同样,从 HIKEffectorSetState 中的效应器读取旋转和缩放值时,返回的值将会位于规格化空间中。
对于其相应节点没有角色默认 T 形站姿中的任何旋转或缩放偏移的效应器,此规格化空间与全局空间相同。对于这些效应器,可以在全局空间中将效应器的旋转值设置为角色肢体的所需方向。但是,对于其相应节点具有角色的默认 T 形站姿中的旋转或缩放偏移的效应器,在全局空间中设置和检索效应器的旋转和缩放值将不考虑角色 T 形站姿中的偏移,这可能会导致意外旋转目标。
如果要在全局空间(而非在 HumanIK 内部使用的规格化空间)中向效应器独占地提供旋转和缩放值,可以使用术语 CharacterSpace 标识的函数。例如,HIKGetCharacterSpaceEffectorStatefv()。使用这些函数之一设置效应器的旋转或缩放值时,将新值存储到 HIKEffectorSetState 之前先移除角色默认 T 形站姿中针对相应节点包含的偏移。同样,使用这些函数之一从 HIKEffectorSetState 检索旋转和缩放值时,向您返回值之前先重新应用默认 T 形站姿中包含的偏移。
可以为所有效应器使用这些 CharacterSpace 函数,无论 T 形站姿中是否包含针对相应节点的旋转或缩放偏移。但是,仅对于其相应节点包含 T 形站姿中的偏移的效应器,您才可以通过使用这些 CharacterSpace 函数来提高性能,因为这仅在需要时在规格化空间和全局空间之间执行转换。
为 HIKEffectorSetState 中的效应器提供规格化旋转和缩放偏移的另一种方法是,首先设置每个效应器的平移、方向和缩放,以匹配 HIKCharacterState 中包含的姿势(通常为从游戏引擎中派生出的角色的当前姿势)。然后,根据需要偏移效应器的平移、方向和缩放,以便角色根据需要到达特定道具或转换其肢体并将这些新值重新应用于 HIKEffectorSetState。从 HIKCharacterState 中包含的数据偏移效应器可确保您在将偏移应用于各个效应器时已在规格化空间中运行。