【问题标题】:C++ OpenGL Wrong Collada Texture CoordinatesC++ OpenGL 错误的 Collada 纹理坐标
【发布时间】:2012-12-31 10:01:28
【问题描述】:

我正在为动画解析 Collada file。我已经把它画好了,动画效果很好,但现在的问题是如何设置纹理坐标。我将它提供给OpenGL,正是 collada dae 文件将它提供给我的方式,但它的映射完全错误。坐标范围为[0-1].

我必须重新排列吗?

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

我使用的模型是http://www.wazim.com/Collada_Tutorial_1.htm提供的AstroBoy和Amnesia Servant Grunt。

【问题讨论】:

    标签: c++ opengl coordinates textures collada


    【解决方案1】:

    根据你所说的结果是完全错误的映射,我猜你没有考虑纹理索引值。我也有类似的问题(尽管有不同的模型)。就像您可以拥有一个索引值数组以便 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 来说过于复杂,但你不能真的做任何事情。)

    【讨论】:

    • 感谢您的回复。我完全明白。对于失忆症模型,索引到处都是,所以我订购了它们,但它们的映射仍然不正确。对于 AstroBoy,它们从头到尾已经被正确索引,但由于某种原因它们也没有正确映射。因此,如果我了解您的第一个索引是“169”,那么这意味着我应该在索引“169”处获得法线和纹理,对吗?因为这就是我正在做的事情。
    • @Jose 紧跟在&lt;p&gt; 之后的169 表示第一个顶点(-167.172180、-193.451920、11.675772)在索引 169 处。0 然后表示第一个法线( -0.000000, -0.025202, -0.999682) 在索引 0 处,然后171 表示第一个 UV (0.000000 0.000000) 属于索引 171。紧随其后的170 表示第二个顶点 (167.172180, -193.451920, 11.675772) 属于索引 170,second normal(也是 -0.000000 -0.025202 -0.999682)属于索引 1,second UV-coord (1.000000 0.000000) 属于索引 172,依此类推...
    • 网站上似乎有很多关于如何做到这一点的帖子和问题,我很困惑为什么首先做出这个决定(结合索引)。规范中是否有特定部分对此进行了专门的布局和描述?我如何得出结论,它是由 [(vns) (vnt) (vn)][...] 划分的,至少这是我在阅读一些站点后假设的前两个序列中的 S 和 T,而不是[(vnt) (vnt) (vnt)][...] 等等,如此处所述。
    【解决方案2】:

    不,我建议你阅读一些collada的基础知识。

     <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......
    

    169是三角形的第一个点索引,0是第一个法线索引,171是第一个texcoord索引,依此类推。

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 2012-03-06
      • 2012-04-08
      • 1970-01-01
      相关资源
      最近更新 更多