如何分别旋转多个四边形? (Pygame, PyOpengl)
How can I rotate multiple quads separately? (Pygame, 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()
请注意,通过 glBegin
/glEnd
序列和固定函数流水线矩阵堆栈进行绘制已被弃用数十年。
阅读 Fixed Function Pipeline and see Vertex Specification and Shader 了解最先进的渲染方式。
无论如何,OpenGL 有不同的矩阵模式,它们是 GL_MODELVIEW
、GL_PROJECTION
和 GL_TEXTURE
- 请参阅 glMatrixMode
。
Ech 矩阵模式提供当前矩阵和矩阵堆栈。
glPushMatrix
/ glPopMatrix
将当前矩阵压入栈中,将栈顶的 mast 矩阵弹出并存储到当前矩阵中
如果你想对一个对象进行单独的矩阵变换,那么你必须:
- 按
glPushMatrix
将当前矩阵压入栈
- 进行类似
glTranslate
, glRotate
, glScale
or even glLoadMatrix
which loads a completely new matrix. For the sak of completeness, there als exists glLoadIdentity
and 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()
预览:
我想大致围绕四边形自己的轴旋转四边形。我的第一个想法是使用 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()
请注意,通过 glBegin
/glEnd
序列和固定函数流水线矩阵堆栈进行绘制已被弃用数十年。
阅读 Fixed Function Pipeline and see Vertex Specification and Shader 了解最先进的渲染方式。
无论如何,OpenGL 有不同的矩阵模式,它们是 GL_MODELVIEW
、GL_PROJECTION
和 GL_TEXTURE
- 请参阅 glMatrixMode
。
Ech 矩阵模式提供当前矩阵和矩阵堆栈。
glPushMatrix
/ glPopMatrix
将当前矩阵压入栈中,将栈顶的 mast 矩阵弹出并存储到当前矩阵中
如果你想对一个对象进行单独的矩阵变换,那么你必须:
- 按
glPushMatrix
将当前矩阵压入栈
- 进行类似
glTranslate
,glRotate
,glScale
or evenglLoadMatrix
which loads a completely new matrix. For the sak of completeness, there als existsglLoadIdentity
andglMultMatrix
的转换。 - 绘制对象。
- 弹出最顶层矩阵
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()
预览: