glm:: lookat, уточнение перспективы в OpenGL


Все Яллы,

Я настроил глаз камеры на положительную ось z (0, 0, 10), направив его вверх в сторону положительного y (0, 1, 0), а центр-в сторону положительного x (2, 0, 0). Если y вверх, а камера смотрит вниз по отрицательной оси z, то x указывает влево в координатах экрана, в координатах мира OpenGL для правой руки.

У меня также есть объект, центрированный в начале мира. Поскольку камера смотрит больше влево (положительное направление x), я ожидаю, что мой объект, центрированный по началу координат, будет двигаться прямо в результирующую проекцию экрана. Но я вижу, что дело обстоит как раз наоборот.

Не хватает ли мне фундаментального понимания? Если да, то что? Если нет, то может ли кто-нибудь объяснить, как правильно использовать glm для создания матриц представления и проекции в правой модели мира OpenGL по умолчанию, которые отправляются шейдерам?

glm::vec3 _eye(0, 0, 10), _center(2, 0, 0), _up(0, 1, 0);
viewMatrix = glm::lookAt(_eye, _center, _up);
projectionMatrix = glm::perspective(glm::radians(45), 6./8., 0.1, 200.);
Еще одна вещь, которую я нахожу интересной, - это красная линия на изображении, указывающая в положительном направлении X. Это буквально [глаз -> (вперед + глаз)] вектор другого камера в сцене, которую я извлекаю из обратной части viewMatrix. То, что плавит мой мозг об этом, когда я использую матрицы VP этой камеры, она указывает в направлении, противоположном тому же прямому направлению, которое было извлечено из обратной части viewMatrix. Я был бы очень признателен за любое понимание этого несоответствия.

Также стоит отметить: я построил glm 0.9.9 через cmake. И я проверил, что он использует правый, [-1, 1] варианты взгляда и перспективы.

Результат изображение: Введите описание изображения здесь

1 2

1 ответ:

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

glm::lookAt определяет матрицу представления. Параметры glm::lookAt находятся в мировом пространстве, а параметр center glm::lookAt определяет положение, в котором вы смотрите.

Пространство вида - это локальная система, которая определяется точкой зрения на сцену. Положение взгляда, линия визирования и направление вверх просмотр, определение системы координат относительно мировой системы координат. Матрица вида преобразуется из пространства вольрда в пространство вида (глаза).

Если система координат пространства вида являетсяправосторонней системой, то ось X указывает влево, ось Y-вверх, а ось Z-вне поля зрения (обратите внимание, что в правой системе ось Z является перекрестным произведением оси X и оси Y).

Введите описание изображения здесь

Линия визирования-это векторная форма eye положение к center положению:

eye    = (0, 0, 10)
center = (2, 0, 0)
up     = (0, 1, 0)

los = center - eye = (2, 0, -10)

В этом случае, если центр объекта находится в (0, 0, 0), а вы смотрите на (0, 0, 2), то вы смотрите на позицию справа от объекта, это означает, что объект смещен влево.
Это изменится, если вы измените точку зрения, например (0, 0, -10) или перевернете вектор вверх, например (0, -1, 0).