Вопрос по выводу gluLookAt функции в OpenGL? Всем доброго вечера,
Извините, если задаю вопрос, который неоднократно обсуждался, и если есть готовый ответ, то прошу ткнуть меня носом в него. Небольшая предыстория: я пытаюсь разобраться в основах 3д графики для того, чтобы в итоге написать небольшой пример, где имеется свободное перемещение «камеры» в пространстве с вращением мира и так далее. Согласен, есть примеры, но они построены на чужих решениях, которые, порой, для меня непонятны. И над некоторыми вопросами, я бьюсь давно, что уже исписал немало листов :(
Изучая работу gluLookAt я заметил, что вектор up обычно указывает по одной оси (y или -z), не смотря на то, куда обращён взгляд «камеры» (да, я знаю, что надо смещать мир, дабы сэмулировать понятие движения в OpenGL). Теоретически, вектор up должен быть ортогонален направлению камеры (или разницы между точками — center и eye, то есть опять же вектор с концом «куда смотреть» и началом «откуда»). Интернет пишет, что это неважно и часто up вектор просто смотрит «вверх», неважно куда направлена камера.
Можете ли объяснить мне, почему так? Потому что, когда я попытался сэмулировать наклон камеры, то у меня встала задача вращать вектор up относительно вектора направления камеры, и для меня это составило трудность.
И второй вопрос, он относится к заголовку, помогите мне пожалуйста с объяснением, как выводится сама функция gluLookAt. В интернете, я отыскал небольшой сайт (сорри, что на немецком), где описывается как реализовать эту функцию, и у меня это получилось (с операциями над векторами и матрицами, я немного владею).
Если возможно, не смогли бы вы мне объяснить, почему в та матрица преобразований, которую мыс троим в конце — именно то, что нам нужно (понятно, что она даёт нам правильный результат).
Вот смотрите:
Когда мы получаем нормализованный вектор направления камеры и нормализованный вектор up, то мы их векторно умножаем друг на друга:
s' = f x UP'
Геометрический смысл этого произведения — новый вектор, который перпендикулярен плоскости проходящей через два вектора, и направлен «вправо» (кажется это называется, что три вектора образуют правые оси координат, ну или к ним применимо правило правой руки).
Хорошо, допустим, мы нормализуем наш вектор и снова умножаем его на вектор направления камеры, с последующей нормализацией:
u = s x f
Отлично, новый вектор, перпендикулярный обеим векторам, получен. Но я не могу понять, (простите за глупость) — зачем, и как мы переходим вот к такой матрице:| s[0] s[1] s[2] 0 |
M = | u[0] u[1] u[2] 0 |
| -f[0] -f[1] -f[2] 0 |
| 0 0 0 1 |
Это возможно, матрица поворота, но здесь я не вижу последовательного умножения матриц поворота относительно отдельных осей X, Y, Z (таких как в Википедии). Тем более, что у нас нет никаких косинусов и углов, которые мы могли вычислить из имеющихся двух векторов.
Спасибо вам больше заранее.

21 Авг 2019 в 06:16
162 +1
0
Ответы
1

Добрый вечер!

Вектор up в функции gluLookAt действительно указывает вверх, независимо от направления камеры. Это сделано для удобства программиста, чтобы не нужно было каждый раз корректировать вектор up при изменении направления камеры. Действительно, матрица преобразования, которую мы строим в конце с помощью векторов направления камеры, up и векторного умножения, обеспечивает правильное положение камеры относительно сцены.

Что касается матрицы, которую вы предоставили, это матрица 4х4, которая описывает не только поворот камеры, но и ее положение. Это не просто матрица поворота относительно отдельных осей X, Y, Z.

В этой матрице s, u и -f - это новые векторы, которые мы получили в результате векторного умножения. Помимо этих векторов, матрица также содержит последний столбец и строку, которые описывают положение камеры в пространстве.

Интересно, что вы глубоко разбираетесь в математике и графике OpenGL! Надеюсь, что моя подсказка помогла вам разобраться в реализации gluLookAt функции. Если у вас есть еще вопросы, не стесняйтесь задавать. Удачи в вашем проекте!

20 Апр в 13:21
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 126 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир