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

Parsed my .obj file but it is being displayed weirdly

本文关键字:显示 我的 obj 文件      更新时间:2023-10-16

我遵循了如何在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);

这将生成随机对象与我想要的结果一点也不接近

谢谢大家的帮助,我把它修好了。

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不能解决你的问题。您可以创建一个索引缓冲区,操作方式类似于第二个示例,或者存储顶点,然后循环遍历索引并从索引创建单个顶点到顶点数组,这将导致类似于第一个示例的结果。但是,使用后一种方式将导致更差的性能和更多的内存消耗,因为您要存储更多的顶点,因此需要向显卡传递更多的信息。

通过使用GL_UNSIGNED_INT作为我的索引,以及重新编译我的blender文件,以确保所有的东西都是三角形,我能够看到城堡

你的代码
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, mesh01_indices);

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

glDrawElements(GL_TRIANGLES, n, GL_UNSIGNED_BYTE, mesh01_indices);

其中n为mesh01_indices的索引数