我一直试图解决这个问题,但是找不到一种方法可以做到这似乎是合理的,似乎没有什么能解释它,我可以找到关于如何进行建模以及如何使用面孔的无数东西,但是没有什么可以存储在内存中以便使用。我一直在看obj,其余很容易,它主要只是存储它的数组,但是面孔,我能够想到与它们一起工作的唯一方法是存储对象中哪些顶点的细节,或者每次从文件中读取它们,但这肯定不是正确的吗?为每张脸都使用一个物体似乎很疯狂,但我想不出任何其他方式! 即使只是看一本书或任何东西,只是指出我正确的方向,因为一切似乎都跳过了这些东西。感谢。
答案 0 :(得分:2)
面部通常连接三个或更多顶点。这意味着您可以将每个面存储为它所包含的顶点(或顶点的索引)的列表。
f0: [v0 v1 v2]
f1: [v3 v4 v5]
...
或者,如果每个面的顶点数量是预先确定的(我会下注是常见的),您可以将其折叠为单个列表/矢量/数组:
[/* face 1 */ v0 v1 v2 /* face 2 */ v3 v4 v5]
答案 1 :(得分:1)
您正在寻找的是顶点数组。它的工作原理是每个对象包含一个顶点和一个颜色的数组。顶点的法线存储在同一个数组中(vertexX,vertexY,vertexZ,normalX,normalY,normalZ)。当您想渲染对象时,循环遍历对象数组并渲染每个对象,如下所示:
float plane[] = {
10, 10, 0, 0, 0, 1,
-10, 10, 0, 0, 0, 1,
-10, -10, 0, 0, 0, 1,
10, 10, 0, 0, 0, 1,
-10, 10, 0, 0, 0, 1,
10, -10, 0, 0, 0, 1,
};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(plane[0])*6, &plane[0]);
glNormalPointer(3, GL_FLOAT, sizeof(plane[0])*6, &plane[3]);
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glDrawArrays(GL_TRIANGLES, 0, (sizeof(plane) / sizeof(plane[0]))/6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
这应该画一个红色的飞机。唯一不同的是,您希望从对象定义中提供数组。您还可以在每个顶点包含颜色信息,并在上面的代码中包含glColorPointer和glEnableClientState(GL_COLOR_ARRAY)。