Обратите внимание, что рисование последовательностями glBegin
/ glEnd
и стеком конвейера с фиксированными функциями не рекомендуется с десятилетий.Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершин и Шейдер для современного способа рендеринга:
The *Параметры 1012 *, y
и z
, которые передаются в glRotate
, являются осью вращения.Поскольку геометрия рисуется в плоскости xy, ось вращения должна быть осью z (0,0,1):
glRotatef(10, 0, 0, 1)
Чтобы вращаться вокруг оси, необходимо определить матрицу модели., который смещается на инвертированный шарнир, затем поворачивается и окончательно преобразуется обратно в шарнир (glTranslate
):
glTranslatef(pivot_x, pivot_y, 0)
glRotatef(10, 0, 0, 1)
glTranslatef(-pivot_x, -pivot_y, 0)
Также обратите внимание, что такие операции, как glRotate
, не допускаютсяв последовательности glBegin
/ glEnd
.В glBegin
/ glEnd
разрешены только последовательные операции, которые устанавливают атрибуты вершин, такие как glVertex
или glColor
.Вы должны установить матрицу до glBegin
:
например
def drawLines():
pivot_x, pivot_y = 0, 250
r,g,b = 255,30,20
glTranslatef(pivot_x, pivot_y, 0)
glRotatef(2, 0, 0, 1)
glTranslatef(-pivot_x, -pivot_y, 0)
glClear(GL_COLOR_BUFFER_BIT)
glColor3ub(r,g,b)
#drawing visible axis
glBegin(GL_LINES)
glVertex2f(0,500)
glVertex2f(0,-500)
glEnd()
glFlush()
Если вы хотите вращать только линию, не затрагивая другие объекты, то у вас есть сохранение и восстановлениестек matirx по glPushMatrix
/ glPopMatrix
:
angle = 0
def drawLines():
global angle
pivot_x, pivot_y = 0, 250
r,g,b = 255,30,20
glClear(GL_COLOR_BUFFER_BIT)
glPushMatrix()
glTranslatef(pivot_x, pivot_y, 0)
glRotatef(angle, 0, 0, 1)
angle += 2
glTranslatef(-pivot_x, -pivot_y, 0)
glColor3ub(r,g,b)
#drawing visible axis
glBegin(GL_LINES)
glVertex2f(0,500)
glVertex2f(0,-500)
glEnd()
glPopMatrix()
glFlush()