1

仕事ができなくて困ってgluLookAtいます。を使用して期待どおりに動作する次のコードがありますglTranslatef

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、カメラをシフトするだけでよいと思いました。gluLookAt代わりに呼び出すようにコードを変更しました。

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ますか?

この次の機能を編集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()
4

2 に答える 2

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

于 2012-03-27T13:22:31.303 に答える
0

射影行列を設定する初期化コードはありますか? モデルビューはアクティブ マトリックスですか? デビッドは最初に glLoadIdentity でマトリックスをクリアするという正しい考えを持っていました (gluLookAt はスタック上の現在のマトリックスで乗算されます) が、モデルビュー マトリックスに切り替えていない場合、射影マトリックスを消去すると問題が発生します。

于 2012-03-27T16:55:14.710 に答える