таксебемысль 24. Про теорию представлений или зачем 3d-моделеры ссылаются на квантовую химию.

Решил тут вкусного написать, но надо как-то это упорядочить. Окей, начнем с относительно общеизвестных вещей, а 3d-графон пойдет потом.

В школьной химии нас учили заполнять электронные орбитали атомов: 1 квадратик, 1+3 квадратика, 1+3+5 квадратиков, 1+3+5+7 квадратиков, мы туда радостно рисуем стрелочки (но не больше двух на квадратик!) и с умным видом говорим про форму орбиталей, представляя себе трехмерные блямбы из учебника.

Сильно позже, - и только при условии выживания на первых курсах, и сохранения здравого рассудка на последних, - мы узнаём, что последовательность 1,4,9,16,... - это размерности собственных подпространств оператора Шрёдингера с центрально симметричным квадратично убывающим потенциалом, 1,3,5,7,... - это размерности неприводимых представлений SO(3), на которые разлагается каждое собственное подпространство, стрелочек в квадратик умещается 2 - потому что SO(3) двулистно накрывается группой SU(2), aka 3-сферой единичных кватернионов. А блямбы - это просто визуализация сферических гармоник, домноженных на какую-то радиальную функцию.

Хотя математика тут прекрасна, простому человеку, не связанному с квантовой химией или физикой, это, казалось бы, не особо нужно. Но у любой хорошей математической истории есть продолжение.

В жаргоне 3d-моделлеров и дизайнеров игр есть одно странное слово - "запекание". Попробую объяснить, как я это понимаю для чайников вроде себя самого. При отрисовке 3d-объекта на экране мы для каждого экранного пикселя определяем его цвет, для этого мы определяем какому треугольнику 3d-объекта он соответствует, какие у него барицентрические координаты, какой точке на текстурной развертке эти координаты соответствуют, и берем цвет этой текстурной точки. Если у вас была стереометрия, и была по ней пятерка, то базовую машинерию рендеринга вы поймете без труда.

То, что описано выше, - будет, конечно, полным говнищем: потому что мы не учли тени, блики и прочие очевидные элементы художественной 3d-выразительности. Чтобы добавить красоты, мы добавляем в объемную сцену свет: например, в виде бесконечно удаленного источника, то есть просто вектора. Теперь мы можем сделать наш пиксель ярче, если в точке 3d-объекта, которой он соответствует, нормаль к поверхности почти параллельна вектору света. А если эти два вектора составляют угол меньше 90 градусов, то это теневая сторона объекта, и наш пиксель нужно затемнить.

Отлично. Простое рассмотрение нормали в каждой точке дало нам базовые 3d-эффекты. Нормали можно нехитро рассчитать, тут есть два варианта. Если мы хотим рисовать угловатые многогранники, то мы просто для каждого треугольника считаем его настоящую геометрическую нормаль: векторное произведение его сторон. Если мы хотим работать с гладенькими объектами, то нужно нормали непрерывно интерполировать. Для этого мы: (1) снабжаем каждый треугольник настоящей геометрической нормалью (2) для каждой вершины рассчитываем ее "нормаль" как среднее арифметическое нормалей треугольников, которые содержат вершину, (3) для точки треугольника в качестве нормали берем барицентрическое взвешенное "нормалей" его вершин.

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

Сделаем следующий шаг: разрешим функцию нормалей задавать не из геометрических соображений, а вообще как угодно. Мы все равно храним текстуры, так давайте еще в 2d формате хранить распределение нормалей на поверхности объекта. Эта хрень называется картой нормалей. Чем это нам помогает? А тем, что мы можем искусственно сделать на поверхности бугорок, не делая его в действительности. Просто на соответствующей карте нормалей пошевелим значения нормалей в паре пикселей. В плане ресурсов это оптимальнее, чем добавлять 20 новых треугольников. Особенно если бугорков на модели не один, а десять тысяч.

Ну и вот простейшее запекание - это когда моделер делает высокополигональную модель, а потом оптимизирует ее в низкополигональную так, чтобы мелкие особенности зашились в карту нормалей. Сейчас к такому все привыкли, но когда оно впервые появилось, то производило вау-эффект. Я помню, когда мы в общаге после Морровинда установили обливион, - он кряхтел только на минималках, но мы прямо залипали на бликующие каменные стены в подземельях (сейчас тот графон, конечно, воспринимается весьма топорным).

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

Хранить сферическую функцию "попиксельно" (что бы ни означали сферические пиксели) да еще и в каждой точке объекта или сцены - весьма неэкономно. Любой человек, знающий анализ Фурье, устройство jpeg'ов и вот это вот все сразу скажет, что нужно делать: надо разложить функцию по нескольким первым сферическим гармоникам, и хранить только их коэффициенты. Берут, например, на каждый цветовой канал по 1+3+5 гармоник, и раскладывают: вместо хранения сферической функции, храним в каждой точке объекта 27 чисел, красота. Для качественного рендеринга отражений это, конечно, не годится: слишком неточно приближение по 9 гармоникам. Но красивый рассеянный свет на объектах позволяет сделать - для каких-нибудь хромированных труб сойдет.

Моделеру (3d-редактору, ясное дело) опять же придется сделать предварительное запекание светового фона в разных точках. Математически в данном случае это означает, что он вычисляет коэффициенты разложения световой функции по ортогональным сферическим гармоникам, то есть интегралы от какой-то гадости по 2-сфере. Метод Монте-Карло тут в помощь.

Имея предварительно рассчитанные гармонические коэффициенты светового поля, притороченные к координатам поверхности объекта, мы можем в режиме реального времени быстро рисовать красивый свет на объекте. Однако, нам может приспичить повращать наш объект. Это эквивалентно тому, что для фиксированной точки на поверхности обратным преобразованием вращается окружающий световой фон. Нужно иметь способ быстро пересчитывать новые коэффициенты разложения по сферическим гармоникам, не тратя время на повторное запекание.

А что для этого нужно? То самое ружье, которое висит на верху этого поста: нужно понять как SO(3) действует на векторном пространстве сферических гармоник фиксированной степени, то есть фактически на градуированных компонентах фактор-алгебры R[x,y,z]/(x^2+y^2+z^2). У нас получается действие на 1-мерном пространстве констант, на 3-мерном пространстве линейных гармоник, на 5-мерном пространстве квадратичных гармоник и т.д. А учитывая, что повороты в 3d-графике хранятся в формате кватернионов единичной длины, мы реально даже описываем представления вполне себе односвязной группы SU(2), а не SO(3). Хотя, конечно, поскольку у нас всё вещественное, неприводимые представления SU(2) с нечетным старшим весом (и соответственно четной размерности) в нашем списке отсутствуют.

Вот. В целом, я вдохновлялся вот этой статьей. Статья зело старая, но про то как в более современной графике используются сферические гармоники, вы без труда сами нагуглите. Конечно, представления малых весов, которые реально используются, довольно нехитрые: на константах повороты действуют тривиально, на линейных многочленах - канонически, а на квадратных мономах - это посильное упражнение для тех, кто понял предыдущий абзац. В последнем случае, правда, дьявол в деталях. Расчет коэффициентов по Монте-Карло делается для стандартных сферических гармоник (тех, которые через многочлены Лежандра записываются), потому что они образуют ортогональную систему (а функции x^2, y^2, z^2, xy, xz, yz - нет). А значит действие SO(3) нужно описывать именно в конкретном базисе гармоник. Математики таким заниматься не будут... зато это сделали квантовые химики. Упомянутая выше статья как раз ссылается на какие-то подобные работы.

Комментариев нет:

Отправить комментарий