Как я могу вращать несколько четырехугольников отдельно?(Pygame, PyOpengl) - PullRequest
0 голосов
/ 23 ноября 2018

Я бы хотел вращать свои четверки примерно вокруг своей оси.Моей первой мыслью было использовать glPushMatrix () и glPophMatrix (), но это не работает.Несмотря на это, я считаю, что это хороший способ.

Код:

import time, pygame
from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *

def makeQuad():
    glBegin(GL_QUADS)
    glVertex2f(0, 0)
    glVertex2f(0, 50)
    glVertex2f(50, 50)
    glVertex2f(50, 0)
    glEnd()

def main():
    pygame.init()
    display = (800,800)
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
    gluOrtho2D(0, 800, 0, 800)

    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)

        glPushMatrix()
        glTranslated(150, 0, 0)

        makeQuad()

        glTranslated(100, 250, 0)

        makeQuad()

        glPopMatrix()

        pygame.display.flip()

main()

1 Ответ

0 голосов
/ 24 ноября 2018

Обратите внимание, что рисование с помощью glBegin / glEnd последовательностей и стека матрицы конвейеров с фиксированными функциями устарело с десятилетий.Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершин и Шейдер для современного способа рендеринга.


В любом случае,OpenGL имеет различные режимы работы с матрицами: GL_MODELVIEW, GL_PROJECTION и GL_TEXTURE - см. glMatrixMode.
В режиме матрицы Ech предусмотрена текущая матрица и стек матрицы.glPushMatrix / glPopMatrix поместите текущую матрицу в стек и вставьте верхнюю матрицу мачты из стека и сохраните ее в текущей матрице

Если вы хотите создать отдельную матрицупреобразование в объект, тогда вы должны:

  • Вставить текущую матрицу в стек на glPushMatrix
  • Выполнить преобразования, такие как glTranslate,glRotate, glScale или даже glLoadMatrix, который загружает совершенно новую матрицу.Для полноты картины существуют также glLoadIdentity и glMultMatrix.
  • Нарисуйте объект.
  • Вставьте самую верхнюю матрицуglPopMatrix, чтобы восстановить текущую матрицу и матричный стек.Теперь кажется, что текущая матрица и матричный стек таковы, как никогда не происходили бы вышеуказанные преобразования.

Например,

glPushMatrix()
glTranslated(250, 100, 0)
glRotated(5, 0, 0, 1)
makeQuad()
glPopMatrix()

Если вы хотите анимировать четырехугольники отдельно,затем я рекомендую использовать 2 управляющие переменные a1 и a2, которые управляют углом поворота и постепенно увеличиваются в основном цикле:

a1, a2 = 0, 0

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)

    glPushMatrix()
    glTranslated(250, 100, 0)
    glRotated(a1, 0, 0, 1)
    makeQuad()
    glPopMatrix()

    glPushMatrix()
    glTranslated(100, 250, 0)
    glRotated(a2, 0, 0, 1)
    makeQuad()
    glPopMatrix()

    a1 += 1
    a2 += 2

    pygame.display.flip()

Предварительный просмотр:

...