При рендеринге 3D-сцен с преобразованиями, примененными к объектам, нормали должны быть преобразованы с помощью транспонированной инверсии матрицы вида модели. Таким образом, с нормальным , modelViewMatrix М , преобразованный нормальный п ' является
При преобразовании объектов ясно, что нормали должны быть преобразованы соответственно. Но почему математически это соответствующая матрица преобразования?
transformations
geometry
Нерон
источник
источник
Ответы:
Вот простое доказательство того, что требуется обратная транспонирование. Предположим, у нас есть плоскость, определяемая уравнением плоскости , где n - нормаль. Теперь я хочу , чтобы преобразовать эту плоскость некоторой матрицы М . Другими словами, я хочу найти новое плоское уравнение n ′ ⋅ M x + d ′ = 0 , которое удовлетворяется для точно таких же значений x, которые удовлетворяют предыдущему плоскому уравнению.n ⋅ x + d= 0 N M N'⋅ Мх + д'= 0 Икс
Для этого достаточно установить равные уравнения в двух плоскостях. (Это исключает возможность произвольного изменения масштаба плоских уравнений, но это не важно для аргумента.) Тогда мы можем установить и вычесть его. То, что мы оставили, это:d'= д
Я перепишу это с точечными произведениями, выраженными в матричной записи (думая о векторах как матрицы из 1 столбца):
Теперь, чтобы удовлетворить это для всех , мы должны иметь:x
Теперь решение для с точки зрения п ,n′ n
Presto! Если точки преобразованы матрицей M , то плоские нормали должны преобразоваться путем обратной транспонирования M , чтобы сохранить плоское уравнение.x M M
Это в основном свойство точечного произведения. Для того чтобы скалярное произведение оставалось инвариантным при применении преобразования, два вектора, которые должны быть расставлены точками, должны преобразовываться соответствующим, но различным образом.
Математически это можно описать, сказав, что нормальный вектор - это не обычный вектор, а то, что называется ковектором (он же ковариантный вектор, двойной вектор или линейная форма). Ковектор в основном определяется как «вещь, которая может быть усеяна вектором для получения инвариантного скаляра». Чтобы достичь этого, он должен трансформироваться с использованием обратной транспонирования любой матрицы, работающей с обычными векторами. Это верно в любом количестве измерений.
Обратите внимание, что в 3D, в частности, бивектор похож на ковектор. Они не совсем одинаковые, поскольку у них разные единицы измерения: у ковектора есть единицы обратной длины, а у бивектора - единицы длины в квадрате (площадь), поэтому они ведут себя по-разному при масштабировании. Тем не менее, они трансформируются одинаково в отношении своей ориентации, что имеет значение для нормалей. Мы обычно не заботимся о величине нормали (мы всегда нормализуем их к единичной длине в любом случае), поэтому нам обычно не нужно беспокоиться о разнице между бивектором и ковектором.
источник
Это просто потому, что нормали на самом деле не являются векторами! Они создаются из перекрестных произведений, что приводит к бивекторам , а не векторам. Алгебра работает очень по-разному для этих координат, а геометрическое преобразование - это всего лишь одна операция, которая ведет себя по-разному.
Большим ресурсом для получения дополнительной информации об этом является презентация Эрика Ленгеля об алгебре Грассмана .
источник