2012-03-27 82 views
1

我无法获得gluLookAt的工作。我有下面的代码使用glTranslatef预期其工作原理:从glTranslatef切换到gluLookAt后,opengl不会呈现所需的输出

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() 

回答

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 2012-03-27 13:25:55

+0

另一个问题可能是,您从不重置模型视图矩阵。如果我在'draw_square'调用之前添加'glLoadIdentity()',似乎你多次调用gluLookAt,而没有像glLoadIdentity() – 2012-03-27 13:36:53

+0

那样的事情,那么什么都不会发生。 – memyself 2012-03-27 13:41:39

0

你有,设置了投影矩阵的任何初始化代码? ModelView是你的主动矩阵吗? David有关于首先用glLoadIdentity清除矩阵的正确想法(gluLookAt将自身与堆栈中的当前矩阵相乘),但是如果您没有切换到modelview矩阵,则擦除投影矩阵会导致问题。

+0

不,我没有设置投影矩阵。你上面看到的代码就是我所做的。哪个'gl *'命令丢失了? – memyself 2012-03-27 21:05:35

+0

我对pyglet做了一点研究,它自动设置了一个正交矩阵,所以我认为你可以忽略我的问题。 – Tim 2012-03-27 21:15:50