Пусть имеется некоторое аффинное преобразование Я, которое используется для преобразования геометрических объектов. Простейшим таким объектом является треугольник — обозначим его РРтРъ ~ с единичной нормалью п. Проще всего получить эту нормаль через нормирование векторного произведения [ р2 — р[, р3 -/?,].
В результате применения преобразования Я получим новый треугольник, у которого будет новый вектор нормали — п'. Посмотрим, как найти преобразование для вектора нормали (рис. 5.3).
Рис. 5.3. Преобразование нормали.
В первую очередь выделим из Я линейную часть. Она определяется как верхняя левая ЗхЗ-нодматрица матрицы Я: М = Я3х3. Поскольку перенос вершин никак не влияет на вектор нормали, то далее будем его игнорировать и рассматривать только линейное преобразование М.
Вектор п — это вектор нормали, следовательно, он перпендикулярен каждому из ребер исходного треугольника:
Если п' — новый вектор нормали, то он также перпендикулярен ребрам, но уже нового треугольника:
Используя свойства скалярного произведения, получим:
Из этих равенств следует, что вектор Мтп' также является нормалью к исходному треугольнику, т. е. он может отличаться от нормали п только длиной. Поскольку обычное масштабирование нас не интересует, мы можем считать, что эти векторы просто совпадают, т. е. Мтп' = п, следовательно, п' = (Мт)_1и. Данная формула описывает, как именно преобразуется нормаль к грани для произвольного аффинного преобразования: мы выделяем верхнюю левую ЗхЗ-подматрицу матрицы исходного преобразования, после чего транспонируем и обращаем ее. Отметим, что если исходное преобразование состоит только из преобразований поворота и переноса (так называемое жесткое преобразование (rigid transform)), то обратная матрица совпадает с транспонированной, поэтому для преобразования нормали используют верхнюю левую подматрицу исходной матрицы.