我还没有下载你的项目。人们在编写用于 OpenGL 渲染的 OBJ 导入代码时最困难的是索引。正如 @ratched_freak 在他的评论中也怀疑的那样,这与你的立方体的视觉外观非常一致。
OBJ 格式对位置、法线和纹理坐标使用单独的索引。对于 OpenGL 渲染,您需要一组索引。这意味着您需要为 OBJ 文件中三角形使用的位置/法线/纹理索引的每个唯一组合生成一个顶点,为该组合分配一个新索引,然后在 OpenGL 索引缓冲区中使用该索引。
我用伪代码写了一个答案,概述了如何针对最近的类似问题执行此操作:OpenGL - 索引缓冲区困难 https://stackoverflow.com/questions/23349080/opengl-index-buffers-difficulties/23356738#23356738.
编辑,更多地说明问题。这是我在网上找到的一个“cube”文件:
v 0.0 0.0 0.0
v 0.0 0.0 1.0
v 0.0 1.0 0.0
v 0.0 1.0 1.0
v 1.0 0.0 0.0
v 1.0 0.0 1.0
v 1.0 1.0 0.0
v 1.0 1.0 1.0
vn 0.0 0.0 1.0
vn 0.0 0.0 -1.0
vn 0.0 1.0 0.0
vn 0.0 -1.0 0.0
vn 1.0 0.0 0.0
vn -1.0 0.0 0.0
f 1//2 7//2 5//2
f 1//2 3//2 7//2
f 1//6 4//6 3//6
f 1//6 2//6 4//6
f 3//3 8//3 7//3
f 3//3 4//3 8//3
f 5//5 7//5 8//5
f 5//5 8//5 6//5
f 1//4 5//4 6//4
f 1//4 6//4 2//4
f 2//1 6//1 8//1
f 2//1 8//1 4//1
该文件有 8 个位置(v
记录)和6个正常(vn
记录)。这f
记录是面,在本例中是三角形。观察第一个三角形顶点,1//2
告诉您顶点使用位置 1 和法线 2。使用 OpenGL 索引数组时,您不能为位置和法线设置单独的索引。因此,我们为该位置/法线对创建一个顶点,并为其分配第一个可用索引。同样适用于7//2
and 5//2
,所以我们现在有 3 个 OpenGL 顶点(索引 0、1 和 2)。
现在在第二个三角形上,我们发现1//2
再次。我们已经为此组合创建了一个顶点,因此我们可以再次使用顶点 0。3//2
是新的,所以我们为它创建一个新的顶点(索引 3)。7//2
我们之前看到,它与我们的顶点 1 相同。
所以我们最终得到了前 2 个三角形的 4 个 OpenGL 顶点。这是有道理的,因为两个三角形描述了立方体的一个面,而一个正方形需要 4 个顶点。
如果在整个示例中继续此过程,您最终将得到可存储在 OpenGL 顶点缓冲区中的 24 个顶点,以及一个包含 36 个条目的索引缓冲区(12 个三角形,每个三角形有 3 个角)。