How can I rotate multiple quads separately? (Pygame, PyOpengl)
我想使四边形大致围绕它们自己的轴旋转。 我的第一个想法是使用glPushMatrix()和glPophMatrix(),但不起作用。 无论如何,我相信这是个好方法。
码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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() |
注意,几十年来,不赞成使用
阅读有关固定功能管线的信息,并参阅"顶点规范"和"着色器"以了解最新的渲染方式。
无论如何,OpenGL具有不同的矩阵模式,分别是
Ech矩阵模式提供当前矩阵和矩阵堆栈。
如果要对对象进行单个矩阵转换,则必须:
-
通过
glPushMatrix 将当前矩阵推入堆栈 -
进行
glTranslate ,glRotate ,glScale 甚至glLoadMatrix 之类的转换,以加载一个全新的矩阵。对于完整性,存在glLoadIdentity 和glMultMatrix 。 - 绘制对象。
-
弹出最上面的矩阵
glPopMatrix ,以恢复当前矩阵和矩阵堆栈。现在,当前矩阵和矩阵堆栈似乎是这样,因为上述转换永远不会发生。
例如
1 2 3 4 5 | glPushMatrix() glTranslated(250, 100, 0) glRotated(5, 0, 0, 1) makeQuad() glPopMatrix() |
如果要分别对四边形进行动画处理,那么我建议使用2个控制变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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() |
预习:
