使用单独 TQS 值设置和检索效应器数据

下列步骤说明了如何使用数据集设置和检索 HIKEffectorSetState 中多个效应器的数据,该数据集包含单独数值数组来表示每个节点的平移、方向、缩放和 IK 约束值。

设置 HIKEffectorSetState 中的效应器数据

步骤 1. 构建数据块

在按 16 字节对齐的内存缓冲区中,存储每个节点的以下项目:

  • 四个浮点数,定义全局空间中效应器的平移。
  • 四个浮点数,定义全局空间中效应器的方向,表示为四元数。
  • 四个浮点数,定义全局空间中效应器的缩放。
  • 四个浮点数,分别定义效应器的到达平移、到达旋转、Pull 和 Resist 约束值。这些值必须介于 0.01.0 之间。

上面列出的每一项必须按 16 字节对齐。

这些值不需要按照上面列出的顺序排列,例如,缩放值可以在平移值的前面。

例如:

// first Effector 
//----translation values------\\  //---orientation values---\\ //----scaling values----\\
{-45.95f, 87.81f, -205.81f, 0.0f, -0.54f, 0.0f, -0.05f, 0.83f, 0.16f, 0.16f, 0.16f, 1.0f,
//--constraint values--\\
 0.5, 0.5, 1.0, 0.0},
// second Effector 
//----translation values------\\  //---orientation values---\\ //----scaling values----\\
{-36.91f, 85.10f, -203.83f, 0.0f, -0.39f, 0.57f, -0.40f, 0.58f, 0.16f, 0.16f, 0.16f, 1.0f,
//--constraint values--\\
 0.75, 0.75, 0.5, 0.0},
// third Effector 
//----translation values------\\  //---orientation values---\\ //----scaling values----\\
{-37.17f, 47.86f, -218.01f, 0.0f, -0.21f, 0.66f, -0.24f, 0.67f, 0.16f, 0.16f, 0.16f, 1.0f,
//--constraint values--\\
 1.0, 1.0, 0.5, 0.25},
...

步骤 2. 构建数据描述

此数据描述必须是 HIKEffectorDataDescription 结构的一个实例。必须指定数据描述的以下项目:

  • 每个效应器的数据块内平移数据的偏移。此偏移必须按 16 字节对齐。
  • 每个效应器的数据块内方向数据的偏移。此偏移必须按 16 字节对齐。
  • 每个效应器的数据块内缩放数据的偏移。此偏移必须按 16 字节对齐。
  • 每个效应器的数据块内 IK 约束值的偏移。此偏移必须按 16 字节对齐。
  • 每个数据块的步幅或大小。由于每个数据块都包含四个浮点数组成的三个数组,以及约束值的四个浮点数,因此,此值通常等于 sizeof(float) * 16,除非数据块包含 HumanIK 未使用的其他自定义信息。
  • 包含矩阵存储在数据集中的所有效应器的唯一 ID 的数组,按照这些矩阵存储的顺序。数组中的最后一个元素必须是特殊枚举值 HIKLastNode

    此数组中还可以包含特殊值 HIKNotUsed,指示 HumanIK 跳过相应数据块。

例如:

int myUsedEffectors[] = {HipsEffectorId, 
                         LeftAnkleNodeId,
                         RightAnkleNodeId,
                         ...
                         RightFootPinkyEffectorId,
                         HIKLastNode
                         };
HIKEffectorDataDescription myDesc = {0,
                                     16,
                                     32,
                                     48,
                                     sizeof(float)*16,
                                     myUsedEffectors
                                     };

步骤 3. 将数据传递给 HumanIK

调用 HIKSetEffectorStateDataTQS() 函数,将数据集中包含的平移、旋转、缩放和 IK 约束值应用于 HIKCharacter

例如:

HIKSetEffectorStateDataTQS(lEffectorSetState,
                           &myDesc,
                           (void *)goalBuffer[frameId]);

从 HIKEffectorSetState 检索效应器数据

要使用单独数值数组从 HIKEffectorSetState 检索效应器数据以获得每个效应器的平移、四元数旋转和缩放值,必须遵循前面的使用单独 TQS 值设置和检索效应器数据中介绍的类似过程,不同之处在于: