2017-04-15 17 views
0

use_pygletTrueとなり、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に移動した場合。

[[ 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.]] 

ソリューションは、セットアップに射影行列を自分なりそうすれば、Pygletが出力用GL_PROJECTION_MATRIXがいることに気づくでしょう。したがって、常に同じになるようにしてください。

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

関連する問題