使用单独 TQS 值设置和检索节点数据

下列步骤说明了如何使用数据集设置和检索 HIKCharacterState 中多个节点的数据,该数据集包含单独数值数组来表示每个节点的平移、四元数旋转和缩放值。

设置 HIKCharacterState 中的节点数据

要从包含单独平移、四元数旋转和缩放值的数据集设置节点状态,请遵循下面概述的步骤。

步骤 1. 构建数据块

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

  • 四个浮点数,定义全局空间中节点的平移。
  • 四个浮点数,定义全局空间中节点的方向,表示为四元数。
  • 四个浮点数,定义全局空间中节点的缩放。

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

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

例如:

// first Node 
//----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},
// second Node 
//----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},
// third Node 
//----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},
...

步骤 2. 构建数据描述

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

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

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

例如:

int myUsedNodes[] = {HipsNodeId, 
                     LeftHipNodeId,
                     RightHipNodeId,
                     ...
                     RightFootPinkyDNodeId,
                     HIKLastNode
                     };
HIKDataDescriptionMatrix myDescription = {HIKGlobalSpace,
                                          0,
                                          16,
                                          32,
                                          sizeof(float)*12,
                                          myUsedNodes
                                          };

步骤 3. 将数据集传递给 HumanIK

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

例如:

HIKSetCharacterStateTransformTQS(lCharacter,
                                 lCharacterState,
                                 &myDescription,
                                 (void *)gSrcAnimTQS[frameId]);

从 HIKCharacterState 检索节点数据

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

替代函数

可以使用以下函数作为 HIKSetCharacterStateTransformTQS()HIKGetCharacterStateTransformTQS() 的替代函数。这些函数全都接受前面详细介绍的相同参数,但读取或写入数据的方式略有不同。

有关其他详细信息,请参见 API 参考中对每个函数的描述。