個別の TQS 値を使用してノード データを設定および取得する

次の手順では、各ノードのトランスレーション、クォータニオン回転、およびスケール値を表す別々の数値配列を含むデータ セットを使用して、HIKCharacterState で複数のノードのデータを設定および取得する方法を説明します。

HIKCharacterState にノード データを設定する

別々のトランスレーション、クォータニオン回転、およびスケール値を含むデータ セットからノードの状態を設定するには、下で概説されている手順に従ってください。

手順 1. データ ブロックを構築します

16 バイトでアラインされたメモリ バッファに、各ノードに対する次の項目を格納します。

  • グローバル スペースでのノードのトランスレーションを定義する 4 つの浮動小数点数。
  • グローバル スペースでのノードの向きを定義する 4 つの浮動小数点数であり、クォータニオンで表示されます。
  • グローバル スペースでのノードのスケールを定義する 4 つの浮動小数点数。

下に表示されている各項目は、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 バイトでアラインされる必要があります。
  • ストライド、または各データ ブロックのサイズ。各データ ブロックには、4 つの浮動小数点数の 3 つの配列が含まれるため、データ ブロックに HumanIK によって使用されない追加のカスタム情報が含まれる場合を除き、この値は通常は sizeof(float) * 12 と同等です。
  • マトリックスがデータ セットに格納されるすべてのノードの一意のノード 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 リファレンスで各関数の説明を参照してください。