2017-04-15 17 views
0

当我使用use_pyglet作为True而不是False时,为什么我看到不同的结果?为什么pygame和pyglet在SAME矩阵的屏幕上显示不同的结果?

矩阵和视口在这两种情况下都是一样的,所以我非常困惑。

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

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

他们其实不是。问题是,在你检查它的地方,它们还没有改变。如果您将支票移至on_draw。然后你会发现,GL_PROJECTION_MATRIX为Pyglet将输出:

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

希望如何设置课程的项目矩阵取决于所期望的结果。

+0

上帝,我浪费了这个:(小时,这是非常愚蠢的...谢谢!+1 – Mehrdad

+0

的OpenGL可以在一开始就让人有些困惑,这是不直接OpenGL的问题,但始终记得检查'glGetError ()',如果可能的话用[调试输出](https://www.khronos.org/opengl/wiki/Debug_Output)。 – Vallentin

+0

是的,事情是我已经完成了我在C++中的工作,所以我已经经历了一些成功的仪式:\只是我现在正在用Python做它,并且它在想我怎么会出错。最初... – Mehrdad

相关问题