Как вращать 2 объекта независимо друг от друга в Pygame и Pyopengl - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь повернуть 2 объекта независимо, но когда я запускаю код, оба объекта вращаются в одном направлении, введите код

здесь я сохраняю матрицу и поворачиваю квадрат под кубом

def rotate_square():
    glColor3f(1,1,1)
    glMatrixMode(GL_MODELVIEW)
    glPushMatrix()
    glRotatef(45,0,1,0)
    glBegin(GL_LINES)
    glVertex3fv(v1);
    glVertex3fv(v2);
    glVertex3fv(v1);
    glVertex3fv(v3);
    glVertex3fv(v3);
    glVertex3fv(v4);
    glVertex3fv(v2);
    glVertex3fv(v4);
    glEnd()
    glPopMatrix()

основная функция

def main():
    pygame.init()
    screen = pygame.display.set_mode(SCREEN_SIZE, DOUBLEBUF|OPENGL)
    resize(*SCREEN_SIZE)
    print(glGetString(GL_VERSION))
    gluLookAt(0, 0, -6, 0, 0, 0, 0, 1, 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)

Вращение куба

        glRotatef(1,0,1,0)
        glutWireCube(2)
        rotate_square()
        pygame.display.flip()
        pygame.time.wait(10)

1 Ответ

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

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

В любом случае, в общем случае объект преобразуется матрицей модели, затем сцена преобразуется матрицей вида и матрицей проекции.
К сожалению, в устаревшем конвейере фиксированных функций OpenGL матрица модели и матрица представления объединяются и не могут обрабатываться отдельно, что так просто.

Вы должны трансформировать каждый объект по собственной матрице модели, чтобы вращать их независимо. Создайте матрицы 4 * 4 и инициализируйте их единичной матрицей:

model1 = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
model2 = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]

Чтобы манипулировать матрицами моделей, загрузите их в стек матриц с помощью glLoadMatrix. Затем манипулируйте ими и, наконец, прочитайте результат на glGetFloatv(GL_MODELVIEW_MATRIX):

glPushMatrix()
glLoadMatrixf(model1)
glRotatef(1,0,1,0)
model1 = glGetFloatv(GL_MODELVIEW_MATRIX)
glPopMatrix()

Если необходимо применить матрицу модели, ее можно умножить на стек матрицы на glMultMatrix:

glPushMatrix()
glMultMatrixf(model1)
glutWireCube(2)
glPopMatrix()

Окончательный код может выглядеть следующим образом:

model1 = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
model2 = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
def rotate_square():
    global model2

    glPushMatrix()
    glLoadMatrixf(model2)
    glRotatef(5,0,1,0)
    model2 = glGetFloatv(GL_MODELVIEW_MATRIX)
    glPopMatrix()

    glColor3f(1,1,1)

    glMatrixMode(GL_MODELVIEW)
    glPushMatrix()
    glMultMatrixf(model2)
    glBegin(GL_LINES)
    glVertex3fv(v1)
    glVertex3fv(v2)
    glVertex3fv(v1)
    glVertex3fv(v3)
    glVertex3fv(v3)
    glVertex3fv(v4)
    glVertex3fv(v2)
    glVertex3fv(v4)
    glEnd()
    glPopMatrix()
def main():
    global model1

    # [...]

    while True:

        # [...]

        glMatrixMode(GL_MODELVIEW)
        glPushMatrix()
        glLoadMatrixf(model1)
        glRotatef(1,0,1,0)
        model1 = glGetFloatv(GL_MODELVIEW_MATRIX)
        glPopMatrix()

        glPushMatrix()
        glMultMatrixf(model1)
        glutWireCube(2)
        glPopMatrix()

        rotate_square()

        pygame.display.flip()
        pygame.time.wait(10)
...