Как я использую gluLookAt правильно?

Я не хочу входить в сложную тригонометрию для вычисления вращений и подобных вещей для моего 3D мира, таким образом, gluLookAt походит на хорошую альтернативу. Согласно документации все, что я должен сделать, поместить 3 координаты для положения камер, три для того, что я должен смотреть на и положение. Последнее не имело никакого смысла, пока я не предположил, что это должно было быть под прямым углом с углом обзора в направлении, которым должна быть вершина экрана.

Это не работает как этот вообще. У меня есть некоторый код Python. Это - код, который инициализирует некоторые данные и некоторый код режима для того, когда я ввожу эту часть игры:

def init(self):
    self.game_over = False
    self.z = -30
    self.x = 0
def transfer(self):
    #Make OpenGL use 3D
    game.engage_3d(45,0.1,100)
    gluLookAt(0,0,-30,0,0,0,0,1,0)

"игра engage_3d (45 0.1 100)" в основном настраивает матрицу проекции, чтобы иметь угол на 45 градусов представления и рядом и далекие координаты 0,1 и 100.

Первый gluLookAt помещает камеру в правильное положение, приятно.

Мне потянули куб с центром (0,0,0), и он хорошо работает без gluLookAt. Прежде чем я потяну его, у меня есть этот код:

gluLookAt(self.x,0,self.z,0,0,0,0,1,0)
if game.key(KEY_UP):
    self.z += 2.0/game.get_fps()
if game.key(KEY_DOWN):
    self.z -= 2.0/game.get_fps()
if game.key(KEY_LEFT):
    self.x += 2.0/game.get_fps()
if game.key(KEY_RIGHT):
    self.x -= 2.0/game.get_fps()

Теперь от этого, положение должно всегда совпадать с, это всегда под прямым углом. То, что я думал бы, что это сделает, продвигаются и поддерживают ось z вверх и вниз по ключам и левый и правый через ось X с левыми и правыми ключами. То, что на самом деле происходит, когда я буду использовать левые и правые ключи, куб будет вращаться вокруг "глаза", ускоряемого ключами. Ключ заставляет другой куб из ниоткуда резать через экран и поражать первый куб. Вниз ключ возвращает таинственный клонированный куб. Это может быть объединено с вращением для предоставления совершенно другого результата, поскольку сказанная документация возникла бы.

Что же, спрашивается, является неправильным?

Спасибо.

15
задан Matthew Mitchell 31 July 2010 в 22:57
поделиться

1 ответ

(Интуиция, лежащая в основе вектора «вверх» в gluLookAt, проста: смотрите на что угодно. Теперь наклоните голову на 90 градусов. То, где вы находитесь, не изменилось, направление, на которое вы смотрите, не изменилось, но Изображение на вашей сетчатке явно имеет. В чем разница? Куда указывает верхняя часть вашей головы. Это вектор вверх.)

Но отвечу на ваш вопрос: вызовы gluLookAt не должны объединяться. Другими словами, единственный шаблон, в котором можно использовать gluLookAt, если вы точно не знаете, как он работает, следующий:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# do not touch the modelview matrix anymore!

Судя по вашему коду, вы делаете что-то вроде этого:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# some stuff..
gluLookAt(...);

Это будет генерируют странные результаты, потому что gluLookAt умножает текущую матрицу на матрицу просмотра, которую он вычисляет. Если вы хотите объединить преобразования, вам действительно лучше выяснить, как заставить glTranslate, glScale и glRotatef работать на вас. Более того, вы должны узнать, как работают преобразования координат, и придерживаться glMultMatrix.

39
ответ дан 1 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: