Ответ 1
Этот раздел был вдохновлен замечательной книгой Эрика Ленгэля "Математика для программирования 3D-игр и компьютерной графики".
Многие вычисления выполняются в пространстве глаз. Это связано с тем, что освещение обычно выполняется в этом пространстве, в противном случае эффекты, зависящие от положения глаз, такие как зеркальные огни, сложнее реализовать.
Следовательно, нам нужен способ преобразования нормали в пространство глаз...
Почему мы не можем сделать то же самое с нормальным вектором? Нормаль - это вектор из 3 поплавков, а модельная матрица - 4 × 4. Во-вторых, поскольку нормаль является вектором, мы хотим только преобразовать его ориентацию. Область матрицы отображения модели, которая содержит ориентацию, представляет собой верхнюю левую 3 × 3 подматрицу. Так почему бы не умножить нормаль этой подматрицей...
Давайте посмотрим на потенциальную проблему...
В приведенном выше рисунке матрица модели была применена ко всем вершинам, а также к нормали, и результат явно неправильный: нормаль больше не перпендикулярна поверхности.
Итак, теперь мы знаем, что мы не можем применять модельное представление во всех случаях для преобразования нормального вектора. Вопрос в том, какую матрицу мы должны применять?
Рассмотрим матрицу 3 × 3 G и посмотрим, как можно вычислить эту матрицу для правильного преобразования нормальных векторов...
правильная матрица для преобразования нормали является транспонированием обратного к матрице M. OpenGL вычисляет это для нас в gl_NormalMatrix...