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