gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:38:08 24 4
gpt4 key购买 nike

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

最佳答案

我意识到这是一个相对较老的问题,但由于尚未真正得到解答,我会为后代解决这个问题。

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

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

关于c++ - .dae 文件如何存储网格数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19326366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com