手动创建X文件(3)

Posted on 2008-12-01 00:18 Herbert 阅读(462) 评论(0)  编辑 收藏 引用 所属分类: DirectX
   到此为止,我们离制作动画就只有一步之遥了。我们在前面做的立方体的基础上添加一个Frame以及一些动画时间贞就可以做出平移、旋转、缩放或者三者组合的动画了。下面先来看一下几个模板的定义吧!
 

模板 Frame 定义如下:

template Frame
{
    < 3D82AB46-62DA-11CF-AB39-0020AF71E433 >
    [...]               
}

 

模板FrameTransformMatrix 定义如下:

template FrameTransformMatrix
{
    < F6F23F41-7686-11cf-8F52-0040333594A3 >
    Matrix4x4 frameMatrix;
}

 

模板Matrix4x4 定义如下:

template Matrix4x4
{
    < F6F23F45-7686-11cf-8F52-0040333594A3 >
    array float matrix[16];
}

 

模板AnimationSet 定义如下:

template AnimationSet
{
    < 3D82AB50-62DA-11cf-AB39-0020AF71E433 >
    [ Animation < 3D82AB4F-62DA-11cf-AB39-0020AF71E433 > ]
}

 

模板AnimationKey 定义如下:

template AnimationKey
{
    < 10DD46A8-775B-11CF-8F52-0040333594A3 >
    DWORD keyType; //动画键类型(0:旋转键;1:缩放键;2:平移键;3:矩阵变换键)
    DWORD nKeys; //键的个数
    array TimedFloatKeys keys[nKeys]; //键数组
}

 

模板TimedFloatKeys 定义如下:

template TimedFloatKeys
{
    < F406B180-7B3B-11cf-8F52-0040333594A3 >
    DWORD time; //时间贞
    FloatKeys tfkeys;
}

 

模板FloatKeys 定义如下:

template FloatKeys
{
    < 10DD46A9-775B-11cf-8F52-0040333594A3 >
    DWORD nValues; //一次变换需要的数值个数
    array float values[nValues]; //数值列表
}

 

当AnimationKey 的keyType 为0时(即旋转键), FloatKeys 的 nValues 为4(即通过4个值来控制旋转:x,y,z 确定一个向量以及转过的角度angle);

当 AnimationKey 的 keyType 为 1时(即缩放键),FloatKeys的 nValues 为3(即通过3个值来控制缩放:x,y,z方向的缩放倍数);

当 AnimationKey 的 keyType 为 2时(即平移键), FloatKeys 的 nValues 为3(即通过3个值来控制平移:x,y,z坐标)。

我们在之前做的立方体的Mesh外面包裹一层 Frame 命名为 CubeFrame,再在CubeFrame 下面添加一个 AnimationSet即可,

cube_rot.xxof 0302txt 0064

Header
{
1;
0;
1;
}

 


Material YelloImage {
1.000000;1.000000; 0.000000;1.000000;; //颜色: R G B A      
0.000000;      // specular color 指数
0.000000;0.000000;0.000000;; // specularColor
0.000000;0.000000;0.000000;; // emissiveColor

 TextureFilename
 {
 "Herbert.png";
 }
}


Material PurpleImage
{
1.000000; 0.000000; 1.000000; 1.000000;; //颜色: R G B A  
0.000000;
0.000000; 0.000000; 0.000000;;
0.000000; 0.000000; 0.000000;;

 TextureFilename
 {
 "Candy.png";
 }
}


Frame CubeFrame
{
 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 Cube_Mesh
 {
  8; //8 个顶点
   2.0;-2.0; 2.0;,
   2.0;-2.0;-2.0;,
  -2.0;-2.0;-2.0;,
  -2.0;-2.0; 2.0;,
   2.0; 2.0; 2.0;,
   2.0; 2.0;-2.0;,
  -2.0; 2.0;-2.0;,
  -2.0; 2.0; 2.0;;

  12; // 12 个面
  3;0,2,1;,
  3;0,3,2;,
  3;4,5,6;,
  3;4,6,7;,
  3;0,1,5;,
  3;0,5,4;,
  3;3,7,6;,
  3;3,6,2;,
  3;1,2,6;,
  3;1,6,5;,
  3;0,4,7;,
  3;0,7,3;;

 

  MeshMaterialList
  {
   2; //材质个数
   12; //面个数
   0,
   0,
   0,
   0,
   0,
   0,
   1,
   1,
   1,
   1,
   1,
   1;;
   {YelloImage}
   {PurpleImage}
  }


  MeshNormals
  {
   8;  //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;;


   12; //12个面
   3;0,2,1;, //12个面中每个顶点对应一个向量索引
   3;0,3,2;,
   3;4,5,6;,
   3;4,6,7;,
   3;0,1,5;,
   3;0,5,4;,
   3;3,7,6;,
   3;3,6,2;,
   3;1,2,6;,
   3;1,6,5;,
   3;0,4,7;,
   3;0,7,3;;

  }

 


  MeshTextureCoords
  {
   8; //8个纹理坐标
   0.0; 0.0;
   0.0; 1.0;
   0.0; 0.0;
   0.0; 1.0;

   1.0; 0.0;
   1.0; 1.0;
   1.0; 0.0;
   1.0; 1.0;;
  }

 }


}

 

AnimationSet AnimSet0
{

 
 Animation Anim_RotByX
 {
     { CubeFrame}
 
  AnimationKey
  {
   0; //键类型为:旋转键
   8; // 8 个时间贞
   // 时间贞 决定旋转需要4个值 x y z angle
   1000; 4; 0.0, 0.0, 1.0, 0.785;;,
   2000; 4; 0.0, 0.0, 1.0, 1.57 ;;,
   3000; 4; 0.0, 0.0, 1.0, 2.355;;,
   4000; 4; 0.0, 0.0, 1.0, 3.14  ;;,
   5000; 4; 0.0, 0.0, 1.0, 3.925;;,
   6000; 4; 0.0, 0.0, 1.0, 4.71 ;;,
   7000; 4; 0.0, 0.0, 1.0, 5.495;;,
   8000; 4; 0.0, 0.0, 1.0, 0.0  ;;;
  }
  }

 


 

 

   上面实现的是旋转动画,如果我们要实现缩放动画,则可以把AnimationSet 改成以下内容即可:

AnimationSet AnimSet0
{

 
  Animation Anim_Scale
  {
  {CubeFrame}
  AnimationKey
  {
   1; //缩放键
   6; //六个时间点
   // 时间贞 决定缩放需要3个值 x y z
   1000; 3; 0.75, 0.75, 0.75;;,
   2000; 3; 0.5 , 0.5 , 0.5 ;;,
   3000; 3; 0.25, 0.25, 0.25;;,
   4000; 3; 0.5 , 0.5 , 0.5 ;;,
   5000; 3; 0.75, 0.75, 0.75;;,
   6000; 3; 1.0 , 1.0 , 1.0 ;;;
  }
  }
}

   如果要改成平移动画,则把AnimationSet 改成以下:

AnimationSet AnimSet0
{

 
  Animation Anim_Trans
  {
  {CubeFrame}
  AnimationKey
  {
   2; //平移键
   6; //六个时间点
   // 时间贞 决定平移需要3个值 x y z
   1000; 3; 0.0, 1.0, 1.0;;,
   2000; 3; 0.0, 2.0, 2.0;;,
   3000; 3; 0.0, 3.0, 3.0;;,
   4000; 3; 0.0, 2.0, 2.0;;,
   5000; 3; 0.0, 1.0, 1.0;;,
   6000; 3; 0.0, 0.0, 0.0;;;
  }
  }
}


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理