【问题标题】:How can I rotate multiple quads separately? (Pygame, PyOpengl)如何分别旋转多个四边形? (Pygame,PyOpengl)
【发布时间】:2018-11-23 20:22:00
【问题描述】:

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

【问题讨论】:

标签: python opengl pygame coordinate-transformation pyopengl


【解决方案1】:

请注意,由glBegin/glEnd 序列和固定函数管道矩阵堆栈绘制,几十年来已被弃用。 阅读Fixed Function Pipeline 并查看Vertex SpecificationShader,了解最先进的渲染方式。


无论如何,OpenGL 有不同的矩阵模式,它们是 GL_MODELVIEWGL_PROJECTIONGL_TEXTURE - 请参阅 glMatrixMode
每个矩阵模式提供一个当前矩阵和一个矩阵堆栈。 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()

预览:

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 2019-04-23
    • 2022-01-18
    • 2020-12-23
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多