スキニングとは <bone> により、モデルを変形する機能です。
実機上での処理の違いによってスキニングの種類には、スムーススキニング、リジッドスキニング、リジッドボディ(スキニング無し)の三種類があります。 スキニングの種類は <shape> 単位で指定することができます。 これに対応するため、モデルは描画時にスムーススキニング用行列パレットとリジッドスキニング用行列パレットを生成します。
スムーススキニングは一つの頂点が複数の <bone> の影響を受けて、滑らかに変形するスキニングです。頂点は <bone> から生成するスムーススキニング用行列パレットへのインデックスと、<bone> の影響度合いを指定するウェイト値を、それぞれ <shape_info> vertex_skinning_count 個もちます。
リジッドスキニングは一つの頂点が単一の <bone> の影響を受けて、変形するスキニングです。頂点は <bone> から生成するリジッドスキニング用行列パレットへのインデックスを一つ持ちます。
リジッドボディは <bone> による変形を行いません。 頂点は <bone> に関する情報を持たず、 <shape_info> bone_name で指定した <bone> の座標系に、そのまま表示します。
| スムーススキニング | リジッドスキニング | リジッドボディ |
|---|---|---|
| <shape_info> vertex_skinning_count >= 2 | <shape_info> vertex_skinning_count == 1 | <shape_info> vertex_skinning_count == 0 |
| 頂点位置はモデル座標系(バインドポーズ) | 頂点位置は <vtx_attrib> blendindex0 の <bone> ローカル座標系 | 頂点位置は <shape_info> bone_name の <bone> ローカル座標系 |
|
<vtx_attrib> ((blendindex, blendweight) * <shape_info> vertex_skinning_count) でスムーススキニング用行列パレットを複数参照してブレンド |
<vtx_attrib> blendindex0 でリジッドスキニング用の行列パレットを参照 | 行列パレットへの参照無し |
| <bone> matrix_index の前のインデックスに行列パレット生成 | <bone> matrix_index の後のインデックスに行列パレット生成 | 行列パレット生成無し |
| <bone> matrix_index の前のインデックスが -1 でなければ <inv_model_matrix> 生成 | <inv_model_matrix> 無し | <inv_model_matrix> 無し |
<bone> render_matrix は、スムーススキニング、リジッドスキニング、リジッドボディのいずれからも <bone> が利用されていない場合に false となります。
スキニングの種類に関わらず、<shape> のビジビリティは <shape_info> bone_name で参照している <bone> visibility により指定します。