.Xのスキンメッシュアニメーションファイルを解析

取りあえず、DirectX SDK に付属するビューワーで再生の確認をします。
本来はスタティックメッシュであるはずの bone1.mqo が、
ウネウネ変形しています。

例によって、テンプレート部分は除去しました。

xof 0303txt 0032

# Global definition.

AnimTicksPerSecond
{
 3000;
}

# Materials definition.

Material Material_1
{
 0.800000;0.800000;0.800000;1.000000;;
 5.000000;
 0.300000;0.300000;0.300000;;
 0.000000;0.000000;0.000000;;
}

# Models definition.

Frame Model
{
 FrameTransformMatrix
 {
  1.000000,0.000000,0.000000,0.000000,
  0.000000,1.000000,0.000000,0.000000,
  0.000000,0.000000,1.000000,0.000000,
  0.000000,0.000000,0.000000,1.000000;;
 }
 Frame Mesh_1
 {
  FrameTransformMatrix
  {
   1.000000,0.000000,0.000000,0.000000,
   0.000000,1.000000,0.000000,0.000000,
   0.000000,0.000000,1.000000,0.000000,
   0.000000,0.000000,0.000000,1.000000;;
  }
  Mesh
  {
   32;
   -100.000000;200.000000;-100.000000;,
   -100.000000;0.000000;-100.000000;,
   -100.000000;-200.000000;-100.000000;,
   100.000000;200.000000;-100.000000;,
   100.000000;0.000000;-100.000000;,
   100.000000;-200.000000;-100.000000;,
   100.000000;200.000000;100.000000;,
   100.000000;0.000000;100.000000;,
   100.000000;-200.000000;100.000000;,
   -100.000000;200.000000;100.000000;,
   -100.000000;0.000000;100.000000;,
   -100.000000;-200.000000;100.000000;,
   100.000000;0.000000;-100.000000;,
   100.000000;200.000000;-100.000000;,
   100.000000;-200.000000;-100.000000;,
   100.000000;0.000000;100.000000;,
   100.000000;200.000000;100.000000;,
   100.000000;-200.000000;100.000000;,
   -100.000000;0.000000;100.000000;,
   -100.000000;0.000000;-100.000000;,
   -100.000000;200.000000;-100.000000;,
   -100.000000;200.000000;100.000000;,
   -100.000000;-200.000000;100.000000;,
   -100.000000;-200.000000;-100.000000;,
   -100.000000;200.000000;-100.000000;,
   100.000000;200.000000;-100.000000;,
   100.000000;200.000000;100.000000;,
   -100.000000;200.000000;100.000000;,
   -100.000000;-200.000000;100.000000;,
   100.000000;-200.000000;100.000000;,
   100.000000;-200.000000;-100.000000;,
   -100.000000;-200.000000;-100.000000;;
   20;
   3;3,4,1;,
   3;0,3,1;,
   3;4,5,2;,
   3;1,4,2;,
   3;6,7,12;,
   3;13,6,12;,
   3;7,8,14;,
   3;12,7,14;,
   3;9,10,15;,
   3;16,9,15;,
   3;10,11,17;,
   3;15,10,17;,
   3;20,19,18;,
   3;21,20,18;,
   3;19,23,22;,
   3;18,19,22;,
   3;26,25,24;,
   3;27,26,24;,
   3;30,29,28;,
   3;31,30,28;;
   MeshNormals
   {
    32;
    0.000000;0.000000;-1.000000;,
    0.000000;0.000000;-1.000000;,
    0.000000;0.000000;-1.000000;,
    0.000000;0.000000;-1.000000;,
    0.000000;0.000000;-1.000000;,
    0.000000;0.000000;-1.000000;,
    1.000000;0.000000;-0.000000;,
    1.000000;0.000000;-0.000000;,
    1.000000;0.000000;-0.000000;,
    0.000000;0.000000;1.000000;,
    0.000000;0.000000;1.000000;,
    0.000000;0.000000;1.000000;,
    1.000000;0.000000;-0.000000;,
    1.000000;0.000000;-0.000000;,
    1.000000;0.000000;-0.000000;,
    0.000000;0.000000;1.000000;,
    0.000000;0.000000;1.000000;,
    0.000000;0.000000;1.000000;,
    -1.000000;0.000000;-0.000000;,
    -1.000000;0.000000;-0.000000;,
    -1.000000;0.000000;-0.000000;,
    -1.000000;0.000000;-0.000000;,
    -1.000000;0.000000;-0.000000;,
    -1.000000;0.000000;-0.000000;,
    0.000000;1.000000;-0.000000;,
    0.000000;1.000000;-0.000000;,
    0.000000;1.000000;-0.000000;,
    0.000000;1.000000;-0.000000;,
    0.000000;-1.000000;-0.000000;,
    0.000000;-1.000000;-0.000000;,
    0.000000;-1.000000;-0.000000;,
    0.000000;-1.000000;-0.000000;;
    20;
    3;3,4,1;,
    3;0,3,1;,
    3;4,5,2;,
    3;1,4,2;,
    3;6,7,12;,
    3;13,6,12;,
    3;7,8,14;,
    3;12,7,14;,
    3;9,10,15;,
    3;16,9,15;,
    3;10,11,17;,
    3;15,10,17;,
    3;20,19,18;,
    3;21,20,18;,
    3;19,23,22;,
    3;18,19,22;,
    3;26,25,24;,
    3;27,26,24;,
    3;30,29,28;,
    3;31,30,28;;
   }
   MeshTextureCoords
   {
    32;
    0.000000;0.000000;,
    0.000000;0.500000;,
    0.000000;1.000000;,
    1.000000;0.000000;,
    1.000000;0.500000;,
    1.000000;1.000000;,
    1.000000;0.000000;,
    1.000000;0.500000;,
    1.000000;1.000000;,
    1.000000;0.000000;,
    1.000000;0.500000;,
    1.000000;1.000000;,
    0.000000;0.500000;,
    0.000000;0.000000;,
    0.000000;1.000000;,
    0.000000;0.500000;,
    0.000000;0.000000;,
    0.000000;1.000000;,
    0.000000;0.500000;,
    1.000000;0.500000;,
    1.000000;0.000000;,
    0.000000;0.000000;,
    0.000000;1.000000;,
    1.000000;1.000000;,
    0.000000;1.000000;,
    1.000000;1.000000;,
    1.000000;0.000000;,
    0.000000;0.000000;,
    0.000000;1.000000;,
    1.000000;1.000000;,
    1.000000;0.000000;,
    0.000000;0.000000;;
   }
   MeshMaterialList
   {
    1;
    20;
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0;
    {Material_1}
   }
   VertexDuplicationIndices
   {
    32;
    12;
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    4,
    3,
    5,
    7,
    6,
    8,
    10,
    1,
    0,
    9,
    11,
    2,
    0,
    3,
    6,
    9,
    11,
    8,
    5,
    2;
   }
   XSkinMeshHeader
   {
    4;
    3;
    3;
   }
   SkinWeights
   {
    "Joint_2";
    32;
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    19,
    20,
    21,
    22,
    23,
    24,
    25,
    26,
    27,
    28,
    29,
    30,
    31;
    0.001631,
    0.493978,
    0.994767,
    0.001551,
    0.493980,
    0.994253,
    0.001551,
    0.493980,
    0.994253,
    0.001631,
    0.493978,
    0.994767,
    0.493980,
    0.001551,
    0.994253,
    0.493980,
    0.001551,
    0.994253,
    0.493978,
    0.493978,
    0.001631,
    0.001631,
    0.994767,
    0.994767,
    0.001631,
    0.001551,
    0.001551,
    0.001631,
    0.994767,
    0.994253,
    0.994253,
    0.994767;
    1.000000,0.000000,-0.000000,0.000000,
    0.000000,1.000000,-0.000000,0.000000,
    -0.000000,-0.000000,1.000000,0.000000,
    0.679024,197.417007,-0.000000,1.000000;;
   }
   SkinWeights
   {
    "Joint_21";
    32;
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    19,
    20,
    21,
    22,
    23,
    24,
    25,
    26,
    27,
    28,
    29,
    30,
    31;
    0.499184,
    0.503012,
    0.005213,
    0.499225,
    0.503150,
    0.005725,
    0.499225,
    0.503150,
    0.005725,
    0.499184,
    0.503012,
    0.005213,
    0.503150,
    0.499225,
    0.005725,
    0.503150,
    0.499225,
    0.005725,
    0.503012,
    0.503012,
    0.499184,
    0.499184,
    0.005213,
    0.005213,
    0.499184,
    0.499225,
    0.499225,
    0.499184,
    0.005213,
    0.005725,
    0.005725,
    0.005213;
    1.000000,0.000000,-0.000000,0.000000,
    0.000000,1.000000,-0.000000,0.000000,
    -0.000000,-0.000000,1.000000,0.000000,
    -0.746348,8.553360,-0.000000,1.000000;;
   }
   SkinWeights
   {
    "Joint_211";
    32;
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    19,
    20,
    21,
    22,
    23,
    24,
    25,
    26,
    27,
    28,
    29,
    30,
    31;
    0.499184,
    0.003010,
    0.000021,
    0.499225,
    0.002870,
    0.000022,
    0.499225,
    0.002870,
    0.000022,
    0.499184,
    0.003010,
    0.000021,
    0.002870,
    0.499225,
    0.000022,
    0.002870,
    0.499225,
    0.000022,
    0.003010,
    0.003010,
    0.499184,
    0.499184,
    0.000021,
    0.000021,
    0.499184,
    0.499225,
    0.499225,
    0.499184,
    0.000021,
    0.000022,
    0.000022,
    0.000021;
    1.000000,0.000000,-0.000000,0.000000,
    0.000000,1.000000,-0.000000,0.000000,
    -0.000000,-0.000000,1.000000,0.000000,
    -0.746329,-189.576004,-0.000000,1.000000;;
   }
  }
 }
 Frame Joint_2
 {
  FrameTransformMatrix
  {
   1.000000,0.000000,0.000000,0.000000,
   0.000000,1.000000,0.000000,0.000000,
   0.000000,0.000000,1.000000,0.000000,
   -0.679024,-197.417007,-0.000000,1.000000;;
  }
  Frame Joint_21
  {
   FrameTransformMatrix
   {
    0.480124,0.877201,0.000000,0.000000,
    -0.877201,0.480124,0.000000,0.000000,
    0.000000,0.000000,1.000000,0.000000,
    1.425370,188.863998,0.000000,1.000000;;
   }
   Frame Joint_211
   {
    FrameTransformMatrix
    {
     1.000000,0.000000,0.000000,0.000000,
     0.000000,1.000000,0.000000,0.000000,
     0.000000,0.000000,1.000000,0.000000,
     -0.000018,198.128998,-0.000000,1.000000;;
    }
   }
  }
 }
}

