关于COLLADA逻辑的一些说明

时间:2013-11-05 02:47:58

标签: c++ opengl 3d format collada

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

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

当然我没有采用正确的坐标,或者至少我没有正确实现它们。 Here是我正在测试的COLLADA文件。简而言之,我正在做的是以下内容:

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

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

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

4 - 之后我开始循环遍历“p”值从3到3(相当于“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}

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

2 个答案:

答案 0 :(得分: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(实际上,所有这些都是),这构成了你的第一个三角形。

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

<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)。请注意,步幅不一定是每个顶点中元素的数量,尽管通常是这种情况。

因此,在结束该示例时,要读取普通数组的索引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本身不支持的。将这些不同的问题视为参考资料。

Rendering meshes with multiple indices

How to use different indices for tex coords array and vertex array using glDrawElements

3 index buffers

答案 1 :(得分:0)

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