使用矩阵设置和检索节点数据

下列步骤说明了如何使用数据集设置和检索 HIKCharacterState 中多个节点的数据,该数据集包含单个变换矩阵来表示每个节点的平移、方向和缩放值。

设置 HIKCharacterState 中的节点数据

要从包含矩阵的数据集设置节点状态,请遵循下面概述的步骤。

步骤 1. 构建数据块

在按 16 字节对齐的内存缓冲区中,将每个节点的矩阵存储在遵循变换矩阵中介绍的格式的 HIKCharacterState 中。此矩阵是每个节点所需的唯一信息;因此,每个矩阵通常自己代表一个数据块。

数据集内每个矩阵的偏移必须按 16 字节对齐。

例如:

// first Node 
{-45.95f, 87.81f, -205.81f, 0.0f, 
 -0.54f, 0.0f, -0.05f, 0.83f,
 0.16f, 0.16f, 0.16f, 1.0f,
 -36.91f, 85.10f, -203.83f, 0.0f},
// second Node 
{-36.91f, 85.10f, -203.83f, 0.0f,
 -0.39f, 0.57f, -0.40f, 0.58f,
 0.16f, 0.16f, 0.16f, 1.0f
 -37.17f, 47.86f, -218.01f, 0.0f},
// third Node 
...

步骤 2. 构建数据描述

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

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

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

例如:

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

步骤 3. 将数据传递给 HumanIK

调用 HIKSetCharacterStateTransform() 函数,将数据集中包含的变换矩阵应用于 HIKCharacter

例如:

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

从 HIKCharacterState 检索节点数据

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