# Animations definition.

AnimationSet Animation_1
{
 Animation
 {
  {Joint_21}
  AnimationKey
  {
   4;
   3;
   0;16;
   0.480124,0.877201,0.000000,0.000000,
   -0.877201,0.480124,0.000000,0.000000,
   0.000000,0.000000,1.000000,0.000000,
   1.425370,188.863998,0.000000,1.000000;;,
   1500;16;
   0.390151,-0.920751,0.000000,0.000000,
   0.920751,0.390151,0.000000,0.000000,
   0.000000,0.000000,1.000000,0.000000,
   1.425370,188.863998,0.000000,1.000000;;,
   3000;16;
   0.480124,0.877201,0.000000,0.000000,
   -0.877201,0.480124,0.000000,0.000000,
   0.000000,0.000000,1.000000,0.000000,
   1.425370,188.863998,0.000000,1.000000;;;
  }
 }
}


ぱっと見、今までのチュートリアルでは無かった、
 
AnimTicksPerSecond
FrameTransformMatrix
XSkinMeshHeader
VertexDuplicationIndices
SkinWeights
 
というチャンクが有るのがわかります。
各チャンクは以下の内容になっています。

AnimTicksPerSecond  //一秒間のコマ数
 {
  3000;
 }

FrameTransformMatrix  //親フレームからのローカル座標

 {
  1.000000,0.000000,0.000000,0.000000,
  0.000000,1.000000,0.000000,0.000000,
  0.000000,0.000000,1.000000,0.000000,
  0.000000,0.000000,0.000000,1.000000;;
 }
 
VertexDuplicationIndices  //重複している頂点インデックス
  {
   32;  //nIndices インデックス数
   12;  //nOriginalVertices 重複が発生する前のメッシュ内の頂点の数
   0,
   1,
   2,
   3,
   4,
   5,
   6,
   7,
   8,
   9,
   10,
   11,
   4,
   3,
   5,
   7,
   6,
   8,
   10,
   1,
   0,
   9,
   11,
   2,
   0,
   3,
   6,
   9,
   11,
   8,
   5,
   2;
  }

XSkinMeshHeader
  {
   4;  //nMaxSkinWeightsPerVertex メッシュ内の頂点に影響するトランスフォームの最大数
   3;  //nMaxSkinWeightsPerFace 任意の面の 3 つの頂点に影響するトランスフォームの最大数
   3;  //nBones メッシュの頂点に影響するボーンの数
  }

SkinWeights
  {
   "Joint_2";  //transformNodeName ボーン名
   32;  //nWeights ボーンの影響を受ける頂点の数
   0,  // ↓ vertexIndices ボーンの影響を受ける頂点のインデックス
   1,
   2,
   3,
   4,
   5,
   6,
   7,
   8,
   9,
   10,
   11,
   12,
   13,
   14,
   15,
   16,
   17,
   18,
   19,
   20,
   21,
   22,
   23,
   24,
   25,
   26,
   27,
   28,
   29,
   30,
   31;
   0.001631,  // ↓ weights ボーンの影響を受ける各頂点の重み
   0.493978,
   0.994767,
   0.001551,
   0.493980,
   0.994253,
   0.001551,
   0.493980,
   0.994253,
   0.001631,
   0.493978,
   0.994767,
   0.493980,
   0.001551,
   0.994253,
   0.493980,
   0.001551,
   0.994253,
   0.493978,
   0.493978,
   0.001631,
   0.001631,
   0.994767,
   0.994767,
   0.001631,
   0.001551,
   0.001551,
   0.001631,
   0.994767,
   0.994253,
   0.994253,
   0.994767;
   1.000000,0.000000,-0.000000,0.000000,  // ↓ matrixOffset
   0.000000,1.000000,-0.000000,0.000000,  //メッシュの頂点をボーン空間に変換する行列
   -0.000000,-0.000000,1.000000,0.000000,
   0.679024,197.417007,-0.000000,1.000000;;
  }
 

また、Material チャンクがフレームの外にあるのに気付いたでしょうか?
これは少し古い形式の .Xファイルという事になります。
このように .Xファイルは多種多様な拡張や書式を許容するファイルフォーマットに
なっているので、様々な方言があり、その全てに対応する事はできません。

ファイルフォーマットを有る程度、統一する方法として昔の DirectXSDK に付属する
MeshViewで保存しなおすという方法もありますが、MeshViewで保存しなおすと
FrameTransformMatrix に微妙な誤差が生じるという問題があります。 

なので、当サイトでは ToyStudio Advance で出力した
.Xファイルだけに対応する事にします。

 

 

 

 

最終更新:2012年03月18日 22:43
添付ファイル