如何分别旋转多个四边形? (Pygame,PyOpengl)

时间:2018-11-23 20:22:00

标签: python opengl pygame coordinate-transformation pyopengl

我想使四边形大致围绕它们自己的轴旋转。我的第一个想法是使用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()

1 个答案:

答案 0 :(得分:1)

请注意,数十年来,不赞成使用glBegin / glEnd序列和固定功能管线矩阵堆栈进行绘制。 阅读有关Fixed Function Pipeline的信息,并参阅Vertex SpecificationShader了解最新的渲染方式。


无论如何,OpenGL具有不同的矩阵模式,分别为GL_MODELVIEWGL_PROJECTIONGL_TEXTURE-请参见glMatrixMode
Ech矩阵模式提供当前矩阵和矩阵堆栈。 glPushMatrix / glPopMatrix将当前矩阵推到堆栈中,然后将顶部的桅杆矩阵从堆栈中弹出并存储到当前矩阵中

如果要对对象进行单个矩阵转换,则必须:

  • 通过glPushMatrix将当前矩阵推入堆栈
  • 进行类似glTranslateglRotateglScale甚至是glLoadMatrix这样的转换,这些转换会加载一个全新的矩阵。为了完整性,还存在glLoadIdentityglMultMatrix
  • 绘制对象。
  • 弹出最上面的矩阵glPopMatrix,以恢复当前矩阵和矩阵堆栈。现在,当前的矩阵和矩阵堆栈似乎是这样,因为上述转换永远不会发生。

例如

glPushMatrix()
glTranslated(250, 100, 0)
glRotated(5, 0, 0, 1)
makeQuad()
glPopMatrix()

如果要分别对四边形进行动画处理,则建议使用2个控制变量a1a2,它们控制旋转角度并在主循环中不断增加:

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()

预览: