Если освещение (GL_LIGHTING
) включено, то цвет берется из параметров материала (glMaterial
).
Если вы все еще хотитечтобы использовать текущий цвет, необходимо включить GL_COLOR_MATERIAL
и установить параметры цветного материала (glColorMaterial
).
Окружающий свет независит от направления источника света.Вы должны определить рассеянный и / или зеркальный свет.См. glLightfv
:
Если позиция освещения установлена на glLightfv(GL_LIGHT0, GL_POSITION, pos)
, то позиция умножается на матрицу вида текущей модели.Таким образом, светлое положение в мировом пространстве должно быть установлено до трансформации модели.Переключитесь в режим матрицы GL_PROJECTION
, прежде чем будет установлена матрица проекции.В противном случае положение света будет умножено на матрицу проекции.
glMatrixMode(GL_PROJECTION)
gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
glMatrixMode(GL_MODELVIEW)
glTranslatef(0, 0, -5)
#glLight(GL_LIGHT0, GL_POSITION, (0, 0, 1, 0)) # directional light from the front
glLight(GL_LIGHT0, GL_POSITION, (5, 5, 5, 1)) # point light from the left, top, front
glLightfv(GL_LIGHT0, GL_AMBIENT, (0, 0, 0, 1))
glLightfv(GL_LIGHT0, GL_DIFFUSE, (1, 1, 1, 1))
glEnable(GL_DEPTH_TEST)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_COLOR_MATERIAL)
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE )
glRotatef(1, 3, 1, 1)
Cube()
glDisable(GL_LIGHT0)
glDisable(GL_LIGHTING)
glDisable(GL_COLOR_MATERIAL)
pygame.display.flip()
Рассеянный (и зеркальный) свет зависит от Normal вектора поверхности.
Определите массив кортежей нормальных векторов (x, y, z)
.Обратите внимание, что следующее определение является примером.Поскольку вы рисуете куб, имеющий 6 граней, вы должны определить 6 нормальных векторов, но направление векторов зависит от ваших координат вершин, которых я не знаю.
normals = [
( 0, 0, -1), # surface 0
(-1, 0, 0), # surface 1
( 0, 1, 1), # surface 2
( 1, 0, 0), # surface 3
( 0, 1, 0), # surface 4
( 0, -1, 0) # surface 5
]
И установите правильный вектор нормали при рисовании объекта:
def Cube():
glBegin(GL_QUADS)
for i_surface, surface in enumerate(surfaces):
x = 0
glNormal3fv(normals[i_surface]) # set the normal vector the vertices of the surface
for vertex in surface:
x+=1
glColor3fv(colors[x])
glVertex3fv(verticies[vertex])
glEnd()
glColor3fv(colors[0])
glBegin(GL_LINES)
for edge in edges:
for vertex in edge:
glVertex3fv(verticies[vertex])
glEnd()
Включите Проверка глубины (glEnable(GL_DEPTH_TEST)
) для получения анимации, подобнойследующее: