对科拉达逻辑的一些了解
Some light on COLLADA's logic
我正在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
- 正在尝试了解输入验证循环
- 了解 GLM- openGL 中的相机转换
- C++我需要了解在哪里使用指针和双指针
- 如何深入了解明显的腐败
- 了解嵌套循环打印星号图案
- 了解每月第一天函数的代码
- 了解C++标准::shared_ptr
- 尝试了解在导入的静态方法上使用删除方法时的错误
- C++:需要帮助了解运算符重载错误
- 在学习数据结构之前对STL有一个了解是好的吗?
- 了解算法的性能差异(如果以不同的编程语言实现)
- 了解删除C++
- 了解内存序列和标准::memory_order_relaxed
- 了解其工作原理
- 准确了解对象在内存中的映射方式
- 了解C++如何返回引用并绑定到引用
- 了解提升执行器示例
- 了解运算符重载和迭代器,为什么它会打印出"wrhrwwr"?
- 了解是否接受套接字
- 了解布尔运算符==(参数 1,参数 2)