2

我正在尝试使用 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>

因此,顶点存储在<source>名为 的标签"position"内,法线存储在<source>名为"normal"的标签内,<triangles>标签列出了哪些 UV 坐标和法线与哪个顶点相关联。

我认为三角形是以“线”或“剥离”方法列出的,但它并没有说明我尝试了哪个以及哪个,它们都显示出锯齿状的、球形的三角形混乱。

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

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

4

2 回答 2

3

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

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

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

于 2014-05-24T04:36:08.353 回答
2

我使用 assimp 加载网格数据。解释和代码在这里: http ://www.youtube.com/watch?v=ClqnhYAYtcY http://www.mediafire.com/download/006lk0xomup7laq/assimpLinux.zip

于 2013-10-11T21:01:12.200 回答