没有合适的资源?快使用搜索试试~ 我知道了~
DirectX 文件 .x解析文件
需积分: 5 1 下载量 17 浏览量
2022-11-17
20:43:54
上传
评论
收藏 587KB PDF 举报
温馨提示
试读
34页
DirectX 文件 .x解析文件
资源推荐
资源详情
资源评论
在三维图形程序设计中,网格模型占有非常重要的地位,而且也是比较复杂的部
分,特别是包含动画和蒙皮信息的网格模型。
.x 文件格式分析
.x 文件格式最初是为传统的 Direct3D 保留模式而设计的,在 DirectX 6.0 问世
后,针对立即模式对它作过一次扩展。要想在 Direct3D 程序中灵活自如地使用
网格模型,应当深入理解.x 文件格式。
.x 文件是由模板(template)驱动的,模板定义了如何存储一个数据对象,这
样用户便可以自己定义具体的格式。Direct3D 预定义了许多模板,这些预定义
的模板位于 rmxftmpl.h 中,模板标识符都在 rmxfguid.h 中,通用文件
DXUTMesh.cpp 包含了这两个头文件。模板所允许的数据类型称为可选成员
(optional member),这些可选成员作为数据对象的子对象来保存,子对象
可以是另一种数据类型或对先前数据对象的引用,或是一个二进制对象。
来看一个.x 文件(cube_1.x)的完整内容:
xof 0302txt 0064
Header {
1;
0;
1;
}
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;;
}
该模型的效果图如下:
第一行文件头中的 "xof"告诉程序,它加载的文件是一个.x 文件,"0302"表示它
使用的是 DirectX 3.2 版本的模板,"txt"表示这些数据是以文本形式存储的,
"0064"定义了浮点数的位数是 64 位。
文件头后面的一个数据块涉及了模板和数据对象等内容。一个模板和一个数据对
象之间的差异在于所有的模板都是以一个 template 单词开始,模板看起来很像
一个 C 语言的结构定义,数据对象就是那些模板的实例。使用模板定义包含在.x
文件里的数据对象(一个模板定义了数据对象的布局),每个模板都可以通过一
个数据类型的集合去定义并容纳任何类型的数据。同时,任何数据类型的组合都
可以在一个模板里使用。
模板 header 的定义如下:
template Header {
<3D82AB43-62DA-11cf-AB39-0020AF71E433>
WORD major;
WORD minor;
DWORD flags;
}
各成员分别表示.x 文件最大版本,最小版本,以及定义方式。
.x 文件中涉及模板的概念,它由四部分组成:第一部分是模板的名字,可是由
数字、字符、下划线构成,但不能以数字开头,第二部分是 GUID(Global Unique
Identifier,全局唯一标识符),第三部分由各个数据项构成,最后一部分用于
控制模板的限制程度,一个模板可以是开放的、闭合的或受限的。开放模板的定
义在结束部位有一个待展开的方括号[...]表示它可以包含其他数据类型,封闭模
板不能包含其他任何数据类型,受限模板只能包含特定的数据类型。模板的使用
与结构体有相似之处。
一般情况下,.x 文件都至少包含一个 Mesh 模板,其定义如下:
template Mesh
{
<3D82AB44-62DA-11CF-AB39-0020AF71E433>
DWORD nVertices;
array Vector vertices[nVertices];
DWORD nFaces;
array MeshFace faces[nFaces];
[...]
}
Where:
nVertices - Number of vertices.
array Vector vertices[nVertices] - Array of vertices, each of type
Vector.
nFaces - Number of faces.
array MeshFace faces[nFaces] - Array of faces, each of type
MeshFace.
[ ... ] - Any .x file template can be used here. This makes the
architecture extensible. Material and TextureFilename templates are
typically used.
Mesh 模板是一个开放的模板,同时它还用到了 Vector 模板和 MeshFace 模板,
它们的定义如下:
Defines a vector.
template Vector
{
< 3D82AB5E-62DA-11cf-AB39-0020AF71E433 >
float x;
float y;
float z;
}
template MeshFace
{
< 3D82AB5F-62DA-11cf-AB39-0020AF71E433 >
DWORD nFaceVertexIndices;
array DWORD faceVertexIndices[nFaceVertexIndices];
}
Where:
nFaceVertexIndices - Number of indices.
array DWORD faceVertexIndices[nFaceVertexIndices] - Array of
indices.
因为没有为网格模型设置材质和纹理等信息,所以该文件显示效果是一个黑色立
方体,接下来将为该立方体添加材质、法线和纹理信息。
我们在 cube_1.x 的基础上添加材质、法线和纹理,构成 cube_2.x:
效果图如下:
可以看到在 Mesh 模板中嵌套着一个子模板 MeshMaterialList,它是 Mesh 模
板的一部分,用来将每个面与材质相关联,其定义如下:
template MeshMaterialList
{
< F6F23F42-7686-11CF-8F52-0040333594A3 >
DWORD nMaterials;
DWORD nFaceIndexes;
array DWORD faceIndexes[nFaceIndexes];
[Material <3D82AB4D-62DA-11CF-AB39-0020AF71E433>]
}
Where:
nMaterials - A DWORD. The number of materials.
nFaceIndexes - A DWORD. The number of indices.
faceIndexes[nFaceIndexes] - An arrray of DWORDs containing the
face indices.
MeshMaterialList 是一个受限的模板,它只能包含 Material 模板,其定义如下:
template Material
{
< 3D82AB4D-62DA-11CF-AB39-0020AF71E433 >
剩余33页未读,继续阅读
资源评论
netweather
- 粉丝: 11
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功