0

我正在使用 C++/OpenGL 上的 3d 地图生成器平台,在完成 Perlin 的噪声之后,我需要将一些 3d 模型加载到我的屏幕中。在阅读它之前和之后我从未尝试过它,我决定使用 COLLADA 的模型格式。我做的第一件事是通过 TinyXML 读取 XML 文件并将其转换为我的代码中可理解的类。我可以毫无问题地访问所有内容。到目前为止一切都很好,但是当我尝试在 3d 静态模型中正确转换 XML 信息时,问题出现了。我阅读了很多关于的教程,但我认为我没有抓住 COLLADA 的“精髓”,然后我在这里寻求帮助。我的“.dae”文件包含一个在 Blender 上创建的简单球体。不管我做什么,

http://s2.postimg.org/4fdz2fpl4/test.jpg

当然,我没有采用正确的坐标,或者至少我没有正确实施它们。 正是我正在测试的 COLLADA 文件。简而言之,我正在做的事情如下:

1 - 首先我访问“polylist”并获取“p”的值,也是语义为 VERTEX 的 ID,在本例中为“ID2-mesh-vertices”

2 - 我访问“顶点”并获取语义为 POSITION 的源 ID,在本例中为“#ID2-mesh-positions”

3 - 我访问源“#ID2-mesh-positions”并获取浮点值

4 - 之后,我开始循环遍历从三到三的“p”值(根据“technique_common”),分别获取位于源浮点值内的顶点 X、Y 和 Z 的索引。例如,代码的作用 =>

  • 0 0 1 = {X -> 0.4330127;Y -> 0.4330127; Z -> 0.25}
  • 1 2 2 = {X -> 0.25;Y -> 0; Z -> 0}
  • 1 1 0 = {X -> 0.25;Y -> 0.25; Z -> 0.4330127}

显然我做错了什么,因为我无法得到一个简单的球体。

4

2 回答 2

0

使用 collada de-indexer 预处理 .dae 并消除每个顶点的多个索引。当您使用它时,在预处理中转换为三角形以进一步简化您的加载器。 https://collada.org/mediawiki/index.php/COLLADA_Refinery

于 2013-11-15T20:08:42.707 回答
0

*

<input semantic="VERTEX" source="#ID2-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#ID2-mesh-normals" offset="1"/>

这告诉您,对于每个顶点,您有 2 个索引指向引用的源。0 0是第一组,1 1是第二组,2 2是第三组。因为您的第一个 polylist 值是 3(实际上,它们都是),所以构成了您的第一个三角形。

现在,这些索引正在通过浮点数组的源访问器......

<accessor source="#ID2-mesh-normals-array" count="266" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>

这告诉您,要读取与索引关联的法线,您必须将数组跨步 3 个元素,并且每个向量由 3 个浮点数(X、Y、Z)组成。请注意,stride 不一定是每个顶点中元素的数量,尽管通常是这样。

因此,总结该示例,要读取普通数组的索引 2,您需要读取以 为索引的元素X_index=index*stride=6, Y_index=X_index+1=7, Z_index=X_index+2=8,以找到普通数组(X,Y,Z) = (-0.2561113 0 -0.8390759 -0.4953154)

是的,这意味着每个顶点有多个索引,这是 OpenGL 本身不支持的。将这些不同的问题视为参考资料。

渲染具有多个索引的网格

如何使用 glDrawElements 对 tex 坐标数组和顶点数组使用不同的索引

3 个索引缓冲区

于 2013-11-05T08:42:08.567 回答