Обратите внимание, что рисование с помощью glBegin
/ glEnd
последовательностей и стека конвейерной матрицы с фиксированными функциями устарело с десятилетий.
Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершин и Шейдер для современного способа рендеринга.
В любом случае, вы должны позвонить glutPostRedisplay
для непрерывного повторного отображения окна.
Используйте glutGet(GLUT_ELAPSED_TIME)
, чтобы получить количество миллисекунд с момента вызова glutInit
.
Перевод может быть выполнен по glTranslate
.
Далее я рекомендую установить буфер глубины (фокус на GLUT_DEPTH
):
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
и включить проверку глубины . Не забудьте также очистить буфер глубины:
glEnable(GL_DEPTH_TEST)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
Добавьте следующие строки в ваш код, чтобы выполнить движение вверх и вниз вдоль оси y окна просмотра:
import math
def draw():
global xrot, yrot, lightpos, greencolor, cylcolor
timeSinceStart = glutGet(GLUT_ELAPSED_TIME)
glEnable(GL_DEPTH_TEST)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glPushMatrix()
glTranslatef(0.0, 0.0, math.cos(timeSinceStart*0.002))
glRotatef(xrot, 1.0, 0.0, 0.0)
glRotatef(yrot, 0.0, 1.0, 0.0)
glLightfv(GL_LIGHT0, GL_POSITION, lightpos)
glMaterialfv(GL_FRONT, GL_DIFFUSE, cylcolor)
glutSolidCylinder(0.5, 1, 20, 20)
glPopMatrix()
glutSwapBuffers()
glutPostRedisplay()
Я создал следующую анимацию с изменениями, примененными к вашему исходному коду, и изменил следующие параметры:
xrot = 10.0
lightpos = (2.0, -2.0, 1.0)