opengl не будет отображать желаемый результат после переключения с glTranslatef на gluLookAt - PullRequest
1 голос
/ 27 марта 2012

У меня проблемы с тем, чтобы заставить 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()

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

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 голосов
/ 27 марта 2012

Есть ли у вас код инициализации, который устанавливает матрицу проекции? Modelview - ваша активная матрица? У Дэвида была правильная идея о том, чтобы сначала очистить матрицу с помощью glLoadIdentity (gluLookAt умножается на текущую матрицу в стеке), но если вы не переключились на матрицу вида модели, то очистка матрицы проекции может вызвать проблемы.

...