使用矩阵设置和检索效应器数据

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

设置 HIKEffectorSetState 中的效应器数据

步骤 1. 构建数据块

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

  • HIKEffectorSetState 中每个效应器的矩阵,采用变换矩阵中介绍的格式。数据集内每个矩阵的偏移必须按 16 字节对齐。
  • 四个浮点值的数组,指示效应器的到达平移、到达旋转、Pull 和 Resist 约束的所需值。这些值必须介于 0.01.0 之间。

例如:

// first Node's data block 
// -- matrix data
{-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,
// -- constraint data
 0.5f, 0.5f, 1.0f, 0.0f},
// second Node's data block 
// -- matrix data
{-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,
// -- constraint data
 0.5f, 0.5f, 1.0f, 0.0f},
},
// third Node's data block 
...

步骤 2. 构建数据描述

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

  • 每个效应器的数据块内每个矩阵的偏移。该值通常为 0,除非每个数据块包含每个矩阵之前 HumanIK 未使用的自定义信息。
  • 每个效应器的数据块内约束数据的偏移。
  • 每个数据块的步幅或大小。由于每个矩阵都是 16 个浮点数组成的数组,且每个数据块包含四个浮点约束百分比,因此,此值通常等于 sizeof(float) * 20
  • 包含矩阵存储在数据集中的所有效应器的唯一 ID 的数组,按照这些矩阵存储的顺序。数组中的最后一个元素必须是特殊枚举值 HIKLastNode

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

例如:

int myUsedEffectors[] = {HipsEffectorId, 
                         LeftAnkleNodeId,
                         RightAnkleNodeId,
                         ...
                         RightFootPinkyEffectorId,
                         HIKLastNode
                         };
HIKEffectorDataDescriptionMatrix myDesc = {0,
                                           64,
                                           sizeof(float)*20,
                                           myUsedEffectors
                                           };

步骤 3. 将数据传递给 HumanIK

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

例如:

HIKSetEffectorStateData(lEffectorState,
                        &myDesc,
                        (void *)goalBuffer[frameId]);

从 HIKEffectorSetState 检索效应器数据

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