1

我正在绘制一系列彼此相邻的立方体,我想剔除所有接触的边,因为它们无用。问题是我不知道如何剔除边。有人可以解释如何剔除正在调用 glBegin()/glEnd() 调用的立方体的任何边吗?

4

2 回答 2

2

OpenGL 不会为您执行此操作,您必须自己剔除它们。

我在最近的一个项目中做了以下事情:

从立方体位置的集合中,我将每个面的条目添加到字典中。此映射面中心位置到面法线。在添加一个新的(位置,正常)对之前,我会测试该位置是否存在。如果找到:删除现有条目并丢弃新条目。否则添加新的(位置,正常)。

从这本字典中,您可以构建顶点和三角形列表,并且您不会有任何接触面。

可能有更有效的方法可以做到这一点,但这对我的应用程序来说已经足够好并且易于实现。

编辑:

PSEUDOCODE:

d = dictionary<vec3, vec3>

for each cube:
    for face 1..6:
        pos = faceCenterFor(cube, face)
        if pos in d:
            remove d[pos]
        else:
            d[pos] = normalFor(cube, face)

for each (pos, normal) in d:
    draw(vertsForFace(pos, normal))
    # or save verts to an array for drawing later
于 2011-06-07T17:58:32.263 回答
0

如果您确保为立方体指定面法线,则至少可以启用背面剔除 ( glEnable()),但您可能需要手动剔除立方体侧面。

但是,您可以将侧面的法线设置为也面向背面,以便被背面剔除拾取。

使用(例如)指定每个面的法线:

gl.glNormal3f(1, 0, 0);

对于背面剔除使用:

glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
于 2012-08-06T17:46:47.517 回答