データの設定と取得のワークフロー

HumanIK では、アニメーション データの設定や取得の際に、次に説明する 2 つの高レベルな手法を用意しています。

データをインタラクティブに設定または取得する

HumanIK では、HIKCharacterState の各ノードや HIKEffectorSetState の各エフェクタのトランスレーション、方向、スケールを設定したり取得するためのさまざまな関数を用意しています。複数の異なるノードやエフェクタのデータを設定したり取得するために、これらの関数のいずれかをノードまたはエフェクタごとに 1 度呼び出し、目的のノードやエフェクタそれぞれで繰り返すことができます。

この手法は概念的に単純で、特に少数のノードやエフェクタのデータを設定したり取得する場合に適しています。たとえば、1 つの四肢に目標点を割り当てる IK コントローラを記述している場合、これらの関数のいずれかを使用して対応するエフェクタのトランスレーションを設定することができます。ただし、ノードやエフェクタの数が多いデータの設定や取得(HIKCharacterState に格納されている解析結果を取得して、そのポーズをゲーム エンジン キャラクタに戻す場合など)は、この手法よりも次に説明するデータ セット手法を使用するほうが効率的です。

データ セットを使用してデータの設定や取得をする

関数を別々に呼び出して HIKCharacterState の各ノードや HIKEffectorSetState の各エフェクタのデータを設定したり取得する代わりに、複数のノードの状態を、データ セットと付属するデータ デスクリプションを使用して 1 度に同期させることができます。

この手法は一般に、上記で説明した繰り返し手法を使用するよりも速く、必要な関数の呼び出し数が少なくなるという長所もさらに備えています。ただし、この手法は、設定して実行するにはより高度なセットアップとメモリ管理が必要とされます。

データ セット

データ セットは、単一の連続したメモリのブロックで、複数ノードまたはエフェクタのトランスレーション、方向、スケールを保存できます。このデータ セットへのポインタは、16 バイト アラインである必要があります。

データ ブロック

データ セット内で、各ノードまたはエフェクタの情報が、個別のデータ ブロックに連続して格納されます。 最初のデータ ブロックには、1 つのノードまたはエフェクタに関連するデータがすべて格納されており、次のデータ ブロックには、次のノードまたはエフェクタの同様のデータが格納されています。各データ ブロックは、データ ブロック内のデータの各タイプのオフセットや合計サイズが全く同じになるように構成されなければなりません。(またはデータ ブロックの長さがしすべてのノードまたはエフェクタで完全に同じになっていなければなりません)。たとえば、あるノードのトランスレーションデータが 1 つのデータ ブロックで 32 バイトオフセットして配置されている場合、他のすべてのデータ ブックでも同じオフセットで配置されている必要があります。データ ブロック内のすべてのオフセットは、16 バイト アラインでなければなりません。

データ ブロックは、HumanIK で使用しない任意のデータを目的によって格納することもできます。

データ デスクリプション

各データ セットと共に、データ デスクリプションを用意する必要があります。データ デスクリプションは、データ セットのメモリ レイアウトを定義する構造です。つまり、ノードやエフェクタが定義されている順番(どのデータ ブロックがどのノード ID またはエフェクタ ID に対応しているか)、各データ ブロック内のトランスレーション、回転、スケール データのオフセット(各データ ブロックの合計サイズ)で構成されています。

データ デスクリプションで使用しなければならない構造は、HIKCharacterStateHIKEffectorSetState のどちらでデータを設定または取得しているかによって、またアニメーション データを変換配列を使用して表現するか、個別のトランスレーション、方向、スケール値を使用して表現するかによって異なります。