Gl_NormalMatrix

Я обнаружил, что "gl_NormalMatrix - матрица 3x3, представляющая матрицу отображения обратной матрицы транспонирования". Почему матрица для нормалей должна быть обратной матрицей пространственного преобразования? Почему я не могу использовать матрицу просмотра модели для этой цели?

Ответ 1

Смотрите здесь:

Этот раздел был вдохновлен замечательной книгой Эрика Ленгэля "Математика для программирования 3D-игр и компьютерной графики".

Многие вычисления выполняются в пространстве глаз. Это связано с тем, что освещение обычно выполняется в этом пространстве, в противном случае эффекты, зависящие от положения глаз, такие как зеркальные огни, сложнее реализовать.

Следовательно, нам нужен способ преобразования нормали в пространство глаз...

Почему мы не можем сделать то же самое с нормальным вектором? Нормаль - это вектор из 3 поплавков, а модельная матрица - 4 × 4. Во-вторых, поскольку нормаль является вектором, мы хотим только преобразовать его ориентацию. Область матрицы отображения модели, которая содержит ориентацию, представляет собой верхнюю левую 3 × 3 подматрицу. Так почему бы не умножить нормаль этой подматрицей...

Давайте посмотрим на потенциальную проблему...

В приведенном выше рисунке матрица модели была применена ко всем вершинам, а также к нормали, и результат явно неправильный: нормаль больше не перпендикулярна поверхности.

Итак, теперь мы знаем, что мы не можем применять модельное представление во всех случаях для преобразования нормального вектора. Вопрос в том, какую матрицу мы должны применять?

Рассмотрим матрицу 3 × 3 G и посмотрим, как можно вычислить эту матрицу для правильного преобразования нормальных векторов...

правильная матрица для преобразования нормали является транспонированием обратного к матрице M. OpenGL вычисляет это для нас в gl_NormalMatrix...

Ответ 2

Это потому, что нормаль - это вектор, который является направлением без позиции... или, по крайней мере, направлением в любой позиции. Верхняя левая матрица 3 x 3 вашей нормальной модели 4 × 4 modelView содержит компонент вращения матрицы modelView. Применяя 3 x 3, вы изменяете направление нормального вектора. 4-й столбец матрицы ModelView содержит компонент перевода, и нет смысла применять изменение положения к вектору... вектор не имеет позиции. Для точек требуется матрица модели 4 x 4, поскольку они имеют положение.

Ответ 3

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