Линии покрыты полигонами.Обратите внимание, что математически линии и многоугольники имеют одинаковую глубину, но на самом деле это зависит от арифметической точности с плавающей запятой либо от фрагмента, который рисуется многоугольником, либо от линии, "выигрывающей" тест глубины ,Это также может вызвать Z-fight .
Слегка оттолкнуть полигоны назад, установив смещение глубины (см. glPolygonOffset
), чтобы линии были вперед полигонами:
def draw(self):
glEnable(GL_DEPTH_TEST)
glBegin(GL_LINES)
# [...]
glEnd()
glEnable( GL_POLYGON_OFFSET_FILL )
glPolygonOffset( 1.0, 1.0 )
glBegin(GL_QUADS)
# [...]
glEnd()
glDisable( GL_POLYGON_OFFSET_FILL )
Если вы все еще не видите линию, вам нужно увеличить смещение полигона (1-й параметр).Обратите внимание, что линии тонкие и нарисованы черным (glColor3fv((0, 0, 0))
), возможно, они едва различимы.
Толщина линии может быть установлена с помощью glLineWidth
Обратите внимание, что куб состоит из 8 вершин, 6 сторон и 12 ребер.В вашем коде вы рисуете только 4 ребра.
Я рекомендую определить список из 8 угловых точек куба и определить список из 6 боковых четырехугольных индексов и 12 ребер.Используйте эти списки, чтобы нарисовать куб:

class Cube:
def __init__(self, x, y, z, len):
self.x = x
self.y = y
self.z = z
self.len = len
self.v = [
(self.x - self.len, self.y - self.len, self.z - self.len),
(self.x + self.len, self.y - self.len, self.z - self.len),
(self.x + self.len, self.y + self.len, self.z - self.len),
(self.x - self.len, self.y + self.len, self.z - self.len),
(self.x - self.len, self.y - self.len, self.z + self.len),
(self.x + self.len, self.y - self.len, self.z + self.len),
(self.x + self.len, self.y + self.len, self.z + self.len),
(self.x - self.len, self.y + self.len, self.z + self.len),
]
self.edges = [(0,1), (1,2), (2,3), (3,0), (4,5), (5,6),
(6,7), (7,4), (0,4), (1,5), (2,6), (3,7)]
self.surfaces = [(0,1,2,3), (5,4,7,6), (4,0,3,7),(1,5,6,2), (4,5,1,0), (3,2,6,7)]
self.colors = [(1,0,0), (0,1,0), (0,0,1), (1,1,0), (1,0,1), (1,0.5,0)]
def draw(self):
glEnable(GL_DEPTH_TEST)
glLineWidth(5)
glColor3fv((0, 0, 0))
glBegin(GL_LINES)
for e in self.edges:
glVertex3fv(self.v[e[0]])
glVertex3fv(self.v[e[1]])
glEnd()
glEnable( GL_POLYGON_OFFSET_FILL )
glPolygonOffset( 1.0, 1.0 )
glBegin(GL_QUADS)
for i, quad in enumerate(self.surfaces):
glColor3fv(self.colors[i])
for iv in quad:
glVertex3fv(self.v[iv])
glEnd()
glDisable( GL_POLYGON_OFFSET_FILL )