X文件格式
一、前导
怎样将现实中的一个物体,比如,一只花瓶,一个足球,甚至一架大的战斗机,在电脑屏幕上显示呢?我们一般会这样做:
1.先把该物体放在一个虚拟的三维坐标系中,该坐标称为局部坐标系(Local
Space), 一般以物体的中心作为坐标原点,采用左手坐标系。
2.然后,对坐标系中的物体进行点采样(Point Sample),这些采样点按一定
顺序连接成为一系列的小平面(三角形或共面的四边形,五边形等),
这些小平面称为图元(Primitive)。3D引擎会处理每一个图元,称为一个
独立的渲染单位。这样取样后的物体看起来像是由许许多多的三角形,
四边形或五边形组成的,就像网一样,我们称为一个网格(Mesh)。这个
采样过程又可称为物体的3D建模。当然现在都有功能非常强大的3D建
模工具,例如,3D Max, 3D Cool等建模工具,省去了我们这方面的许多
工作。
3.我们记录这些顶点数据和连线情况到一个文件中,3D引擎读取这些数据,
依次渲染每一个图元,就能在显示屏幕上再现物体。当然了,取样的点
越多,再现的物体也会越逼真,要处理的数据量也越大。
在D3D中,记录这些顶点数据和连线情况的文件称为X文件(X File)。它是以X作为文件名后缀的。这有点类似于2D中的位图文件。
二、文件简介
三维物体表面的各个剖分三角形构成了一个所谓的网格(Mesh),使用3D建
模软件绘制三维图像,可取得网格的顶点坐标,顶点纹理坐标以及三角形面的材质等数据,并可将这些数据保存到相应的三维图像文件中。此时调用DirectX提
供的网格接口函数,读取三维图像文件的顶点数据,就可对三维物体表面进行渲染处理。
在D3D中,X文件主要是用来存储网格数据的。当然不只是网格数据,它还用来存储有关纹理、动作及用户定义的对象的一些数据。
X文件格式是结构化的、上下文无关的文件格式。X文件还是模板驱动(Template-Driven)的,也就是说它存储数据的格式是基于模板的。这使得这种文件格式具有结构自由、内容丰富、易应用、可移植性高等优点。它可以被用在任何客户端程序,特别是应用于DirectX 3D保留模式,从而描述几何数据、框架层次和动作等。
三、保留字
以下为保留字,用于在模版中声明相应的数据,不能用作其他用途。
ARRAY 数组,后接类型,相当于C# 中的数组。
BYTE 字节,8位即一个字节,相当于C#中的byte。
BINARY
BINARY_RESOURCE
CHAR 字符,8位有符号数据,相当于C#中的sbyte。
CSTRING
DOUBLE 64位浮点数,相当于C#中的double。
DWORD 双字,表明该值是32位数据,相当于C#中的uint。
FLOAT 浮点数,相应于C#中的float。
SDWORD
STRING 字符串,需指定长度,相当于C#中的string。
SWORD
TEMPLATE 表示模版。
UCHAR 无符号字符,8位无符号数据,相当于C#中的byte。
ULONGLONG
UNICODE
WORD 字,表明该值是16位数据,相当于C#中的ushort。
四、注释
注释只存在于文本格式的X文件。注释可以出现在数据流的任何地方。注释以双斜线“//”或井号“#”开头。注释结束应换行表示下面的部分不是注释。
#This is a comment.
//This is another comment.
五、首部(Header)
首部是X文件起始的部分。可变长度,必须存在并且必须在文件的起始部分。总共16字节。
起始的4字节是魔数(magic number)“xof ”(空格有效,下同),表示这是一个真正的X文件。
接下来四个字节,两个字节是主版本号,另外两个字节是次版本号。例如:“0302”表示为版本3.2的X文件,“0303”为版本3.3的X文件。
接下来四个字节,表示数据格式类型,“txt ”代表文本文件格式,“bin ”
代表二进制文件格式。“tzip”为压缩文本文件,“bzip”为压缩二进制
文件。
最后四个字节,表示浮点数所点位数大小。“0032”表示一个浮点数的位数为32,如果想要用64位的浮点数,可以写成“0064”。
如果第一行的内容为“xof 0303bin 0032”,则表示该.X文件是一个二进制文件,此时将不能直接查看文件数据的含义。“xof 0303txt 0032”表示版本号为3.3的X文件,文本格式。
六、模版
1.简介
X文件格式包含了两个最基本的部分:用户自定义的数据类型和层级关系。X 文件是由模板(template)驱动的,模板定义了如何存储一个数据对象,这样用户便可以自己来定义具体的格式。模板定义了数据流是怎样被格式化的,也就是告诉你对于一个3D模型的各种数据,它们是以什么格式存放在数据流中的(这里指文件)。
预定义的模板位于rmxftmpl.h和rmxftmpl.x中,模板的标识符都在rmxfguid.h 中,通用文件d3dfile.cpp包含了这两个头文件。
模板所允许的数据类型被称为“可选成员(optional member)”,这些可选对象作为数据对象的子对象来保存。子对象可以是另一个数据对象,可以是对前一个数据对象的引用,也可以是一个二进制的对象。
在模板的数据中,要注意逗号和分号的使用。
模板格式
在X文件中,一般会有如下所示的格式:
unicode文件格式
template:该单词表示在此处将定义一个模版。
<template-name>:表示版本名,与template关键字用空格分开。版本名中的有效字符包括字母、数字和下划线“__”,不能以数字开头。
<UUID>:全局标示符,定义在“<”和“>”之间。
member:成员变量,类型+名称,用空格分开。类型参考上面的名留字部分。可定义多个成员,中间用分号分开。各个成员对象的类型可取为
WORD, DWORD, FLOAT, DOUBLE, CHAR,UCHAR, BYTE, STRING等。此外,
还可以使用如下的数组形式来说明模版中的数据对象。array <data-type>
<name>[<dimension-size>];array为数组的关键字,data-type为数组元素
的类型,name为数组的名字,dimension-size为数组的维数。
restrictions:约束,参考下面模版约束部分。
2.模板约束
These restrictions determine which data types may appear in the immediate hierarchy of a data object defined by the template.这些约束决定了哪些数据类型可能出现在由这个模版定义的数据对象所组成的当前层次中。根据模板约束的不同形式,我们可将模板分成以下三类:
✧开放式模板( Open Template ) 开放式模板指除了模板本身定义的成员
变量外,我们还可以向模板中添加其他的成员变量,来达到定制模板的
目的。用“[…]”(方括号加三个点)表示,如:
✧约束模板( Restricted Template ) 与开放式模板相比,我们只能向约束
模板中添加有限几种类型的数据成员,这些数据类型由模板枚举出来。
✧封闭式模板( Closed Template ) 与上面两种类型的模板相比,封闭式
模板的数据成员是固定的,我们不能向里面添加另外的成员。
3.DirectX文件模版
A.标题模版(Header)
是一个特殊的模版。建议每一个程序都要定义一个这样的模版,用来定义该程序的一些特殊信息,比如版本信息。
UUID。全局标示符,<3D82AB43-62DA-11cf-AB39-0020AF71E433 >(空格是没有的,下同,并且不再列出UUID)。
major。大版本号,
minor。小版本号。
flags。标志。
如果存在这个模版的数据对象,那么这个数据就会被DirectX文件格式API 所读取。如果flags成员存在,那么它会被用来表明下面的数据是怎么解释的。如果需要定义flags成员,那么它必须是DWORD类型。一位已经被定义—bit 0。如果这一位被清除,文件中下面的数据就是二进制的;如果设定,则是文本格式。Multiple header data objects can be used to switch between binary and text within the file.
B.向量模版(Vector)。
定义一个向量 ( x , y , z)。
UUID。全局标志符。
x.X轴数据。
y.Y轴数据。
z.Z轴数据。
C.二维向量模版(oords2d)。
定义一个二维向量( u  ,  v)。主要是用来定义网格纹理的坐标。
UUID。全局标示符。
u.纹理图片上的水平位置的比例,大于0小于1。
y.纹理图片上的垂直位置的比例,大于0小于1。
D.四元数模版(Quaternion)。
定义一个四元数。当前在X文件中并未使用。
UUID。全局标示符。
s.齐次坐标。
v.三维向量,参考上面定义。
E.矩阵4X4模版(Matrix4X4)。
定义一个4X4矩阵。由包含16个浮点数的数组表示。经常用于表示框架的转换矩阵。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。