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 种类型的向量:“eye”、“center”和“up”。

眼睛是你看的地方,你看的中心,向上的向量用于告诉凸轮它是如何“打开”的。通常您设置为 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

您是否有任何设置投影矩阵的初始化代码?模型视图是您的有源矩阵吗?David 有一个正确的想法,即首先使用 glLoadIdentity 清除矩阵(gluLookAt 将自身与堆栈上的当前矩阵相乘),但如果您还没有切换到模型视图矩阵,那么擦除投影矩阵会导致问题。

于 2012-03-27T16:55:14.710 回答