小编Tom*_*m H的帖子

如何使用tinyobjloader 在 OpenGL 中绘制 OBJ 文件?

我正在尝试在 OpenGL 中从 Starfox 64 绘制这个免费的机翼模型。我在 Blender 中将 .fbx 文件转换为 .obj,并使用tinyobjloader来加载它(我的大学科目的所有要求)。

我几乎将示例代码(使用现代 API)放入我的程序中,替换了文件名,并抓取了attrib.verticesattrib.normals向量来绘制机翼。

我可以使用 GL_POINTS 查看顶点:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, &vertices[0]);
glDrawArrays(GL_POINTS, 0, vertices.size() / 3);
glDisableClientState(GL_VERTEX_ARRAY);
Run Code Online (Sandbox Code Playgroud)

哪个看起来是正确的(我......认为?):

在此输入图像描述

但我不确定如何渲染实体模型。简单地用 GL_TRIANGLES(如图所示)或 GL_QUADS 替换 GL_POINTS 是行不通的:

在此输入图像描述

我正在使用 OpenGL 1.1 w/ GLUT(再次,大学)。我想我只是不知道自己在做什么,真的。帮助?

c++ opengl glut wavefront

3
推荐指数
1
解决办法
5348
查看次数

一维/二维数组指针的底层类型是什么,为什么需要双重解引用?

假设我这样初始化数组和变量:

int arr1d[3] = { 1, 2, 3 };
int* arrptr = arr1d;
int (*ptr1d)[3] = &arr1d;

int arr2d[2][3] = { {1, 2, 3}, {4, 5, 6} };
int (*ptr2d)[3] = arr2d;
Run Code Online (Sandbox Code Playgroud)

所以,arr1d是一个由 3 个整数组成的数组。在底层,arr1d是一个指向数组第一个元素的指针,即&arr1d[0]. 因此,我们可以赋值arr1dint* arrptr

ptr1d指向一个由 3 个整数组成的数组。arr1dint*指向&arr1d[0],但为什么是&arr1d类型int (*)[3]?天真地,我认为写作&arr1d只是给了我们一个地址来分配给指针。这是特定于指向数组的指针吗?

显然,arr2d是类型int (*)[3]我从这篇文章中学到的)。双方ptr2d*ptr2d具有相同的值,所以这是为什么第二解引用甚至是必要的?我的想法是,这可能是因为ptr2d类型是int (*)[3] …

c++ pointers multidimensional-array memory-address dereference

0
推荐指数
1
解决办法
64
查看次数