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文件,如下图所示,红色方框中能清楚地看到坦克模型的层级关系:

DeepExploration中观察层次结构

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

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号