设置脚和手接触需要配置您为 HumanIK 解算器提供的 HIKPropertySetState 和 HIKEffectorSetState,如以下各部分中详述。
脚部和手部接触在您为 HumanIK 解算器提供的 HIKPropertySetState 中进行启用和配置。
要启用脚部接触,请将 HIKFootFloorContactId 特性的模式设置为 HIKModeOn。
要启用手部接触,请将 HIKHandFloorContactId 特性的模式设置为 HIKModeOn。
HIKSetPropertyMode(MyPropertyState, HIKFootFloorContactId, 1); HIKSetPropertyMode(MyPropertyState, HIKHandFloorContactId, 1);
地面接触引擎最重要的配置选项是用于对角色脚部和手部进行建模的接触类型。有关这些接触类型的详细信息,请参见接触类型。
要设置角色脚部的接触类型,请将 HIKFootContactTypeId 特性的值设置为以下值之一。
要设置角色手部的接触类型,请将 HIKHandContactTypeId 特性的值设置为以下值之一。
HIKSetPropertyValue(MyPropertyState, HIKFootContactTypeId, 3.0f); HIKSetPropertyValue(MyPropertyState, HIKHandContactTypeId, 1.0f);
根据所选择的接触类型,还必须配置一组辅助特性,用于确定定义角色脚部和手部的标记的放置。尽管 HumanIK 为这些特性提供了一组默认值,仍然建议您设置更适合模型大小和形状的值。有关需要为所选接触类型设置哪些辅助特性的详细信息,请参见接触类型下有关不同接触类型的描述。
例如,将角色的脚部配置为使用 Normal 接触类型时,必须设置以下特性:
HIKSetPropertyValue(MyPropertyState, HIKFootBottomToAnkleId, 12.0f); HIKSetPropertyValue(MyPropertyState, HIKFootBackToAnkleId, 3.0f); HIKSetPropertyValue(MyPropertyState, HIKFootMiddleToAnkleId, 11.7f); HIKSetPropertyValue(MyPropertyState, HIKFootFrontToMiddleId, 6.9f); HIKSetPropertyValue(MyPropertyState, HIKFootInToAnkleId, 3.4f); HIKSetPropertyValue(MyPropertyState, HIKFootOutToAnkleId, 5.1f);
如果正在使用 HumanIK重定目标解算器,则需要为目标角色设置用于在目标角色接触类型中放置脚部/手部标记的所有脚部/手部尺寸。对于源角色,必须仅设置 HIKFootBottomToAnkleId 特性;上面列出的其他脚部/手部尺寸特性不从源角色中读取。
启用并配置了角色的脚部和手部接触之后,也可以为您向 HumanIK 解算器提供的 HIKPropertySetState 中的角色的脚趾和手指启用和配置地板接触。
脚趾和手指接触通常仅用于具有由 HumanIK 控制的包含独立关节的脚趾或手指的角色,并且通常与 Normal 脚部或手部接触类型结合使用。
要启用脚趾接触,请将 HIKFootFingerContactId 特性的模式设置为 HIKModeOn。
要启用手指接触,请将 HIKHandFingerContactId 特性的模式设置为 HIKModeOn。
HIKSetPropertyMode(MyPropertyState, HIKFootFingerContactId, 1); HIKSetPropertyMode(MyPropertyState, HIKHandFingerContactId, 1);
一旦定义了角色脚部和手部响应与地板或其他定向平面接触的方式后,必须定义 HumanIK 针对每只脚和每只手应考虑的平面的实际位置和方向。每只脚和每只手的平面位置存储在您为 HumanIK 解算器提供的 HIKEffectorSetState 中,并在其中单独进行维护。
要为地板接触引擎设置定向平面,请为每个肢体调用 HIKSetEffectorFloorStatefv() 函数。此函数需要以下参数:
HIKSetEffectorFloorStatefv(MyEffectorState, HIKLeftFootFloor, matrix); HIKSetEffectorFloorStatefv(MyEffectorState, HIKRightFootFloor, matrix);
或者,也可以使用 HIKSetEffectorFloorStateTQfv() 函数,该函数接受两个由四元浮点数组成的数组,其中包含定向平面上任意点的平移和旋转。
const float transform[] = {35.1f,0.9f,276.7f,1.0f}; const float rotation[] = {0.4f,0.0f,1.3f,1.0f}; HIKSetEffectorFloorStateTQfv(MyEffectorState, HIKLeftFootFloor, transform, rotation); HIKSetEffectorFloorStateTQfv(MyEffectorState, HIKRightFootFloor, transform, rotation);
设置地板接触的最后一步是激活 HIKEffectorSetState 中的地板接触解算步骤。
如果调用 HIKSetIKSolvingStep() 函数来设置解算步骤,必须包括 HIKSolvingStepContact 和 HIKSolvingStepContactApprox 步骤。这些步骤包含在 HIKSolvingStepAll 中,因此仅使用 HIKSolvingStepAll 即可。例如:
HIKSetIKSolvingStep(MyEffectorState, HIKSolvingStepAll);
有关 IK 解算步骤的详细信息,请参见解算所选身体部位。