Почему транспонированная инверсия матрицы представления модели используется для преобразования нормальных векторов?

22

При рендеринге 3D-сцен с преобразованиями, примененными к объектам, нормали должны быть преобразованы с помощью транспонированной инверсии матрицы вида модели. Таким образом, с нормальным , modelViewMatrix М , преобразованный нормальный п ' являетсяnMn

n=(M1)Tn

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

Нерон
источник
Если матрица модели состоит из сдвига, поворота и масштаба, вам не нужно делать обратное транспонирование для вычисления нормальной матрицы. Просто разделите нормаль по квадрату масштаба и умножьте на матрицу модели, и все готово. Вы можете распространить это на любую матрицу с перпендикулярными осями, просто вычислите масштаб квадрата для каждой оси матрицы, которую вы используете вместо этого. Я написал подробности в своем блоге: lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Эрик,

Ответы:

22

Вот простое доказательство того, что требуется обратная транспонирование. Предположим, у нас есть плоскость, определяемая уравнением плоскости , где n - нормаль. Теперь я хочу , чтобы преобразовать эту плоскость некоторой матрицы М . Другими словами, я хочу найти новое плоское уравнение n M x + d = 0 , которое удовлетворяется для точно таких же значений x, которые удовлетворяют предыдущему плоскому уравнению.nx+d=0nMnMx+d=0x

Для этого достаточно установить равные уравнения в двух плоскостях. (Это исключает возможность произвольного изменения масштаба плоских уравнений, но это не важно для аргумента.) Тогда мы можем установить и вычесть его. То, что мы оставили, это:d=d

nMx=nx

Я перепишу это с точечными произведениями, выраженными в матричной записи (думая о векторах как матрицы из 1 столбца):

nTMx=nTx

Теперь, чтобы удовлетворить это для всех , мы должны иметь:x

nTM=nT

Теперь решение для с точки зрения п ,nn

nT=nTM1n=(nTM1)Tn=(M1)Tn

Presto! Если точки преобразованы матрицей M , то плоские нормали должны преобразоваться путем обратной транспонирования M , чтобы сохранить плоское уравнение.xMM

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

Математически это можно описать, сказав, что нормальный вектор - это не обычный вектор, а то, что называется ковектором (он же ковариантный вектор, двойной вектор или линейная форма). Ковектор в основном определяется как «вещь, которая может быть усеяна вектором для получения инвариантного скаляра». Чтобы достичь этого, он должен трансформироваться с использованием обратной транспонирования любой матрицы, работающей с обычными векторами. Это верно в любом количестве измерений.

Обратите внимание, что в 3D, в частности, бивектор похож на ковектор. Они не совсем одинаковые, поскольку у них разные единицы измерения: у ковектора есть единицы обратной длины, а у бивектора - единицы длины в квадрате (площадь), поэтому они ведут себя по-разному при масштабировании. Тем не менее, они трансформируются одинаково в отношении своей ориентации, что имеет значение для нормалей. Мы обычно не заботимся о величине нормали (мы всегда нормализуем их к единичной длине в любом случае), поэтому нам обычно не нужно беспокоиться о разнице между бивектором и ковектором.

Натан Рид
источник
2
классное объяснение. Тем не менее, немного быстрее на 2 пункта, хотелось бы узнать немного больше деталей: 1. Как вы переходите от точечных продуктов к матричным продуктам? 2. что происходит между строками 2 и 3 последнего процитированного раздела (n магически перемещается слева направо слева направо)
v.oddou
4
1. (a ^ T) b совпадает с точкой (a, b), если a и b являются матрицами столбцов одного размера. Попробуйте математику для себя! 2. (AB) ^ T = (B ^ T) (A ^ T), и (A ^ T) ^ T = A Для получения дополнительной информации о матрицах см. «Матричную кулинарную книгу»
Мокоша,
3
@ v.oddou Да, Мокоша прав. Точечный продукт может быть выражен как умножение матрицы 1 × n (вектор строки) на матрицу × 1 (вектор столбца); В результате получается матрица 1 × 1, единственным компонентом которой является скалярное произведение. Транспонирование вектора столбца является вектором строки, поэтому мы можем записать a · b как ^ T b. Для второго вопроса транспонирование произведения матриц эквивалентно транспонированию отдельных факторов и обращению их порядка в обратном порядке.
Натан Рид
отлично, теперь все ясно без проблем. спасибо обоим
v.oddou
@NathanReed (Черт возьми, это возвращает меня к ранним дням PowerVR, когда мы моделировали большинство вещей с помощью самолетов). Также стоит упомянуть, что для целей оптимизации, если у вас есть матрица Mr, которая содержит только повороты (то есть является ортогональной), то Inverse ( Mr ) = Transpose ( Mr ) и, таким образом, Trans (Inverse ( Mr ) = _ Mr_. Вы также можете использовать ярлыки для части перевода, и если вы знаете, что масштабирование равномерное. FWIW в графической библиотеке SGL PowerVR, мы использовали для сохранения логических значений, чтобы отслеживать, есть ли у матрицы преобразования эти свойства для экономии затрат при обычных преобразованиях
Симон F
6

Это просто потому, что нормали на самом деле не являются векторами! Они создаются из перекрестных произведений, что приводит к бивекторам , а не векторам. Алгебра работает очень по-разному для этих координат, а геометрическое преобразование - это всего лишь одна операция, которая ведет себя по-разному.

Большим ресурсом для получения дополнительной информации об этом является презентация Эрика Ленгеля об алгебре Грассмана .

ap_
источник
Нормалы также являются так называемыми псевдовекторами. Как обобщение и практическое правило, все, полученное в результате перекрестного произведения (например, плоскости), будет преобразовано аналогичным образом.
Матиас