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 阅读次数:10635