.dae文件如何存储网格数据?

时间:2013-10-11 20:05:08

标签: c++ xml collada

我正在尝试使用TinyXML从.dae文件到DirectX项目的网格中读取,并且我很难理解.dae文件如何存储网格数据。

我相信我已找到存储网格数据的位置:标记<library_geometries>内有以下代码:

<library_geometries>
    <geometry id="Tall_bodyShape" name="Tall_bodyShape">
        <mesh>
            <source id="Tall_bodyShape-positions" name="position">
                <float_array id="Tall_bodyShape-positions-array" count="2910"> *** lots of numbers *** </float_array>
                <technique_common>
                    <accessor source="#Tall_bodyShape-positions-array" count="970" stride="3">
                        <param name="X" type="float"/>
                        <param name="Y" type="float"/>
                        <param name="Z" type="float"/>
                    </accessor>
                </technique_common>
            </source>
            <source id="Tall_bodyShape-normals" name="normal">
                <float_array id="Tall_bodyShape-normals-array" count="3948"> *** lots of numbers *** </float_array>
                <technique_common>
                    <accessor source="#Tall_bodyShape-normals-array" count="1316" stride="3">
                        <param name="X" type="float"/>
                        <param name="Y" type="float"/>
                        <param name="Z" type="float"/>
                    </accessor>
                </technique_common>
            </source>
            <source id="Tall_bodyShape-UVChannel_1" name="UVChannel_1">
                <float_array id="Tall_bodyShape-UVChannel_1-array" count="2892"> *** lots of numbers *** </float_array>
                <technique_common>
                    <accessor source="#Tall_bodyShape-UVChannel_1-array" count="1446" stride="2">
                        <param name="S" type="float"/>
                        <param name="T" type="float"/>
                    </accessor>
                </technique_common>
            </source>
            <vertices id="Tall_bodyShape-vertices">
                <input semantic="POSITION" source="#Tall_bodyShape-positions"/>
            </vertices>
            <triangles material="Tall_bodySG" count="1883">
                <input semantic="VERTEX" source="#Tall_bodyShape-vertices" offset="0"/>
                <input semantic="NORMAL" source="#Tall_bodyShape-normals" offset="1"/>
                <input semantic="TEXCOORD" source="#Tall_bodyShape-UVChannel_1" offset="2" set="0"/>
                <p> *** lots of numbers *** </p>
            </triangles>
        </mesh>
        <extra>
            <technique profile="MAYA">
                <double_sided>1</double_sided>
            </technique>
        </extra>
    </geometry>
</library_geometries>

因此,verticies存储在名为<source>的{​​{1}}标记内,法线存储在名为"position"的{​​{1}}标记和<source>标记列表中哪个UV坐标和法线与哪个顶点相关联。

我认为三角形是以“直线”或“剥离”的方式列出的,但它并没有说出我尝试的哪一个,它们都显示出锯齿状,乱七八糟的三角形。

有没有人知道是否有其他网格数据我错过了在dae的另一部分或我可能出错的地方?如有必要,我可以发布我在网格数据中加载的函数。

编辑:补充说明:我确定.dae文件是正确有效的,因为它可以正确加载到PhyreEngine中(我使用的是去年用于大学项目的.dae)。 / p>

2 个答案:

答案 0 :(得分:3)

我意识到这是一个相对古老的问题,但由于它还没有真正得到回答,我会为后人采取行动。

你是正确的,位置,法线等作为浮点数组存储在<source>元素中。 <p>(&#34; primitive&#34;)元素存储紧接在<triangles>元素之前列出的三个输入的索引。也就是说,前3个整数(例如&#34; 0 0 0&#34;)指向第一个顶点的相应VERTEX,NORMAL和TEXCOORD(UVChannel)值。它在<triangles>元素中表示每组3个顶点(9个索引整数)描述了一个新的三角形,因此没有一个索引被重用。如果几何体设置为使用条带(重用前两个顶点)或扇形(重复使用第一个和前一个顶点),则父元素将分别称为<tristrips><trifans>。第二组3个整数(例如&#34; 1 1 1&#34;)描述第一个三角形中的第二个顶点,依此类推。

此外,正如@jterrace指出的那样,几何坐标是几何中描述的对象的内部。要将对象作为一个整体正确放置在场景中,您必须按照<translate>中的说明从场景中应用适当的转换(<rotate><library_visual_scenes>等)。

答案 1 :(得分:2)