我正在尝试使用OpenGL为WRL(VRML)文件中描述的对象建模。
我并不是真的关心解析文件,我认为那部分会非常直接。在这个阶段,我只是试图在顶点数组和索引数组中进行硬编码,这样我就可以很好地理解它是如何工作的,这样我就可以推广任何WRL输入文件。
我首先尝试的是基本盒子(矩形棱镜)模型。我目前有这个顶点数组:
GLfloat vertices[] = {
-0.200000, -0.025000, -0.050000,
-0.200000, -0.025000, 0.050000,
-0.200000, 0.025000, -0.050000,
-0.200000, 0.025000, 0.050000,
0.200000, -0.025000, -0.050000,
0.200000, -0.025000, 0.050000,
0.200000, 0.025000, -0.050000,
0.200000, 0.025000, 0.050000
};
和这个索引数组:
GLubyte indices[] = {
7, 3, 5, -1, 5, 3, 1, -1,
6, 2, 7, -1, 7, 2, 3, -1,
4, 0, 6, -1, 6, 0, 2, -1,
5, 1, 4, -1, 4, 1, 0, -1,
2, 0, 3, -1, 3, 0, 1, -1,
4, 6, 5, -1, 5, 6, 7, -1
};
直接来自WRL文件Coordinate3 {point []}
和IndexedFaceSet {coordIndex []}
。
然后我通过调用:
启用顶点数组功能 glEnableClientState(GL_VERTEX_ARRAY);
并设置glVertexPointer:
glVertexPointer(3, GL_FLOAT, 0, vertices);
最后我使用glDrawElements函数绘制框:
glDrawElements(GL_POLYGON, 24, GL_UNSIGNED_BYTE, indices);
然后停用顶点数组功能:
glDisableClientState(GL_VERTEX_ARRAY);
所以在此之后,我希望绘制一个框,当我使用glDrawElements(GL_POINTS, 24, GL_UNSIGNED_BYTE, indices);
时,它会显示8个顶点,如果正确的顶点用线连接,则表示预期的框(除了中间有一个点,但当我使用26作为计数参数时,中间的点消失了)
然而,当我在glDrawElements的第一个参数中使用GL_POLYGON或GL_LINE_LOOP时,我得到了垃圾。 8个顶点显然存在,但它们以非常奇怪的方式结合在一起。
我现在很困惑,我甚至不确定我是否正确地这样做了。或许至少有人能让我朝着正确的方向前进?
答案 0 :(得分:0)
矩形棱镜不是GL_POLYGON
。请注意该单词的单数形式:polygon。与一个多边形一样。矩形棱镜由许多多边形组成,而不仅仅是一个。
你想要的是绘制一些GL_TRIANGLES
。创建一个索引列表,显示组成该框的每个三角形。这意味着每个箱面由两个三角形组成,因此总共需要12个三角形。这意味着36个指数。