Пожалуйста, не могли бы вы объяснить мое неправильное представление о gluLookAt()?

Я узнал из многих источников и путем повторной реализации функции и самостоятельного изучения матриц, что gluLookAt() эквивалентен вращению, за которым следует перевод в обратную координату глаза. Реализация аналогична в OpenGL, MESA, Cogl и т. д., и хороший обзор здесь: http://pic.dhe.ibm.com/infocenter/aix/v7r1/topic/com.ibm.aix.opengl/doc/openglrf/gluLookAt.htm

Однако рассмотрим случай, когда цель наблюдения находится в начале координат, т. е. (0, 0, 0), а виртуальная камера немного смещена относительно оси Z, например, (2, 2, 10). Результат gluLookAt() должен иметь начало в центре поля зрения. Начальный шаг вращения не имеет значения, но более поздний шаг смещения смещает начало координат от центра!

Можете ли вы объяснить мое неправильное представление о gluLookAt()?


person user2601595    schedule 20.07.2013    source источник


Ответы (2)


Документация, на которую вы ссылаетесь, действительно неверна.

Если мы посмотрим на другую документацию, мы увидим, что матрица вида строится из матрицы поворота и матрицы перевода следующим образом:

V = R * T

Чтобы преобразовать вершину v, мы вычисляем

v' = V * v = R * T * v = R * (T * v)

Итак, мы сначала применяем перевод, а затем поворот. И поскольку есть перевод, часть вращения также влияет на начало координат. Вот почему можно сопоставить начало координат с центром экрана.

person Nico Schertler    schedule 20.07.2013

Пожалуйста, не могли бы вы объяснить мое неправильное представление о gluLookAt()?

Ваша ошибка заключается в том, что вы думаете об этом как о последовательности шагов. Это не так работает. gluLookAt вычисляет матрицу преобразования, которая напрямую отображает координаты желаемым образом. Там нет «промежуточного» шага вращения.

person datenwolf    schedule 20.07.2013