根据您所说的结果是完全错误的映射,我猜您没有考虑纹理索引值。我也有类似的问题(尽管有不同的模型)。就像您可以拥有一个索引值数组以便 OpenGL 知道绘制顶点的顺序一样,Collada 也会分配 UV 索引值(和正常索引值),而且令人讨厌的是,它们的顺序永远不会相同。以以下 Collada 示例为例:
<source id="Box001-POSITION">
<float_array id="Box001-POSITION-array" count="1008">
-167.172180 -193.451920 11.675772
167.172180 -193.451920 11.675772 .....
....
....
<source id="Box001-Normal0">
<float_array id="Box001-Normal0-array" count="5976">
-0.000000 -0.025202 -0.999682
-0.000000 -0.025202 -0.999682 .....
....
....
<source id="Box001-UV0">
<float_array id="Box001-UV0-array" count="696">
0.000000 0.000000
1.000000 0.000000
0.000000 1.000000 .....
....
....
<triangles count="664" material="_13 - Default">
<input semantic="VERTEX" offset="0" source="#Box001-POSITION"/>
<input semantic="NORMAL" offset="1" source="#Box001-Normal0"/>
<input semantic="TEXCOORD" offset="2" set="0" source="#Box001-UV0"/>
<p> 169 0 171 170 1 172 171 2 173 171 3
173 168 4 170 169 5 171 173 6 175 174
7 176 175 8 177 175 9 177 172 10 174 173 11 175 108 ....
前三个部分表示顶点/法线/纹理坐标的值,但最后部分表示每个值的索引。注意第一个顶点索引是 169,但第一个法线索引是 0。事实上,法线索引是完全正常的,它们进展为“0..1..2..3”,但顶点和纹理的索引到处都是!您必须按照 Collada 文件指定的方式对顶点和纹理值进行排序。
另一种方法是编写一个小程序来解析 collada 文件并根据索引值将所有顶点、法线和 UV 值重新排列为正确的顺序。然后,您可以直接将您的观点输入 OpenGL,无需提出任何问题。当然,这取决于你,你想用哪种方式处理它。
(PS:如果你可以为 Collada 文件制作一个好的解析器,那么“交错索引”实际上非常方便,如果不是,我发现它对 Collada 来说过于复杂,但你真的无能为力它。)