您的位置:首页 > 移动开发 > Unity3D

微软游戏X文件的定义

2017-12-18 10:36 183 查看
xof 0302txt 0064     //xof告诉程序加载的文件是.x文件,0302表示使用的是DirectX3.2版本,txt表示数据是以文件形式存储的。

Header {             //0064定义了浮点数的倍数为64位 

1;

0;

1;

}

Material RedMaterial {                                   //第一块材料

1.000000;0.000000;0.000000;1.000000;;     // R = 1.0, G = 0.0, B = 0.0,A=1.0

0.000000;                                                      //镜面反射指数

0.000000;0.000000;0.000000;;                    //镜面反射着色

0.000000;0.000000;0.000000;;                   //自发光着色

TextureFilename { "Tex1.jpg"; }                    //纹理文件名

}

Material GreenMaterial {                               //第二块材料

0.000000;1.000000;0.000000;1.000000;;     // R = 0.0, G = 1.0, B = 0.0,A=1.0

0.000000;

0.000000;0.000000;0.000000;;

0.000000;0.000000;0.000000;;

TextureFilename { "Tex2.jpg"; }                    //纹理文件名

}

Frame CubeFrame {                                    //框架

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.001000, 0.001000, 0.001000, 1.000000;;

}

Mesh Cube {                                                 //网格

8;                                                                   //8个顶点,以下为8个顶点的坐标

1.000000;1.000000;-1.000000;, 

-1.000000;1.000000;-1.000000;,

-1.000000;1.000000;1.000000;, 

1.000000;1.000000;1.000000;,

1.000000;-1.000000;-1.000000;,

-1.000000;-1.000000;-1.000000;,

-1.000000;-1.000000;1.000000;,

1.000000;-1.000000;1.000000;;

12;                                                                  // 12个面, 以下为每个面三个顶点的索引

3;0,1,2;,

3;0,2,3;,

3;0,4,5;,

3;0,5,1;,

3;1,5,6;,

3;1,6,2;,

3;2,6,7;,

3;2,7,3;,

3;3,7,4;,

3;3,4,0;,

3;4,7,6;,

3;4,6,5;;

//网格材质列表

MeshMaterialList {

2;                    //使用材质的数量:2块材质

12;                   //为12顶点指定材质

0,                    //为前6个面使用第一块材质

0,

0,

0,

0,

0,

1,                    //为后面的6个面使用第二块材质

1,

1,

1,

1,

1;;

{RedMaterial}       //第一块材质,引用前面定义的RedMaterial材质

{GreenMaterial}     //第二块材质,引用前面定义的GreenMaterial材质

}

//顶点法线

MeshNormals {

8;                    //定义8个法线向量

0.333333;0.666667;-0.666667;,

-0.816497;0.408248;-0.408248;,

-0.333333;0.666667;0.666667;,

0.816497;0.408248;0.408248;,

0.666667;-0.666667;-0.333333;,

-0.408248;-0.408248;-0.816497;,

-0.666667;-0.666667;0.333333;,

0.408248;-0.408248;0.816497;;

12;                   //为12个面的每个顶点指定法线

3;0,1,2;,

3;0,2,3;,

3;0,4,5;,

3;0,5,1;,

3;1,5,6;,

3;1,6,2;,

3;2,6,7;,

3;2,7,3;,

3;3,7,4;,

3;3,4,0;,

3;4,7,6;,

3;4,6,5;;

}

//纹理坐标

MeshTextureCoords {

8;                        //定义8对纹理坐标

0.000000;1.000000;

1.000000;1.000000;

0.000000;1.000000;

1.000000;1.000000;

0.000000;0.000000;

1.000000;0.000000;

0.000000;0.000000;

1.000000;0.000000;;

}

}

}

AnimationSet AnimationSet0 { //动画集

Animation Animation0 {        //动画

{CubeFrame}                   //引用上面的立方体框架,表示下面的动画是针对立方体框架的

AnimationKey {                //动画键   沿Y轴旋转网格

0;                                    // 动画键keyType可取的值是0,1,2,4。

                                       // 0表示旋转键,在.X文件中,用一个四元数来实现模型的旋转,旋转值使用4个分量w,x,y,z来存储,

                                      //也就是说,此时变换数组的大小是4。  

                                         //1表示缩放键,变换数组的大小是3,它们分别对应x,y,z轴的缩放值。

                                        //2表示平移键,变换数组的大小是3,它们分别对应x,y,z轴的平移值。

                                        //4表示变换矩阵键。

10;                                 // 9 keys到第10帧回到第1帧

1000; 4; 0.000000, 0.15643448, 0.000000, 0.98768836;;,

2000; 4; 0.000000, 0.30901700, 0.000000, 0.95105654;;,

3000; 4; 0.000000, 0.45399046, 0.000000, 0.89100653;;,

4000; 4; 0.000000, 0.58778530, 0.000000, 0.80901694;;,

5000; 4; 0.000000, 0.70710671, 0.000000, 0.70710683;;,

6000; 4; 0.000000, 0.80901694, 0.000000, 0.58778530;;,

7000; 4; 0.000000, 0.89100653, 0.000000, 0.45399052;;,

8000; 4; 0.000000, 0.95105654, 0.000000, 0.30901697;;,

9000; 4; 0.000000, 0.98768836, 0.000000, 0.15643449;;,

10000; 4; 0.000000, 1.0000000, 0.000000, 0.00000000;;;

}

}

}

Frame Element_C0 {  //框架名  

 FrameTransformMatrix { //该框架相对于父框架的转移矩阵  

    8.811612,0.000000,0.000000,0.000000,0.000000,-0.113476,  

    8.810882,0.000000,0.000000,8.810882,0.113476,0.000000,  

    40.591251,15.394788,-25.943836,1.000000;;  

 }  

  

 Mesh  { //该框架对应的网格结构  

  943;  //顶点数目  

  0.169798;0.055004;0.729962;, //顶点坐标  

   ...                   //中间省去941个点  

   0.092184;-0.988528;0.119642;;  

631;//面个数  

  ...    //中间省去630个面  

   3;807,806,838;;//3表示面的顶点个数,后面的表示顶点索引  

  }  

  MeshNormals  {//网格中法线  

   839; //法线的数目  

   -0.927161;0.374254;0.017507;,//法线坐标  

   ...                     //中间省去837个  

   0.092184;-0.988528;0.119642;;  

   631;//面个数  

   3;0,1,2;,//每个面的三个顶点的法线索引  

   ...      //中间省去629个面顶点法线索引  

   3;807,806,838;;  

  }  

MeshMaterialList  {//网格的材质列表  

   1;   //材质数目  

   631; //面个数  

  ...       //每个面的材质索引  

   { Material__26 }//材质列表中的 材质  

  }  

  MeshTextureCoords  {//网格中的纹理坐标  

   943;     //943个纹理坐标  

    ...     //中间省略943个纹理坐标  

  }  

  XSkinMeshHeader {//网格中的蒙皮网格头  

   1;       //每个顶点最多收到多少骨骼影响  

   0;       //每个面最多收到多少骨骼影响  

   1;       //当前骨骼总数  

  }  

 SkinWeights {  

   “Bone07”;//骨骼名字  

   943;     //受骨骼影响的顶点数目  

   ...          //受该骨骼影响的顶点的 索引(943)  

   …            //该骨骼对每个顶点的影响权重(943)  

    -0.017844,0.000000,8.811594,0.000000,0.113475,8.810882,  

    0.000230,0.000000,8.810863,0.113476,0.017841,0.000000,  

    11.909699,-0.439056,0.166119,1.000000;;//骨骼偏移矩阵  

  }//end of SkinWeights  

 }//end of Mesh  

}//end of Frame Element_C0  

原文地址引用:http://blog.csdn.net/ddupd/article/details/17000613

比较懒,引用下网上大佬写的很好的文章。

本文只是引申,抛砖引玉的作用,主要围绕微软的X游戏格式文件的定义。常用的游戏一般也会保存相应的数据,包括顶点,顶点索引,法线,UV,蒙皮,骨骼动画信息,父子层级,(欧拉角,四元数,矩阵变换)等数据进行压缩,或者加密处理。

不同游戏也会把以上信息分别拆分到两个文件,比如会把骨骼动画单独作为一种文件,和顶点,三角面信息分开储存。

多数商业游戏,类似PS3,XBOX,PSP等模型信息都会封装一个包里,你先需要解包
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息