Я не хочу входить в сложную тригонометрию для вычисления вращений и подобных вещей для моего 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 с левыми и правыми ключами. То, что на самом деле происходит, когда я буду использовать левые и правые ключи, куб будет вращаться вокруг "глаза", ускоряемого ключами. Ключ заставляет другой куб из ниоткуда резать через экран и поражать первый куб. Вниз ключ возвращает таинственный клонированный куб. Это может быть объединено с вращением для предоставления совершенно другого результата, поскольку сказанная документация возникла бы.
Что же, спрашивается, является неправильным?
Спасибо.
(Интуиция, лежащая в основе вектора «вверх» в 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.