重定目标解算

以下部分概述了在每个帧上将源角色的当前位置投影到目标角色所需的过程。

步骤 1. 更新源 HIKCharacterState

在每一帧上调用重定目标解算器时,必须提供来自原始正向运动学动画的源角色的当前位置。在初始化阶段为源角色创建的 HIKCharacterState 中提供该当前姿势。

HumanIK 提供了多个选项,用于同步 HIKCharacterState 的节点与游戏引擎中角色关节的当前 FK 位置和旋转。有关所有可用选项的详细信息,请参见设定和检索动画数据

一种常用方法是,在 HIKCharacterState 中对每个节点调用 HIKSetNodeStateTQSfv() 函数。此函数需要以下参数:

例如:

HIKSetNodeStateTQSfv (MySrcCharacter, MySrcCharState, RightHandNodeId,
                                                      myModel.GetTrans(RightHandNodeId),
                                                      myModel.GetQuatRot(RightHandNodeId),
                                                      myModel.GetScale(RightHandNodeId)}

步骤 2. 设置 IK 解算步骤

反向运动学解算过程分为若干个步骤,其中每个步骤计算选定关节链的新位置、约束(例如 Pull)的效果或者特殊变换(例如地板接触(请参见脚和手接触)或挤压和拉伸(请参见使用挤压和拉伸))的结果。

要确定将在重定目标解算器调用反向运动学解算器时执行的解算步骤,请调用 HIKSetIKSolvingStep() 函数。此函数接受两个参数:

例如:

HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepAll);

可以指定 HIKSolvingStep 枚举中列出的多个解算步骤,方法是将这些步骤与 | 运算符(按位或)连接。例如:

HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepBodyPull |
                                      HIKSolvingStepLeftShoulder |
                                      HIKSolvingStepLeftArm |
                                      HIKSolvingStepLeftHand);

也可以将解算步骤设置为 0,以实际跳过 IK 解算过程。

步骤 3. 设置目标角色特性

通过更改为目标角色创建的 HIKPropertySetState 中的配置设置,您可以控制 HumanIK重定目标解算器。例如,可以配置多个角色节点的 Reach、Pull 和 Resist 设置。有关 HIKPropertySetState 中可用的配置选项以及如何设置这些特性的详细信息,请参见角色特性特定于重定目标的特性

源角色的 HIKPropertySetState 仅用于检索特性 HIKFootBottomToAnkleId,这是反向运动学解算器在调整源角色高度以适应目标角色时所需的特性。仅当您使用脚接触(请参见脚和手接触),且在源角色和目标角色默认的 T 形站姿中,两者的踝部与地板的距离不同时,才需要为源角色指定这一设置。

步骤 4. 启动解算器

要启动 HumanIK重定目标解算器,请调用 HIKSolveForCharacter() 函数。此函数需要以下参数:

例如:

HIKSolveForCharacter (MyTargetChar, MyTargetCharState, MySrcChar, MySrcCharState, 
MyEffectorSet, MyTargetPropertySet, MySrcPropertySet);

重定目标解算器按如下步骤进行处理:

  1. 将源角色的 HIKCharacterState 中的所有节点的方向复制到目标角色的 HIKCharacterState 中。
  2. 设置您提供的 HIKEffectorSetState。这一步主要包括设置每个效应器的 Reach、Pull 和 Resist 值,以匹配目标角色的 HIKPropertySetState 中 Reach、Pull 和 Resist 角色特性值。请参见特定于重定目标的特性
  3. 调用反向运动学解算器在目标角色的 HIKCharacterState 上执行 IK 过程。该过程应用最初在目标角色的 HIKPropertySetState 中提供的 Reach、Pull 和 Resist 设置,并且执行地板接触等其他任何特殊效果。

步骤 5. 检索目标 HIKCharacterState

重定目标解算器将其为目标角色生成的姿势存储在作为参数为该角色传入的同一 HIKCharacterState 中。必须在此 HIKCharacterState 中检索每个节点的平移、方向和缩放,然后将其应用回游戏引擎角色。

HumanIK 提供了许多选项,用于在 HIKCharacterState 中检索节点的三维位置、旋转和缩放。有关所有可用选项的详细信息,请参见设定和检索动画数据

检索为角色计算的姿势的一种常用方法是,在 HIKCharacterState 中对每个节点调用 HIKGetNodeStateTQSfv() 函数。此函数需要以下参数:

例如:

const float trans[4];
const float quatRot[4];
const float scale[4];
HIKGetNodeStateTQSfv (MyCharState, RightHandNodeId, trans, quatRot, scale); 
... // apply retrieved values back to game engine here 

由您决定是否将检索到的每个节点的值重新应用回游戏引擎中角色的相应关节。