Чому транспонований зворотний матриця перегляду моделей використовується для перетворення нормальних векторів?


22

Під час візуалізації 3D-сцен із перетвореннями, застосованими до об'єктів, нормали повинні бути перетворені з перекладеною інверсією матриці подання моделі. Отже, при нормальній , modelViewMatrix M , перетворена нормальна n ' єnMn

n=(M1)Tn

При перетворенні об'єктів зрозуміло, що нормали потребують відповідного перетворення. Але чому математично це відповідна матриця перетворення?


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

Відповіді:


22

Ось простий доказ того, що потрібен зворотний перенос. Припустимо, у нас є площина, визначена рівнянням площини , де n - норма. Тепер я хочу , щоб перетворити цю площину деякої матриці М . Іншими словами, я хочу знайти нову площину рівняння п 'M х + d ' = 0 , що виконується для одних і тих же х значень, що задовольняють рівняння попередньої площині.nx+d=0nMnMx+d=0x

Для цього достатньо встановити два плоских рівняння рівними. (Це дає можливість змінити масштаб рівнянь площини довільно, але це не важливо для аргументу.) Тоді ми можемо встановити і відняти його. Залишилось:d=d

nMx=nx

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

nTMx=nTx

Тепер, щоб задовольнити це для всіх , ми повинні мати:x

nTM=nT

Тепер розв’язуємо для з точки зору n ,nn

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

Престо! Якщо точки перетворюються матрицею M , то плоскі нормали повинні перетворитись зворотним транспозицією M , щоб зберегти рівняння площини.xMM

В основному це властивість крапкового продукту. Щоб крапковий продукт залишався інваріантним при застосуванні трансформації, два вектори, які пунктируються, повинні трансформуватися відповідними, але різними способами.

Математично це можна описати, сказавши, що звичайний вектор - це не звичайний вектор, а річ, яка називається ковектором (він же коваріантним вектором, подвійним вектором або лінійною формою). Ковектор в основному визначається як "річ, яка може бути пунктирована вектором для отримання інваріантного скаляра". Щоб досягти цього, він повинен перетворитись за допомогою зворотного транспозиції будь-якої матриці, що працює на звичайних векторах. Це стосується будь-якої кількості вимірів.

Зауважте, що в 3D конкретно, бівектор схожий на ковектор. Вони не зовсім однакові, оскільки у них різні одиниці: у ковектора є одиниці оберненої довжини, а у бівектора - одиниці довжини у квадраті (площі), тому вони змінюються по-різному в масштабі. Однак вони трансформуються однаково щодо своєї орієнтації, що важливо для нормалів. Зазвичай ми не переймаємось величиною норми (ми все одно їх нормалізуємо на одиницю довжини), тому нам зазвичай не потрібно турбуватися про різницю між бівектором і ковектором.


2
дивовижне пояснення. однак трохи швидше на 2 бали, хотілося б трохи більше деталей: 1. як ви переходите з точкових продуктів на матричні продукти? 2. Між рядком 2 та 3 останнього цитованого розділу, що трапиться (п.
Перенесено

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 ми використовували для того, щоб відслідковувати, чи має матриця перетворення ці властивості, щоб заощадити витрати при нормальних перетвореннях.
Simon F

6

Це просто тому, що нормали насправді не є векторами! Вони створюються перехресними продукції, що призводить до бівекторов , а НЕ вектори. Алгебра працює на цих координатах сильно, і геометричне перетворення - це лише одна операція, яка поводиться по-різному.

Прекрасним ресурсом для того, щоб дізнатися більше про це, є презентація Еріка Ленгіеля про алгебру Грассмана .


Нормальними є також так звані псевдовектори. Як узагальнення і правило, все, що випливає з поперечного продукту (наприклад, площини), буде перетворене аналогічно.
Маттіас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.