Я пытаюсь повернуть 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)
2
Mihai Vanca 5 Ноя 2018 в 18:18

1 ответ

Лучший ответ

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

В любом случае, обычно объект преобразуется матрицей модели, затем сцена преобразуется матрицей вида и матрицей проекции.
К сожалению, в устаревшем конвейере фиксированных функций 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)
3
Rabbid76 14 Июл 2019 в 21:34