X文件的导出系列3——层级模型
层级模型的导出
在3DS中分别建立一个长方体(命名为Body)作为车身,一个圆柱形(命名为Turret)作为炮塔,一个长圆柱形(命名为Gun)作为炮管,并将三者移至适当位置组成一辆坦克:

选择炮塔,点击工具栏上的“选择并链接”,将鼠标拖动到车身上释放,这时车身会闪一下,说明炮塔已正确地链接到了车身上。用同样的方法将炮管链接到炮塔上。

做完此步后,你也可以点击工具栏上的“图解视图”观察链接关系:

“图解视图”如下图所示,可见Body是Turret的父,Turret是Gun的父。

然后导出为x文件,相对于系列2,X File Settings中要选择“Sub frame hierarchy(输出子框架层次)”,其他不做变动,将文件命名为“Tank.x”。

在DirectX Viewer中不能看到层级关系,所以推荐使用“Deep Exploration”观察导出的x文件,如下图所示,红色方框中能清楚地看到坦克模型的层级关系:

X文件的结构
源文件太长,下面只说变动的地方。
模板
Frame模板:
template Frame
{
<3d82ab46-62da-11cf-ab39-0020af71e433>
[...]
}
矩阵模板:
template Matrix4x4
{
<f6f23f45-7686-11cf-8f52-0040333594a3>
array FLOAT matrix[16];
}
Frame的变换矩阵模板:
template FrameTransformMatrix
{
<f6f23f41-7686-11cf-8f52-0040333594a3>
Matrix4x4 frameMatrix;
}
数据
为了表示一个物体的多个部件之间的阶层关系,.x文件使用Frame模板定义物体的每个部件,例如,坦克包括车身Body、炮塔Turret和火炮Gun三个Frame模板。一个Frame模板由两个子模板组成:FrameTransformMatrix和Mesh。Mesh模板定义部件的顶点的坐标、材质、法线、纹理等属性。FrameTransformMatrix模板定义部件初始世界变换矩阵。 esh中定义的3D物体的所有顶点乘以世界初始变换矩阵,得到Mesh中表示的3D物体的初始位置。每一个Frame部件都有初始世界变换矩阵。使用初始世界变换矩阵,可以把.x文件中所有部件所代表的3D物体,摆放到合适的位置,形成指定形状,例如,Tank.x文件中,通过使用初始世界变换矩阵,把立方体、短圆柱和长圆柱摆放为坦克形状。一个部件的完整世界变换矩阵定义如下:
部件完整变换矩阵=部件初始变换矩阵*部件运动变换矩阵*部件父部件运动变换矩阵
由立方体、短圆柱和长圆柱组成的坦克的Tank.x文件如下:
Frame Body //Frame模板,名称为Body,定义坦克车身
{
FrameTransformMatrix //坦克车身的初始世界变换矩阵
{
0.000000,-1.000000,0.000000,0.000000,
0.000000,0.000000,-1.000000,0.000000,
1.000000,0.000000,0.000000,0.000000,
0.000000,0.000000,50.000000,1.000000;;
}
Mesh //坦克车身Mseh模板
{
20;
-12.500000;0.000000;-37.500000;,
… //以下数据省略
}
Frame Turret //Frame模板,名称为Turret,定义炮塔
{
FrameTransformMatrix //炮塔的初始世界变换矩阵
{
0.000000,-0.000000,1.000000,0.000000,
-1.000000,-0.000000,0.000000,0.000000,
0.000000,-1.000000,-0.000000,0.000000,
-12.500000,50.000000,-0.000003,1.000000;;
}
Mesh //炮塔的Mseh模板
{
40; 0.000000;0.000000;0.000000;,
…//以下省略
}
Frame Gun //Frame模板,名称为Gun,定义火炮
{
FrameTransformMatrix //火炮的初始世界矩阵
{
1.000000,-0.000000,0.000000,0.000000,
0.000000,-0.000000,-1.000000,0.000000,
0.000000,1.000000,-0.000000,0.000000,
-0.000000,12.5,-27.0,1.000000;;
}
Mesh //火炮的Mesh模板
{
16; 0.000000;0.000000;0.000000;,
…//以下省略
}
}
}
}
由Tank.x文件可以看出,具有层级关系的物体包括多个Frame模板,其中必须有一个根模板(这里是Body)。每一个模板还可以有兄弟模板和子模板。.x文件用嵌套的方法表示Mesh对象的层次关系。
发布时间:2009/6/8 上午8:50:30 阅读次数:11469
