2012-03-27 8 views
1

gluLookAtが動作しません。代わりに、私はちょうどカメラを移動させることができると思っglTranslatefを使用しての、今OpenGLはglTranslatefからgluLookAtに切り替えた後に希望の出力を表示しません

import pyglet 
from pyglet.gl import * 

window = pyglet.window.Window() 

def draw_square(): 
    glBegin(GL_QUADS) 
    glVertex3f(0, 0, 0.0) 
    glVertex3f(100, 0, 0.0) 
    glVertex3f(100, 100, 0.0) 
    glVertex3f(0, 100, 0.0) 
    glEnd() 

def on_draw(): 
    window.clear() 
    draw_square() 

from pyglet.window import key 
@window.event 
def on_key_press(symbol, modifiers): 
    SHIFT_X_BY = 5.5 
    if symbol == key.LEFT: 
     glTranslatef(-SHIFT_X_BY, 0.0, 0.0) 
    elif symbol == key.RIGHT: 
     glTranslatef(SHIFT_X_BY, 0.0, 0.0) 
    elif symbol == key.UP: 
     glTranslatef(0.0, SHIFT_X_BY, 0.0) 
    elif symbol == key.DOWN: 
     glTranslatef(0.0, -SHIFT_X_BY, 0.0) 

window.on_draw = on_draw 
pyglet.app.run() 

:私は予想通りglTranslatefを使用して動作する次のコードを持っています。

import pyglet 
from pyglet.gl import * 

window = pyglet.window.Window(resizable=True) 

def draw_square(): 
    glBegin(GL_QUADS) 
    glVertex3f(0, 0, 0.0) 
    glVertex3f(100, 0, 0.0) 
    glVertex3f(100, 100, 0.0) 
    glVertex3f(0, 100, 0.0) 
    glEnd() 

def on_draw(): 
    window.clear() 
    draw_square() 


pos = {'x': 0, 'y': 0, 'z': 0} 

from pyglet.window import key 
@window.event 
def on_key_press(symbol, modifiers): 
    global pos 
    SHIFT_X_BY = 5.5 
    if symbol == key.LEFT: 
     pos['x'] = pos['x'] + SHIFT_X_BY 
    elif symbol == key.RIGHT: 
     pos['x'] = pos['x'] - SHIFT_X_BY 
    elif symbol == key.UP: 
     pos['y'] = pos['y'] + SHIFT_X_BY 
    elif symbol == key.DOWN: 
     pos['y'] = pos['y'] - SHIFT_X_BY 

    gluLookAt(pos['x'], pos['y'], pos['z'], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); 

window.on_draw = on_draw 
pyglet.app.run() 

をしかし、私は今、矢印キーのいずれかを押すと、四角がちょうど消える:私の代わりにgluLookAtを呼び出すコードを変更しました。 gluLookAtを呼び出すと何が間違っていますか?

EDITこの次on_draw()機能は動作しません。どちらか(私は黒い画面を取得する):

def on_draw(): 
    glLoadIdentity() 
    gluLookAt(pos['x'], pos['y'], pos['z'], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) 
    draw_square() 

答えて

2

gluLookAtは、ベクトルの3種類になります: "アップ" "目"、 "センター" と。

目はあなたが見る場所の中心で、上のベクトルはカメラがどのように「開かれているか」を示すために使用されます。通常、0,1,0に設定します。

gluLookAt(pos ['x']、pos ['y']、pos ['z']、0.0、0.0、0.0、0.0、1.0、0.0);

http://pyopengl.sourceforge.net/documentation/manual/gluLookAt.3G.html

+0

コードに変更されましたが、方向キーを押すと正方形が消えます。 – memyself

+0

もう1つの問題は、Modelviewマトリックスをリセットしないことです。 glLoadIdentity()のようなものを使わずにgluLookAtを何度も呼び出しているようです。 –

+0

'draw_square'呼び出しの前に' glLoadIdentity() 'を追加すると何も起こりません。 – memyself

0

あなたは射影行列を設定任意の初期化コードをお持ちですか? modelviewはアクティブなマトリックスですか? DavidはglLoadIdentityで行列を最初にクリアすることについて正しい考えを持っていました(gluLookAtはスタック上の現在の行列にそれ自身を乗算します)。しかし、モデルビュー行列に切り替えなかった場合、投影行列をワイプすると問題が発生します。

+0

いいえ、私は投影行列を設定しません。上記のコードはすべて私が行うことです。 'gl *'コマンドはありませんか? – memyself

+0

私はPygletを少し研究し、自動的に正書法の行列を設定しました。私はあなたが私の質問を無視できると思います。 – Tim

関連する問題