设置挤压与拉伸

设置挤压与拉伸需要配置一组用于定义角色弹性的角色特性,并使用必要的解算步骤设置 HIKEffectorSetState

步骤 1. 设置解算步骤

如果调用 HIKSetIKSolvingStep() 函数来设置 HIKEffectorSetState 中的解算步骤,必须在您为 HumanIK 解算器提供的 HIKEffectorSetState 中包括以下任意或所有步骤,具体取决于想要使用挤压与拉伸引擎处理哪些肢体。

有关 IK 解算步骤的详细信息,请参见解算所选身体部位

手臂和腿部

手臂和腿部的挤压与拉伸通过以下解算步骤来执行:

  • HIKSolvingStepRightArmSnS
  • HIKSolvingStepLeftArmSnS
  • HIKSolvingStepRightLegSnS
  • HIKSolvingStepLeftLegSnS

例如:

HIKSetIKSolvingStep(MyEffectorState, HIKSolvingStepAllParts |
                                     HIKSolvingStepLeftArmSnS | 
                                     HIKSolvingStepRightArmSnS);

请注意,这些解算步骤不包括在 HIKSolvingStepAllPartsHIKSolvingStepAll 步骤中。

脊椎和颈部

脊椎和颈部的挤压与拉伸分别通过 HIKSolvingStepSpineHIKSolvingStepHead 解算步骤来执行。

请注意,这些解算步骤包含在 HIKSolvingStepAllPartsHIKSolvingStepAll 步骤中。如果使用这些解算步骤中的任一步骤,无需明确指定 HIKSolvingStepSpineHIKSolvingStepHead 步骤。因此,会始终评估角色脊椎和颈部的挤压与拉伸,但是,除非还设置了脊椎或颈部的拉伸范围(如下面的步骤 3 中所示),否则不起作用。

步骤 2. 配置关节链的到达平移

要将挤压与拉伸引擎应用到关节链,必须将到达平移的正值应用到关节链末端的效应器。相关的效应器如下所示:

如果要执行反向运动学解算,必须在传递给反向运动学解算器的 HIKEffectorSetState 中设置此到达平移。请参见反向运动学解算

如果要执行重定目标,必须在传递给目标角色重定目标解算器的 HIKPropertySetState 中设置此到达平移。请参见重定目标解算特定于重定目标的特性

步骤 3. 配置关节链的拉伸范围

将到达平移应用到角色其中一个肢体末端的效应器时,HumanIK 会使用几种不同的策略以满足要求,并将相应的节点放置在所需位置。可以弯曲或拉直肢体(受制于可能为肘部和膝部配置的阻力),可以使用拉动引擎使身体的其他部位到达最终位置(如果拉动也应用到效应器),或者可以挤压与拉伸肢体。

反向运动学解算器使用一组角色特性来定义每个关节链的拉伸范围。此拉伸范围确定相对于其他策略(例如,拉动身体的其他部位),挤压与拉伸引擎应该对最终解的贡献。

使用以下角色特性为受挤压与拉伸影响的每个关节链单独配置拉伸范围:

要设置关节链的拉伸范围,请将相应的特性设置为所需的百分比。例如:

步骤 4. 配置关节链的自由度(可选)

可以配置 HumanIK 可以应用到每个关节链的最大挤压与拉伸量。此“自由度”由一组角色特性确定,这些特性针对手臂和腿部的解释方式与针对脊椎和颈部的解释方式不同。

此步骤标记为可选,因为涉及的角色特性具有预设的默认值。对于这些默认值,请参见常规特性下相应的特性描述。

手臂和腿部

手臂和腿部从不挤压得短于原始长度,它们只会拉伸。拉伸的自由度由两个百分比值确定:

  • 肢体可以开始拉伸以将其效应器置于所需位置时占原始长度的百分比。这通过 HIKStretchStartArmsAndLegs 角色特性来为手臂和腿部定义。
  • 肢体停止自由拉伸时占原始长度的百分比。这通过 HIKStretchStopArmsAndLegs 角色特性来为手臂和腿部定义。

这是一项软限制;为了避免“弹出”,肢体将超过该限制继续拉伸,到达远处的目标点。但是,一旦超出该阈值,应用到肢体的拉伸量将呈指数级递减。

要设置手臂或腿部的自由程度,请将每个特性设置为所需的百分比。例如:

HIKSetPropertyValue(MyPropertyState, HIKStretchStartArmsAndLegs, 0.96);
HIKSetPropertyValue(MyPropertyState, HIKStretchStopArmsAndLegs, 1.04);

脊椎和颈部

脊椎和颈部的自由度由您为每个节点指定的平移限制确定。这些限制将确定每个节点允许向其父节点挤压的最近距离,以及每个节点允许从其父节点拉伸的最远距离。这些限制将表示为从父节点原始平移的百分比值(即骨骼到每个节点的原始长度)。

可以通过调用 HIKSetTranslationLimitsf()HIKSetTranslationLimitsd() 函数,为脊椎或颈部中的每个节点设置这些限制。

例如:

f_minSnSTranslation = 0.92f;
f_maxSnSTranslation = 1.08f;
b_isActive = true;
HIKSetTranslationLimitsf(MyHIKCharacter, Spine1NodeId, f_minSnSTranslation, f_maxSnSTranslation, b_isActive);

脊椎子节点

可以配置反向运动学解算器,以反映脊椎子节点中应用到脊椎的压缩或伸展百分比。根据角色骨架的构造方式及其网格的蒙皮方式,这可能倾向于保留上半身的比例。

以下节点将受到影响:

从脊椎到这些子节点的挤压与拉伸传播由 HIKSnSScaleSpineChildren 特性确定。将此特性设置为所需的百分比,如下所示:

HIKSetPropertyValue(MyPropertyState, HIKSnSScaleSpineChildren, 0.6);

步骤 5. 配置关节链的缩放(可选)

默认情况下,挤压与拉伸解算器通过操纵节点的平移和旋转来更改角色肢体的长度。相反,可以配置反向运动学解算器,以通过更改肢体中节点的比例在肢体长度中应用某些或全部更改。根据角色的蒙皮,这有助于偏移由于挤压或拉伸导致的角色比例的更改。

反向运动学解算器使用一组角色特性来定义每个关节链的缩放百分比。

使用下列角色特性配置缩放:

要设置关节链的缩放值,请将相应的特性设置为所需的百分比。例如:

HIKSetPropertyValue(MyPropertyState, HIKSnSScaleArmsAndLegs, 0.4);