为什么在运行use_pyglet
True
与False
{/ 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的:
Pyglet:
答案 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()
如何设置项目矩阵当然取决于所需的结果。