Как правильно использовать 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 с помощью клавиш влево и вправо. На самом деле, когда я использую левую и правую клавиши, куб будет вращаться вокруг "глаза", ускоряясь клавишами. Клавиша up вызывает другой куб из негде прорезать экран и попасть в первый куб. Клавиша "вниз"возвращает таинственный клонированный куб. Это может быть объединено с ротацией, чтобы дать совершенно другой результат, поскольку указанная документация возникнет.

Что случилось?

спасибо.

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.