1.は全てのボーン オブジェクト(CTaObject)のリストで、 CTaObject::GetBones() で取得、 CTaObject::SetBones() でセットします。
2.は「スムーズ スキニング」実行時の、スキニングされるオブジェクトのワールド変換行列で、 CTaObject::GetSkinBindTransform() で取得、 CTaObject::SetSkinBindTransform() でセットします。
3.は「スムーズ スキニング」実行時の、全ボーンのワールド変換行列で、 CTaObject::GetBoneBindTransforms() で取得、 CTaObject::SetBoneBindTransforms() でセットします。
4.は「スムーズ スキニング」実行時の、 スキンと全ボーン、それらからルート モデルまでさかのぼる全ての親オブジェクトのユニーク リストと姿勢パラメータです。 これは、ToyStudioの「オブジェクト」メニューの「バインド ポーズ」コマンドで使用されます。 CTaObject::GetBindPose() で取得、 CTaObject::SetBindPose() でセットします。
つまり、これらの姿勢パラメータをそれぞれのオブジェクトにセットした状態で、 スキンおよび全ボーンについて CTaObject::GetWorldTransform() で取得されたものが、 それぞれ2.および3.の変換行列ということになります。
5.は各頂点が保持する4個(TA_MAX_VERTEX_BONE_COUNT)のボーン インデックスと、 ウェイトです。 ボーン インデックスは頂点が参照するボーンの1.のボーン リストにおける位置で、 ウェイトはその重みです。 CTaObject::GetVertexBones() で取得、 CTaObject::GetVertexBones() でセットします。
となります。はXファイルにおける「ボーン オフセット行列」に相当します。
は現在のスキン自体の姿勢パラメータを表示に反映させるための変換であり、 Xファイルなどでは使用されません。
//ボーン行列の配列 TA_MATRIX BoneMatrices[256]; //頂点のボーン インデックスの配列 BYTE Indices[TA_MAX_VERTEX_BONE_COUNT]; //頂点のボーン ウェイトの配列 float Weights[TA_MAX_VERTEX_BONE_COUNT]; //通常の頂点座標値 TA_VECTOR VertexPos; //上記のデータは取得済みとします。 //求めるスキニング済み頂点座標値 TA_VECTOR Pos(0, 0, 0); //計算用のウェイト値 float CurWeight = 0; //TA_MAX_VERTEX_BONE_COUNT-1回のループ for(UINT n = 0; n < TA_MAX_VERTEX_BONE_COUNT-1; ++n) { //ウェイト値を取得 float weight = Weights[n]; //頂点座標値にボーン行列をかけ重みをつけて加算 Pos += VertexPos*BoneMatrices[Indices[n]]*weight; //計算用のウェイト値を加算 CurWeight += weight; } //最後のウェイト値は1-CurWeight。 CurWeight = 1-CurWeight; //最後に頂点座標値にボーン行列をかけ重みをつけて加算 Pos += VertexPos*BoneMatrices[Indices[n]]*CurWeight;