对科拉达逻辑的一些了解

Some light on COLLADA's logic

本文关键字:了解      更新时间:2023-10-16

我正在C++/OpenGL上的三维地图生成器平台上工作,在完成Perlin的Noise之后,我需要将一些三维模型加载到我的屏幕中。我以前从未尝试过,在读到它之后,我决定使用COLLADA的模型格式。我做的第一件事是通过TinyXML读取XML文件,并将其转换为代码中可理解的类。我可以毫无问题地访问所有内容。到目前为止一切都很好,但当我试图在三维静态模型中正确转换XML的信息时,问题就出现了。我读了很多关于的教程,但我觉得我没有领会COLLADA的"精髓",然后我在这里寻求帮助。我的".dae"文件由一个在Blender上创建的简单球体组成。我做什么并不重要,每当我试图把它加载到屏幕上时,我得到的总是一件"棘手的事情",比如下图:

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

当然,我没有得到正确的坐标,或者至少我没有正确地实现它们。这正是我正在测试的COLLADA文件。简而言之,我正在做的是:

1-首先我访问"polylist"并获得"p"的值,也是语义为VERTEX的ID,在这种情况下为"ID2网格顶点">

2-我访问"顶点"并获得语义为POSITION的源ID,在这种情况下为"#ID2网格位置">

3-我访问源"#ID2网格位置"并获取浮动值

4-之后,我开始循环从三到三的"p"值(相应于"technique_common"(,以分别获得位于源浮点值内的顶点X、Y和Z的索引。例如,代码的作用=>

  • 0 0 1={X->0.4330127;Y->0.433027;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}

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

*

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

因此,为了总结这个例子,要读取正常数组的索引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个索引缓冲区

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