解析Wavefront .obj纹理坐标的麻烦

时间:2012-01-12 15:11:37

标签: parsing opengl-es-2.0 textures wavefront uv-mapping

我在objc中为OpenGL ES 2.0编写自己的.obj解析器,以便更好地理解这个OpenGLES的工作原理。加载顶点并在其上显示具有顶点颜色的模型就像一个魅力。只是一个小小的注释:我正在使用索引缓冲区。

真正的问题是纹理atm的映射。正如你在下面看到的更多一点,我的纹理没有按照应有的方式进行映射。

以下是我认为.obj格式的工作原理,如果我错了,请纠正我:“f”-lines描述一个面,斜杠前面的数字定义顶点的索引和斜杠定义后的数字纹理坐标。

考虑以下.obj文件(由Cinema 4D导出):

v -75 75 -50
v 75 75 -50
v -75 -75 -50
v 75 -75 -50

vt 0 0
vt 0 1
vt 1 1
vt 1 0

f 4/3 3/2 1/1
f 2/4 4/3 1/1

以下纹理:

512x512 Texture

现在,当我将顶点放置在OpenGL ES 3D空间中并尝试将纹理坐标映射到每个单独的顶点时,映射会出错。我可以通过移动一些纹理坐标值来解决这个问题,但我意识到这不是这样做的方法。我还尝试编辑我的一些.obj导出器设置来翻转轴和/或uv映射,但不是它们导致正确的映射。我的理论中有关于.obj文件格式的内容吗?我可能已经说过一件事:我昨天读到.obj格式的坐标系将topleft定义为纹理的锚点。所以我已经解决了这个问题。

以下是目前情况的小摘要: 更新:纹理的坐标系是实际的.obj纹理坐标系,而不是OpenGL的坐标系。我翻译我的解析算法中的坐标来反击这个。

Summary

4 个答案:

答案 0 :(得分:4)

据我所知,您报告的坐标系统不正确。

实际上它是这样的:

Coordinate System

我知道这可能不是对你问题的实际回应,但我希望它对此有所了解。

答案 1 :(得分:3)

我将回答我自己的问题:问题似乎是我使用索引缓冲区来加速性能,但我的纹理坐标仍然映射到原始顶点。

答案 2 :(得分:3)

我发现了解析.obj文件的类似问题。 在我的情况下,似乎我的.obj文件使用倒V(第二纹理坐标)轴。 我用这行代码解决了这个问题。 v = 1.0f - v;

答案 3 :(得分:1)

Maurizio对于opengl texturemapping坐标的表示是正确的。

通过查看你的照片,我会说你应该更好地看看你的objC代码。 假设.obj被C4D正确导出,看起来你的纹理索引已经混淆了。

合理的证明:在您张贴的图片中切换左下顶点和右下顶点(“结果Opengl”),你的纹理就会出现。

编辑:实际上,错误可能在你的纹理加载代码中,但这并不能解释你得到的结果。即使故障在纹理加载中,纹理也会简单地显示为倒置(因为左下角的opengl坐标系)。建议:在代码中切换vt0和vt3 ......