Как повернуть 2D линию в PyOpenGL? - PullRequest
0 голосов
/ 23 декабря 2018

Я написал код для рисования линии.Вот функция:

def drawLines():
    r,g,b = 255,30,20
    #drawing visible axis
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3ub(r,g,b)
    glBegin(GL_LINES)
    #glRotate(10,500,-500,0)
    glVertex2f(0,500)
    glVertex2f(0,-500)

    glEnd()
    glFlush()

Теперь я пытаюсь повернуть линию.Я пытаюсь следовать этой документации, но не могу понять.Согласно документации вращающаяся функция определяется следующим образом:

def glRotate( angle , x , y , z ):

У меня нет оси z.Так что я держу z=0.Что мне здесь не хватает?

1 Ответ

0 голосов
/ 23 декабря 2018

Обратите внимание, что рисование последовательностями 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 / glEndglBegin / 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()
...