原文发布时间:2014/12/5 10:06:43
作者:小C
众所周知,FME具有强大的格式转换功能,无论是二维的,还是三维的数据格式。现在我们来看看,FME支持的.x这种三维文件格式,FME读模块和写模块都支持这种格式。
.X文件格式是DirectX(Direct eXtension)的一种文件格式。DirectX是由微软公司创建的多媒体编程接口,由C++编程语言实现,遵循COM。以X为文件扩展名的文件是微软定义的文件格式,用来存放3D模型.X文件有文本和二进制两种存储形式。.X文件内部结构如下:Frame定义框架容器,用来装Mesh对象。可以包含多个Mesh对象,也可以包含子框架。
下面是用FME生成的一个.X文件,我们先用FME Data Inspector打开该文件:
上图显示了该三维模型的几何对象图形要素以及属性信息,下面我们来进一步观察其几何对象特性信息。该模型是由3D IFMEMesh几何对象组成的,节点池由8个节点组成,8个节点法向:
12个mesh部分组成,每个部分的前面外观用颜色显示,其值如下:
现在我们用文本的方式打开该文件格式:
xof 0303txt 0032
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];
}
template Mesh{
<3d82ab44-62da-11cf-ab39-0020af71e433>
DWORD nVertices;
array Vector vertices[nVertices];
DWORD nFaces;
array MeshFace faces[nFaces];
[...]
}
template MeshNormals {
<f6f23f43-7686-11cf-8f52-0040333594a3>
DWORD nNormals;
array Vector normals[nNormals];
DWORD nFaceNormals;
array MeshFace faceNormals[nFaceNormals];
}
template ColorRGBA {
<35ff44e0-6c7c-11cf-8f52-0040333594a3>
FLOAT red;
FLOAT green;
FLOAT blue;
FLOAT alpha;
}
template ColorRGB{
<d3e16e81-7835-11cf-8f52-0040333594a3>
FLOAT red;
FLOAT green;
FLOAT blue;
}
template Material {
<3d82ab4d-62da-11cf-ab39-0020af71e433>
ColorRGBA faceColor;
FLOAT power;
ColorRGB specularColor;
ColorRGB emissiveColor;
[...]
}
template MeshMaterialList {
<f6f23f42-7686-11cf-8f52-0040333594a3>
DWORD nMaterials;
DWORD nFaceIndexes;
array DWORD faceIndexes[nFaceIndexes];
[Material <3d82ab4d-62da-11cf-ab39-0020af71e433>]
}
Mesh {
8;
36621192.000000;424.299988;3117173.75;,
36621516.000000;424.299988;3116752.00;,
36621812.000000;469.33627;3117001.00;,
36620888.000000;424.299988;3116935.25;,
36621192.000000;427.299988;3117173.75;,
36621812.000000;472.33627;3117001.00;,
36621516.000000;427.299988;3116752.00;,
36620888.000000;427.299988;3116935.25;;
12;
3;0,1,2;,
3;0,3,1;,
3;2,4,0;,
3;2,5,4;,
3;1,6,2;,
3;2,6,5;,
3;3,7,1;,
3;1,7,6;,
3;0,7,3;,
3;0,4,7;,
3;4,6,7;,
3;4,5,6;;
MeshNormals {
8;
-0.143195;-0.621969;0.769838;,
0.189088;-0.637996;-0.746463;,
0.844171;-0.502361;0.187105;,
-0.819048;-0.551516;-0.158082;,
-0.164025;0.614018;0.772061;,
0.782009;0.600960;0.165255;,
0.138553;0.588690;-0.796396;,
-0.819051;0.551515;-0.158071;;
12;
3;0,1,2;,
3;0,3,1;,
3;2,4,0;,
3;2,5,4;,
3;1,6,2;,
3;2,6,5;,
3;3,7,1;,
3;1,7,6;,
3;0,7,3;,
3;0,4,7;,
3;4,6,7;,
3;4,5,6;;
}
MeshMaterialList {
1;
12;
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0;
Material {
0.333333;1.000000;1.000000;1.000000;;
1.000000;
1.000000;1.000000;1.000000;;
0.000000;0.000000;0.000000;;
}
}
}
从上面这个数据我们就可以更清楚的认识到.x这种格式的内部结构:
Mesh 对象
定义一个Mesh对象。
共有9个部分组成:
1、包含的顶点数;
2、顶点列表,一个顶点包含三个浮点值;
3、面数 ;
4、面的顶点索引列表,每个面包含三个顶点;
5、MeshFaceWraps结构,暂时无用 ;
6、MeshTextureCoords纹理坐标,可选 ;
7、MeshNormals法向,可选;
8、MeshVertexColors顶点颜色,默认为白色;
9、MeshMaterialList材质,不提供的话默认为白色 。
若对文章有疑问,可发送邮件至[email protected]提问或讨论。