为什么pygame和pyglet在屏幕上用SAME矩阵显示不同的结果?

时间:2017-04-15 01:46:30

标签: python windows opengl pygame pyglet

为什么在运行use_pyglet TrueFalse {/ 1}}的代码时,我会看到不同的结果?

两种情况下的矩阵和视口是相同的,所以我真的很困惑。

import ctypes
import numpy

use_pyglet = False   # change this to True to see the difference
if use_pyglet:
    import pyglet
    from pyglet.gl import *
    window = pyglet.window.Window(resizable=True, config=pyglet.gl.Config(double_buffer=True))
else:
    import pygame, pygame.locals
    from pyglet.gl import *
    pygame.init()
    pygame.display.set_mode((640, 480), pygame.locals.DOUBLEBUF | pygame.locals.OPENGL)
a = (ctypes.c_int   *  4)(); glGetIntegerv(GL_VIEWPORT, a); print numpy.asarray(a)
a = (ctypes.c_float * 16)(); glGetFloatv(GL_PROJECTION_MATRIX, a); print numpy.asarray(a).reshape((4, 4)).T
a = (ctypes.c_float * 16)(); glGetFloatv(GL_MODELVIEW_MATRIX, a); print numpy.asarray(a).reshape((4, 4)).T
def on_draw():
    glClearColor(1, 1, 1, 1)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glColor4d(0, 0, 0, 1)
    glBegin(GL_LINE_STRIP)
    glVertex2d(0, 0)
    glVertex2d(100, 100)
    glEnd()
if use_pyglet:
    on_draw = window.event(on_draw)
    pyglet.app.run()
else:
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                break
        on_draw()
        pygame.display.flip()
        pygame.time.wait(20)

pygame的:

Screenshot

Pyglet:

Screenshot

1 个答案:

答案 0 :(得分:1)

  

两种情况下的矩阵和视口都是一样的,所以我真的很困惑。

他们实际上并非如此。问题是,在你检查它的时候,它们还没有被改变。如果您将支票移至on_draw。然后你会注意到Pyglet的GL_PROJECTION_MATRIX将输出:

[[ 0.003125    0.          0.         -1.        ]
 [ 0.          0.00416667  0.         -1.        ]
 [ 0.          0.         -1.         -0.        ]
 [ 0.          0.          0.          1.        ]]

对于Pygame,它会输出:

[[ 1.  0.  0.  0.]
 [ 0.  1.  0.  0.]
 [ 0.  0.  1.  0.]
 [ 0.  0.  0.  1.]]

解决方案是自己设置投影矩阵。从而确保它永远是一样的。

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()

如何设置项目矩阵当然取决于所需的结果。