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

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


注意,几十年来,不赞成使用glBegin / glEnd序列和固定功能管线矩阵堆栈进行绘制。
阅读有关固定功能管线的信息,并参阅"顶点规范"和"着色器"以了解最新的渲染方式。

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

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

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

例如

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

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

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

预习:

>
</p>
<hr></div>
<p><center> <script src=