Frame Animation Model

Frame Animation をテストするための XFILE を作成します。
アニメーションモデルの詳しい説明は 前田稔の超初心者のプログラム入門 から
「DirectX9/VertexBuffer のプログラム/アニメーション X-FILE を作成する」を参照して下さい。

前田稔の超初心者のプログラム入門

四面体モデル

  1. XFILE Loader α版では Frame 構造とアニメーションの設定は無視していました。
    しかしながら XFILE で最も魅力があるのは、ファイルに組み込まれているアニメーション機能でしょう。
    XFILE Animation の最初のステップとして、Frame 構造に従って Animation するプログラムを作成してみましょう。
    プログラムの作成に取りかかる前に困るのが、テストで使うモデルファイルの作成です。
    アニメーション機能が無い XFILE なら簡単に手に入るでしょうが、こちらはそうは行きません。
    そこで XFILE の形式説明を兼ねて Text Editor で簡単なモデルを作成してみました。
  2. 四面体が複雑に回転するモデル(Men4_NoHead.x)です。
    なるべく簡単になるように、極力省略したので全てのバージョンで動くとは限りません。
    私は DirectX SDK November 2008 の Viewer でアニメーションの実行を確認しました。
    xof 0303txt 0032
    
    Header {
     1;
     0;
     1;
    }
    
    // Top-most frame encompassing the 'World'
    Frame Frame_World
    {
      Frame Frame_ModelDef
      {
    
    Mesh {
     4;
     -5.0;0.0;5.0;,
      5.0;0.0;5.0;,
      0.0;8.16;2.11;,
      0.0;0.0;-3.66;;
     4;
     3;0,1,2;,
     3;3,2,1;,
     3;2,3,0;,
     3;1,0,3;;
    
     MeshMaterialList {
      4;
      4;
      0,
      1,
      2,
      3;
    
      Material {
       1.0;0.0;0.0;1.0;;
       21.3;
       0.0;0.0;0.0;;
       0.0;0.0;0.0;;
      }
      Material {
       1.0;1.0;0.0;1.0;;
       21.3;
       0.0;0.0;0.0;;
       0.0;0.0;0.0;;
      }
      Material {
       0.0;0.0;1.0;1.0;;
       21.3;
       0.0;0.0;0.0;;
       0.0;0.0;0.0;;
      }
      Material {
       0.0;1.0;0.0;1.0;;
       21.3;
       0.0;0.0;0.0;;
       0.0;0.0;0.0;;
      }
     }
    
     MeshNormals {
      4;
      -0.82;-0.33;0.47;,
      0.82;-0.33;0.47;,
      0.00;1.00;-0.00;,
      0.00;-0.33;-0.94;;
      4;
      3;0,1,2;,
      3;3,2,1;,
      3;2,3,0;,
      3;1,0,3;;
     }
    } // End of Mesh
     } // End of "ModelDef" frame
    } // End of "World" frame
    
    AnimationSet AnimationSet0 {
        Animation Animation0 {
            {Frame_ModelDef}
            AnimationKey {
                0;  // Rotation
                13;
                0;4;1.0,0.0,0.0,0.0;;,
                2000; 4;0.90,-0.19,0.31, 0.19;;
                4000; 4;0.80,-0.15,0.57, 0.08;;
                6000; 4;0.56, 0.20,0.79,-0.17;;
                8000; 4;0.43, 0.29,0.81,-0.27;;
                10000;4;0.24, 0.41,0.84,-0.27;;
                12000;4;0.19, 0.36,0.91,-0.09;;
                14000;4;0.20,-0.08,0.94, 0.27;;
                16000;4;0.19,-0.36,0.91,-0.06;;
                18000;4;0.11,-0.14,0.98, 0.03;;
                20000;4;0.06,-0.06,0.99, 0.08;;
                22000;4;0.05, 0.00,0.99, 0.00;;
                24000;4;0.04, 0.00,1.00, 0.00;;
            }
        }
    }
    
  3. XFILE の基本的な形式は XFILE Loader の基礎 を参照して下さい。
    アニメーションを行うときは Frame の記述が必要なようです。
    Frame_ModelDef に続いて、Mesh で四面体のモデルを定義しています。
    Frame Frame_World
    {
      Frame Frame_ModelDef
      {
    
    Mesh {
     4;
     -5.0;0.0;5.0;,
      5.0;0.0;5.0;,
        ・・・
    
  4. AnimationSet 以降でアニメーションの動きを設定します。
    {Frame_ModelDef} がアニメーションの対象となる Frame の名前です。
    「0」が Rotation Animation の指定で「13」がパスの数です。
    以後13行のクオータニオン(quaternion)が続きます。
    クオータニオンは、ベクトルを定義する 3 要素の [x, y, z] の 3 つの値に、4 番目の要素(その軸の周りの回転)を追加したものです。
    AnimationSet AnimationSet0 {
        Animation Animation0 {
            {Frame_ModelDef}
            AnimationKey {
                0;  // Rotation
                13;
                0;4;1.0,0.0,0.0,0.0;;,
                2000;4;0.909490,-0.189979,0.314659,0.194230;;
                  ・・・
    
  5. アニメーションモデルの詳しい説明は 前田稔の超初心者のプログラム入門 から
    「DirectX9/VertexBuffer のプログラム/アニメーション X-FILE を作成する」を参照して下さい。
    keyType は次のようになっています。
    1. keyType=0: Rotation(回転)のアニメーションです。
    2. keyType=1: Scale(スケール変換)のアニメーションです。
    3. keyType=2: Offset(移動)のアニメーションです。
    4. keyType=3: 変換行列のアニメーションです。

ColorCube モデル

  1. ちょっと長いのですが、各面に色を設定した立方体が回転するモデル(Cube_rot.x)です。
    FrameTransformMatrix や XSkinMeshHeader も定義しているので、長くなっています。
    DirectX SDK November 2008 の Viewer でアニメーションの実行を確認しました。
    xof 0302txt 0064
    
    Header {
     1;
     0;
     1;
    }
    
    Material Matgr {
     0.0;0.8;0.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matred {
     1.0;0.0;0.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matwh {
     1.0;1.0;1.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matye {
     1.0;1.0;0.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matpi {
     1.0;0.5;1.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matbr {
     0.0;0.0;1.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    
    // Top-most frame encompassing the 'World'
    Frame Frame_World
    { FrameTransformMatrix
      {
            1.0, 0.0, 0.0, 0.0, 
            0.0, 1.0, 0.0, 0.0, 
            0.0, 0.0, 1.0, 0.0, 
            0.0, 0.0, 0.0, 1.0;;
      }
    
      Frame Frame_Root
      {
        FrameTransformMatrix
        {
             1.0, 0.0, 0.0, 0.0, 
             0.0, 1.0, 0.0, 0.0, 
             0.0, 0.0, 1.0, 0.0, 
             0.0, 0.0, 0.0, 1.0;;
        }
    
        Frame Anim_MatrixFrame_Subroot
        {
          FrameTransformMatrix
          {
             1.0, 0.0, 0.0, 0.0, 
             0.0, 1.0, 0.0, 0.0, 
             0.0, 0.0, 1.0, 0.0, 
             0.0, 0.0, 0.0, 1.0;;
          }
    
          Frame Anim_MatrixFrame_Cube
          {
            FrameTransformMatrix
            {
                1.0, 0.0, 0.0, 0.0, 
                0.0, 1.0, 0.0, 0.0, 
                0.0, 0.0, 1.0, 0.0, 
                0.0, 0.0, 0.0, 1.0;;
            }
          } // End 'Cube' frame
        } // End 'Subroot' frame
      } // End empty node 'Root' frame
    
      Frame Frame_ModelDef
      {
        FrameTransformMatrix
        {
             1.0, 0.0, 0.0, 0.0, 
             0.0, 1.0, 0.0, 0.0, 
             0.0, 0.0, 1.0, 0.0, 
             0.0, 0.0, 0.0, 1.0;;
        }
    
    Mesh {
     8;
     -1.0;-1.0;-1.0;,
     -1.0;1.0;1.0;,
     -1.0;1.0;-1.0;,
     -1.0;-1.0;1.0;,
     1.0;-1.0;-1.0;,
     1.0;1.0;1.0;,
     1.0;1.0;-1.0;,
     1.0;-1.0;1.0;;
    
     6;
     4;0,3,1,2;,
     4;4,0,2,6;,
     4;6,2,1,5;,
     4;5,1,3,7;,
     4;7,3,0,4;,
     4;4,6,5,7;;
    
     MeshMaterialList {
      6;
      6;
      0,
      1,
      2,
      3,
      4,
      5;;
      {Matgr}
      {Matred}
      {Matwh}
      {Matye}
      {Matpi}
      {Matbr}
     }
     MeshNormals {
      6;
      -1.0;0.0;0.0;,
      0.0;0.0;-1.0;,
      0.0;1.0;0.0;,
      0.0;0.0;1.0;,
      0.0;-1.0;0.0;,
      1.0;0.0;0.0;;
    
      6;
      4;0,0,0,0;,
      4;1,1,1,1;,
      4;2,2,2,2;,
      4;3,3,3,3;,
      4;4,4,4,4;,
      4;5,5,5,5;;
     } // End of MeshNormals
    } // End of Mesh
    } // End of "ModelDef" frame
    
        XSkinMeshHeader {
            4; // nMaxSkinWeightsPerVertex
            3; // nMaxSkinWeightsPerFace
            1; // nBones
        }  // End of XSkinMeshHeader
    
        SkinWeights {
            "Frame_ModelDef";
            24; // nWeights  頂点 Index
            0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23;;
            1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
            1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
            1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0;;
            1.0, 0.0, 0.0, 0.0, 
            0.0, 1.0, 0.0, 0.0, 
            0.0, 0.0, 1.0, 0.0, 
            0.0, 0.0, 0.0, 1.0;;
        }  // End of SkinWeights
    } // End of "World" frame
    
    AnimationSet AnimationSet0 {
        Animation Animation0 {
            {Frame_ModelDef}
            AnimationKey {
                0;  // Rotation
                13;
                0;4;1.0,0.0,0.0,0.0;;,
                2000; 4;0.90,-0.19,0.31, 0.19;;
                4000; 4;0.80,-0.15,0.57, 0.08;;
                6000; 4;0.56, 0.20,0.79,-0.17;;
                8000; 4;0.43, 0.29,0.81,-0.27;;
                10000;4;0.24, 0.41,0.84,-0.27;;
                12000;4;0.19, 0.36,0.91,-0.09;;
                14000;4;0.20,-0.08,0.94, 0.27;;
                16000;4;0.19,-0.36,0.91,-0.06;;
                18000;4;0.11,-0.14,0.98, 0.03;;
                20000;4;0.06,-0.06,0.99, 0.08;;
                22000;4;0.05, 0.00,0.99, 0.00;;
                24000;4;0.04, 0.00,1.00, 0.00;;
            }
        }
    }
    
  2. XFILE の基本的な形式は XFILE Loader の基礎 を参照して下さい。
    Material に名前(Matgr)を付けて定義しています。
    Matgr が緑のマテリアルで、Matred が赤のマテリアルです。
    Material Matgr {
     0.0;0.8;0.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matred {
          ・・・
    
  3. Frame の定義では FrameTransformMatrix(Matrix4f) を定義しています。
    このモデルで定義している値は、標準値(座標変換無し)なので効果はありません。
    座標計算の詳細は Windows Guid から「変換行列を使って座標を回転」を参照して下さい。
    Frame Frame_World
    { FrameTransformMatrix
      {
            1.0, 0.0, 0.0, 0.0, 
            0.0, 1.0, 0.0, 0.0, 
            0.0, 0.0, 1.0, 0.0, 
            0.0, 0.0, 0.0, 1.0;;
      }
    
      Frame Frame_Root
      {
        FrameTransformMatrix
          ・・・
    
  4. Frame_ModelDef に続いて、Mesh で ColorCube のモデルを定義しています。
      Frame Frame_ModelDef
      {
        FrameTransformMatrix
        {
             1.0, 0.0, 0.0, 0.0, 
             0.0, 1.0, 0.0, 0.0, 
             0.0, 0.0, 1.0, 0.0, 
             0.0, 0.0, 0.0, 1.0;;
        }
    
    Mesh {
     8;
     -1.0;-1.0;-1.0;,
     -1.0;1.0;1.0;,
        ・・・
    
  5. XSkinMeshHeader では、ボーンの数や影響する頂点番号などを記述します。
    これらの情報は Frame Animation では無視されるので説明を省略します。
        XSkinMeshHeader {
            4; // nMaxSkinWeightsPerVertex
            3; // nMaxSkinWeightsPerFace
            1; // nBones
        }  // End of XSkinMeshHeader
    
        SkinWeights {
            "Frame_ModelDef";
            24; // nWeights  頂点 Index
            0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23;;
            1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
                ・・・
    
  6. AnimationSet 以降でアニメーションの動きを設定します。
    {Frame_ModelDef} がアニメーションの対象となる Frame の名前です。
    AnimationSet AnimationSet0 {
        Animation Animation0 {
            {Frame_ModelDef}
            AnimationKey {
                0;  // Rotation
                13;
                0;4;1.0,0.0,0.0,0.0;;,
                2000; 4;0.90,-0.19,0.31, 0.19;;
                4000; 4;0.80,-0.15,0.57, 0.08;;
                  ・・・
    

立方体と四面体のモデル

  1. 立方体の上から四面体が回転しながら落ちてくるモデル(BoxMen4.x)です。
    Rotation Type と Position Type を組み合わせます。
    DirectX SDK November 2008 の Viewer でアニメーションの実行を確認しました。
    xof 0303txt 0032
    
    Header {
     1;
     0;
     1;
    }
    
    Material Matgr {
     0.0;0.8;0.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matred {
     1.0;0.0;0.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matwh {
     1.0;1.0;1.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matye {
     1.0;1.0;0.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matpi {
     1.0;0.5;1.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    Material Matbr {
     0.0;0.0;1.0;1.0;;
     21.3;
     0.0;0.0;0.0;;
     0.0;0.0;0.0;;
    }
    
    // Top-most frame encompassing the 'World'
    Frame Frame_World
    {
      Frame Anim_MatrixFrame_Box
      {
    
    // Model Box
    Mesh {
     8;
     -0.5;-0.9;-0.5;,
     -0.5;0.1;0.5;,
     -0.5;0.1;-0.5;,
     -0.5;-0.9;0.5;,
     0.5;-0.9;-0.5;,
     0.5;0.1;0.5;,
     0.5;0.1;-0.5;,
     0.5;-0.9;0.5;;
    
     6;
     4;0,3,1,2;,
     4;4,0,2,6;,
     4;6,2,1,5;,
     4;5,1,3,7;,
     4;7,3,0,4;,
     4;4,6,5,7;;
    
     MeshMaterialList {
      6;
      6;
      0,
      1,
      2,
      3,
      4,
      5;;
      {Matgr}
      {Matred}
      {Matwh}
      {Matye}
      {Matpi}
      {Matbr}
     } // End of MeshMaterialList
    
     MeshNormals {
      6;
      -1.0;0.0;0.0;,
      0.0;0.0;-1.0;,
      0.0;1.0;0.0;,
      0.0;0.0;1.0;,
      0.0;-1.0;0.0;,
      1.0;0.0;0.0;;
    
      6;
      4;0,0,0,0;,
      4;1,1,1,1;,
      4;2,2,2,2;,
      4;3,3,3,3;,
      4;4,4,4,4;,
      4;5,5,5,5;;
     } // End of MeshNormals
    } // End of Mesh
    
        Frame Anim_MatrixFrame_Men4
        {
    
    // Model Men4
    Mesh {
     4;
     -0.7;0.0;0.7;,
      0.7;0.0;0.7;,
      0.0;1.2;0.25;,
      0.0;0.0;-0.4;;
     4;
     3;0,1,2;,
     3;3,2,1;,
     3;2,3,0;,
     3;1,0,3;;
    
     MeshMaterialList {
      4;
      4;
      0,
      1,
      2,
      3;
      {Matgr}
      {Matred}
      {Matye}
      {Matbr}
     } // End of MeshMaterialList
    
     MeshNormals {
      4;
      -0.82;-0.33;0.47;,
      0.82;-0.33;0.47;,
      0.00;1.00;-0.00;,
      0.00;-0.33;-0.94;;
      4;
      3;0,1,2;,
      3;3,2,1;,
      3;2,3,0;,
      3;1,0,3;;
     } // End of MeshNormals
    } // End of Mesh
    
        } // End animation 'Men4' frame
      } // End animation 'Box' frame
    } // End of "World" frame
    
    AnimationSet AnimationSet0 {
        Animation Animation0 {
            {Anim_MatrixFrame_Men4}
            AnimationKey {
                0;  // Rotation
                13;
                0;4;1.0,0.0,0.0,0.0;;,
                2000; 4;0.91,-0.19,0.31, 0.19;;
                4000; 4;0.80,-0.15,0.58, 0.08;;
                6000; 4;0.56, 0.20,0.79,-0.17;;
                8000; 4;0.43, 0.29,0.81,-0.27;;
                10000;4;0.24, 0.41,0.84,-0.27;;
                12000;4;0.20, 0.36,0.91,-0.09;;
                14000;4;0.91,-0.19,0.31, 0.30;;
                16000;4;0.19,-0.36,0.91,-0.06;;
                18000;4;0.11,-0.14,0.98, 0.03;;
                20000;4;0.91,-0.19,0.31,-0.77;;
                22000;4;0.05, 0.01,0.99, 0.00;;
                24000;4;0.04, 0.00,1.00, 0.00;;
            }
    
            AnimationKey {
                2;  // Position
                13;
                0;3;0.00,1.10,0.00;;,
                2000; 3;0.13,2.57,0.00;;,
                4000; 3;0.25,3.01,-0.20;;,
                6000; 3;0.37,2.68,-0.10;;,
                8000; 3;0.50,1.55,-0.50;;,
                10000;3;0.63,0.12,-0.70;;,
                12000;3;0.74,0.45,-0.55;;,
                14000;3;0.81,0.39,-0.20;;,
                16000;3;0.25,3.01,-1.15;;,
                18000;3;0.37,2.68,-0.80;;,
                20000;3;0.26,0.03,-0.75;;,
                22000;3;0.12,0.08,-0.02;;,
                24000;3;0.00,0.08,0.00;;;
            }
        }
    }
    
  2. Anim_MatrixFrame_Box に続いて、Mesh で立方体のモデルを定義しています。
    // Top-most frame encompassing the 'World'
    Frame Frame_World
    {
      Frame Anim_MatrixFrame_Box
      {
    
    // Model Box
    Mesh {
     8;
     -0.5;-0.9;-0.5;,
     -0.5;0.1;0.5;,
        ・・・
    
  3. 立方体の子として四面体の Frame を設定します。
    Anim_MatrixFrame_Men4 に続いて、Mesh で四面体のモデルを定義します。
        Frame Anim_MatrixFrame_Men4
        {
    
    // Model Men4
    Mesh {
     4;
     -0.7;0.0;0.7;,
      0.7;0.0;0.7;,
        ・・・
    
  4. AnimationSet 以降でアニメーションの動きを設定します。
    {Anim_MatrixFrame_Men4} がアニメーションの対象となる Frame の名前です。
    最初に Rotation(keyType=0)の動きを設定します。
    AnimationSet AnimationSet0 {
        Animation Animation0 {
            {Anim_MatrixFrame_Men4}
            AnimationKey {
                0;  // Rotation
                13;
                0;4;1.0,0.0,0.0,0.0;;,
                2000; 4;0.91,-0.19,0.31, 0.19;;
                  ・・・
    
  5. 続いて Position(keyType=2)の動きを設定します。
            AnimationKey {
                2;  // Position
                13;
                0;3;0.00,1.10,0.00;;,
                2000; 3;0.13,2.57,0.00;;,
                  ・・・
    

超初心者のプログラム入門(Java2)