我正在为 OpenGL ES 2.0 在 objc 中编写自己的 .obj 解析器,以便更好地了解 OpenGLES 的工作原理。加载顶点并显示带有顶点颜色的模型就像一个魅力。只是一个小提示:我正在使用索引缓冲区。
真正的问题是纹理 atm 的映射。正如您将在下面看到的那样,我的纹理没有按照应有的方式映射。
这是我认为 .obj 格式的工作原理,如果我错了,请纠正我:“f”行描述了一个面,其中斜线之前的数字定义了顶点的索引,斜线之后的数字定义了纹理坐标.
考虑以下 .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
以及以下纹理:
现在,当我在 OpenGL ES 3D 空间中定位顶点并尝试将纹理坐标映射到每个单独的顶点时,映射会出错。我可以通过移动一些纹理坐标值来解决这个问题,但我意识到这不是解决问题的方法。我还尝试编辑我的一些 .obj 导出器设置以翻转轴和/或 uv 映射,但它们都不会导致正确的映射。关于 .obj 文件格式,我的理论中有什么遗漏吗?我可能已经说过一件事:我昨天读到 .obj 格式的坐标系统将左上角定义为纹理的锚点。所以我已经在解析中修复了这个问题。
以下是对当前情况的一个小总结: 更新:纹理的坐标系是实际的 .obj 纹理坐标系,而不是 OpenGL 的坐标系。我在我的解析算法中翻译坐标来解决这个问题。