C++ OpenGL 错误的 Collada 纹理坐标

标签 c++ opengl coordinates textures collada

我正在解析动画的 Collada 文件。我已经很好地绘制了它并进行了动画处理,但现在的问题是如何设置纹理坐标。我按照 collada dae 文件将其提供给我的方式将其提供给 OpenGL,但其映射完全错误。坐标范围为[0-1]。

我需要重新排列吗?

如果我这样做,请向我解释如何去做。我尝试使用 GL_LINEAR 和 GL_NEAREST 但它不能解决问题。有什么想法吗?

我使用的型号是AstroBoy http://www.wazim.com/Collada_Tutorial_1.htm给出和失忆仆人咕噜声。

最佳答案

根据你所说的结果,它被映射完全错误,我猜你没有考虑纹理索引值。我也遇到了类似的问题(尽管模型不同)。就像您可以拥有一个索引值数组以便 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 方面过于复杂,但你不能真正做到这一点采取任何措施。)

关于C++ OpenGL 错误的 Collada 纹理坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14369349/

相关文章:

c++ - Qt中需要释放slot参数的资源吗?

c++ - 这个给定数据结构的时间复杂度

c++ - 在某些情况下重定向子进程的 STDOUT 时应用程序卡住

c++ - 如何最好地封装窗口句柄?

ios - 缩放工具在 map 上的当前查看坐标

java - 面板的绘制组件不绘制双点值

python - 给定两个元组列表找到它们之间最近的元组(dist

python - 如何从两个版本之间的 Perforce 差异中获取 C/C++ 函数名称

c++ - QQuickView 上未触发触摸事件

c++ - 如何在 OpenGL 中改变颜色?