TOYSTUDIO SDK
1.6.1.3
|
スキニングとは、 ボーン(骨)などを使ってポリゴンを皮膚のように滑らかに変形させることを言います。 TOYSTUDIOではメッシュ タイプ(TA_OBJECT_MESH)のオブジェクト(CTaObject)にボーンをセットし、 スキニングを行うことが出来ます。
TOYSTUDIOでスキニングを利用するには、以下の5項目のデータが必要になります。 TOYSTUDIOの「オブジェクト」メニューの「スムーズ スキニング」を実行すると1〜5のデータが作成され、 「スキニングをクリア」を実行すると削除されます。 「ボーン参照をクリア」を実行した場合、1〜4のデータは削除され5のデータは保持されます。
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() でセットします。
スキンのバインド時ワールド変換行列を 、 ボーン のバインド時ワールド変換行列を 、 ボーン の現在のワールド変換行列を 、 スキンの現在のワールド変換行列を とすると、 TOYSTUDIOの表示に使用されているボーン のボーン行列 は
となります。 はXファイルにおける「ボーン オフセット行列」に相当します。 は現在のスキン自体の姿勢パラメータを表示に反映させるための変換であり、 Xファイルなどでは使用されません。
TOYSTUDIOの表示では、以下のようなコード(簡易コード)を用いて頂点座標のスキニング処理を行っています。
この処理では、頂点の最後(TA_MAX_VERTEX_BONE_COUNT 個め)のウェイト値は実際のスキニング処理には利用されず、 1からそれ以外のウエイトを引いたものが利用されます。 また、頂点のウェイト値が全て0の場合は最後のウェイト値が1として処理されます。