我正在尝试用OpenGL和Pygame创建一个3D魔方,但是当我在我创建的GL_QUADS
表面上画线时,它们没有显示出来。
我试过把GL_LINES
放在GL_QUADS
线之后,但它们仍然不会显示为黑线。
有没有人有解决办法?还有,我该如何调整线条的粗细?
代码如下所示:
def draw(self):
glEnable(GL_DEPTH_TEST)
glBegin(GL_LINES)
glColor3fv((0, 0, 0))
glVertex3fv((self.x - self.len, self.y + self.len, self.z - self.len))
glVertex3fv((self.x - self.len, self.y + self.len, self.z - self.len))
glColor3fv((0, 0, 0))
glVertex3fv((self.x + self.len, self.y + self.len, self.z + self.len))
glVertex3fv((self.x + self.len, self.y - self.len, self.z - self.len))
glColor3fv((0, 0, 0))
glVertex3fv((self.x - self.len, self.y + self.len, self.z - self.len))
glVertex3fv((self.x - self.len, self.y + self.len, self.z - self.len))
glColor3fv((0, 0, 0))
glVertex3fv((self.x - self.len, self.y - self.len, self.z + self.len))
glVertex3fv((self.x - self.len, self.y - self.len, self.z - self.len))
glEnd()
glBegin(GL_QUADS)
glColor3fv(colors[0])
# fix z
glVertex3fv((self.x - self.len, self.y - self.len, self.z - self.len))
glVertex3fv((self.x + self.len, self.y - self.len, self.z - self.len))
glVertex3fv((self.x + self.len, self.y + self.len, self.z - self.len))
glVertex3fv((self.x - self.len, self.y + self.len, self.z - self.len))
glColor3fv(colors[1])
glVertex3fv((self.x - self.len, self.y - self.len, self.z + self.len))
glVertex3fv((self.x + self.len, self.y - self.len, self.z + self.len))
glVertex3fv((self.x + self.len, self.y + self.len, self.z + self.len))
glVertex3fv((self.x - self.len, self.y + self.len, self.z + self.len))
# fix x
glColor3fv(colors[2])
glVertex3fv((self.x - self.len, self.y - self.len, self.z - self.len))
glVertex3fv((self.x - self.len, self.y + self.len, self.z - self.len))
glVertex3fv((self.x - self.len, self.y + self.len, self.z + self.len))
glVertex3fv((self.x - self.len, self.y - self.len, self.z + self.len))
glColor3fv(colors[3])
glVertex3fv((self.x + self.len, self.y - self.len, self.z - self.len))
glVertex3fv((self.x + self.len, self.y + self.len, self.z - self.len))
glVertex3fv((self.x + self.len, self.y + self.len, self.z + self.len))
glVertex3fv((self.x + self.len, self.y - self.len, self.z + self.len))
# fix y
glColor3fv(colors[4])
glVertex3fv((self.x - self.len, self.y - self.len, self.z - self.len))
glVertex3fv((self.x + self.len, self.y - self.len, self.z - self.len))
glVertex3fv((self.x + self.len, self.y - self.len, self.z + self.len))
glVertex3fv((self.x - self.len, self.y - self.len, self.z + self.len))
glColor3fv(colors[5])
glVertex3fv((self.x - self.len, self.y + self.len, self.z - self.len))
glVertex3fv((self.x + self.len, self.y + self.len, self.z - self.len))
glVertex3fv((self.x + self.len, self.y + self.len, self.z + self.len))
glVertex3fv((self.x - self.len, self.y + self.len, self.z + self.len))
glEnd()
1条答案
按热度按时间ma8fv8wu1#
线被多边形覆盖。注意,线和多边形在数学上具有相同的深度,但实际上这取决于浮点运算精度,由多边形或线绘制的片段“赢得”depth test。这也可能导致Z-fighting。
通过设置深度偏移(请参见
glPolygonOffset
),将多边形稍微向后推,以便线将位于多边形的前面:如果你仍然看不到线,那么你必须增加多边形偏移(第一个参数)。注意,线是细的,并绘制为黑色(
glColor3fv((0, 0, 0))
),可能他们很难看到。线条的粗细可通过
glLineWidth
设置注意,一个立方体由8个顶点,6条边和12条边组成。在你的代码中,你只画了4条边。
我建议定义一个立方体的8个角点的列表,并定义一个6边四边形索引和12条边的列表。使用以下列表绘制立方体:
repl.it/@Rabbid76/PyGame-opengl-cube-wireframe