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