解析了我的.obj文件,但它显示得很奇怪

时间:2011-12-06 19:27:08

标签: c++ opengl .obj

我遵循了如何在blender中创建城堡的教程,然后将其导出为.obj文件并将其解析为如下格式:

GLfloat mesh01_coords[] = {
50, 0.1, 50,
-50, 0.1, 50,
-50, 0.1, -50,
50, 0.1, -50,
-9.6351, 9.94983, 17.4283,
-9.6351, 9.94983, 18.7616,
-9.07887, 9.94983, 18.7616,
-9.07887, 9.94983, 17.4283,
10.2729, 9.94983, 18.8564,
10.2729, 9.94983, 17.523,
9.71662, 9.94983, 17.523,
9.71662, 9.94983, 18.8564,
10.3075, 9.94983, 20.0883,
8.97417, 9.94983, 20.0883,
8.97417, 10.9498, 20.0883,
...

编辑:我已设置索引数组

GLubyte mesh01_indices[] = {
0, 2, 1,
0, 3, 2,
4, 6, 5,
4, 7, 6,
...

我的模型加载不是

glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT, 0, mesh01_normals);
glVertexPointer(3, GL_FLOAT, 0, mesh01_coords);
glDrawElements(GL_TRIANGLES, n, GL_UNSIGNED_BYTE, mesh01_indices);

这会产生与我想要的结果无关的随机对象

EDIT2:谢谢大家的帮助,我明白了。

3 个答案:

答案 0 :(得分:1)

Obj文件使用索引。基本上这意味着你通过将三角形指定为顶点数组的索引来消除重复顶点,而不是直接指定带顶点的三角形。

以下是绘制正方形(伪代码)的“天真”做事方式的示例:

// Triangle 1
Vertex v1 = (-1, 1, 0)
Vertex v2 = (-1, -1, 0)
Vertex v3 = (1, -1, 0)
// Triangle 2
Vertex v4 = (1, -1, 0)
Vertex v5 = (-1, 1, 0)
Vertex v6 = (1, 1, 0)

使用索引看起来像:

Vertex v1 = (-1, 1, 0)
Vertex v2 = (-1, -1, 0)
Vertex v3 = (1, -1, 0)
Vertex v4 = (1, 1, 0)

indices = {v1, v2, v3, // First triangle
          v3, v1, v4}  // Second triangle

现在,由于您以“天真”的方式加载数据,因此您基本上会跳过一些需要渲染的三角形(因此“缺少方面”)。此外,某些三角形无法正确渲染,因为您要从顶点创建它们,这些顶点可能彼此无关。

使用GL_QUADS无法解决您的问题。您可以创建一个索引缓冲区,其操作方式与第二个示例类似,或者存储顶点,然后循环索引并从索引创建单个顶点到顶点数组,这将产生类似于第一个示例的内容。但是,以后一种方式执行操作会导致性能下降和内存消耗增加,因为您要存储更多顶点,因此需要将更多信息传递给图形卡。

答案 1 :(得分:1)

通过对我的索引使用GL_UNSIGNED_INT,以及重新编译我的blender文件以确保一切都是三角形,我能够看到城堡

答案 2 :(得分:0)

您的代码

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, mesh01_indices);

将只绘制一个三角形,因为它只使用前3个索引。尝试

glDrawElements(GL_TRIANGLES, n, GL_UNSIGNED_BYTE, mesh01_indices);

其中n是mesh01_indices中的索引数。