我想使四边形大致围绕它们自己的轴旋转。我的第一个想法是使用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()
答案 0 :(得分:1)
请注意,数十年来,不赞成使用glBegin
/ glEnd
序列和固定功能管线矩阵堆栈进行绘制。
阅读有关Fixed Function Pipeline的信息,并参阅Vertex Specification和Shader了解最新的渲染方式。
无论如何,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()
预览: