微软游戏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等模型信息都会封装一个包里,你先需要解包
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等模型信息都会封装一个包里,你先需要解包
相关文章推荐
- 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~四 分部方法从另一方面定义了类型的操作规范
- C++:为什么inline函数的定义要放在头文件里 + inline和宏定义的区别(暂未体会到)
- 我们爱分享----在MyEclipse 中添加自己定义的文件模版
- [转]C++学习:防止变量重复定义;头文件重复包含、嵌套包含
- C# 3.0 语言定义文档(微软官方版)正式发布!
- 微软IE 8提示“无效图片文件”怎么办?-
- c++ 模板类 声明和定义都放在.h文件的原因
- 【iOS-Cocos2d游戏开发】使用Zwoptex生成plist文件
- 通过配置tomcat的service文件来自定义项目浏览路径
- cctype 头文件定义函数实例
- 在PHP中,通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。如果要转换文件大小的单位,可以自己定义函数来实现。
- 使用easyui-combobox的data属性加载定义好在*.js文件中的JSON数据的问题
- 为什么.h文件中不能定义全局变量
- 头文件中定义变量和声明变量的方法
- GOOGLE地球浏览器分析(三):KML文件的定义
- 补充程序之游戏系列— 3 多文件组织多个类的程序
- 电视游戏末日来临?微软索尼谁能绝地反击
- PHP获取指定函数定义在哪个文件中及行号
- [C/C++]在头文件中使用static定义变量意味着什么
- 在布局文件中为 Activity 定义片段--frgament