Создание карты нормалей (Normal Map) в Blender

Плоскость с картой нормалейОдной из главных задач текстурирования для 3d-игр является создание карты нормалей (Normal map). Карта нормалей служит для имитации высокополигональной графики в игровых моделях со значительно более низким числом полигонов. Например, при помощи карты нормалей можно на обычной плоскости, состоящей из двух треугольников, воссоздать сложный рельеф каменистой поверхности, каждый камешек которой будет выглядеть объемным и переливаться под воздействием источников освещения.

Существует множество способов создания карт нормалей. Каждый из способов хорош в своем случае. Можно воспользоваться специальным плагином для Gimp, который так и называется Normal Map; можно использовать специальным программным обеспечением, например Sculptris или Crazy Bump. Но для создания «честной» карты нормалей, которая требует точной передачи геометрии исходной высокополигональной модели, лучше всего воспользоваться именно средствами 3d-редактора.

Я расскажу, как это делается в Blender. Хотя в Интернете существует множество руководств по созданию Normal Map в Blender, я сразу же столкнулся с трудностями. Весь процесс настолько прост, что занимает всего несколько кликов, но нигде в руководствах я так и не смог вычитать, как именно работает создание карты нормалей внутри Blender.

Итак, для создания Normal Map в Blender нам потребуется два варианта модели: низкополигональная, которую мы будем использовать непосредственно в игре, и высокополигональная, которая будет отражать требуемую нам геометрию. Для упрощения эксперимента я создал простую плоскость, скопировал ее через Shift+D и методом редактирования поверхности воссоздал простенький квадратный кратер.

Исходная модель и плоскость с Normal map

На рисунке исходная модель с геометрией фигуры находится слева (серая), а плоскость, к которой применяется полученная карта нормалей находится справа (зеленая).

Весь процесс действительно состоит всего из нескольких шагов:

1. Создаем две модели: низкополигональную (low-poly model) и высокополигональную (high-poly). Очередность создания роли не играет.

2. В UV-редакторе создаем новое пустое изображение и делаем в него Unwrap низкополигональной модели (low-poly)

UV Unwrap в новое изображение

3. Выделяем сперва модель с геометрией (high-poly), затем вместе с клавишей Shift выделяем низкополигональную low-poly модель (в моем случае — плоскость). Обратите внимание! Последовательность выделения очень важна! Сперва high-poly, затем low-poly!

Создание Normal Map в Blender

4. В окне Properties закладке Render пролистываем в самый низ и находим секцию Bake. Выбираем Bake Mode: Normals, Normal Space: Tangent и обязательно ставим галочку Selected to Active, указывая, что мы будем выпекать карту нормалей из выбранного (подсвеченного оранжевым high-poly) объекта в активный (подсвеченный желтым low-poly) объект.

Настройки для создания Tangent Normal Map в Blender

5. Тыкаем Bake и… У меня с первого раза получилось черти что! Точнее получилось что-то, но совсем не то, что я ожидал.

Оказывается, при создании тангенсальной карты нормалей (Tangent Normal Map) в Blender важную роль играет взаимное расположение high-poly и low-poly моделей. Взгляните на самый первый рисунок. Я специально разнес в пространстве и расположил модели под разным углом, чтобы было видно, как именно Blender создает тангенсальную карту нормалей. Он проецирует high-poly модель (она у нас selected — оранжевая) на low-poly (которая active — желтая, выделенная последней) по оси, совпадающей с нормалью поверхности low-poly модели (совпадает с ось Z, обозначенной синей стрелкой), т.е. на локальную плоскость XY (зеленая и красная стрелки на рисунке). Также хорошо видно, что получается при смещении моделей друг относительно друга в плоскости XY. Еще я специально поигрался с Origin'ами каждой модели. На рисунке они показаны кружочками. Оказалось, что их взаимное расположение абсолютно не важно.

Итак, чтобы получить ожидаемый результат, необходимо точно совместить модели таким образом, чтобы все лучи, идущие из high-poly модели вдоль оси, образованной нормалью поверхности low-poly модели, попадали на плоскость этой low-poly модели в нужных нам местах. Это условие должно выполняться для каждой плоскости low-poly модели. То есть, например, в случае куба, на каждую плоскость куба по нормалям проецируются точки high-poly модели.

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

Теперь продемонстрирую создание карты нормалей (Normal Map) в Blender на простом, но жизненном примере. Мне нужно создать колонну округлой формы, причем я выделил для отрисовки колонны всего 3 плоскости. Для достижения нужного эффекта я создам из исходной модели (слева на рисунке) высокополигональную модель (справа) и сделаю на ее базе карту нормалей.

High-poly модель для создания Normal Map в Blender

После завершения создания high-poly модели для колонны я располагаю обе модели таким образом, чтобы на каждую грань low-poly модели была спроецирована соответствующая часть high-poly модели. На рисунке синими линиями отмечены оси проецирования, соответствующие нормалям low-poly модели.

Проециорание tangent normal map в Blender

Выделяем сперва high-poly, затем low-poly модель и выпекаем карту нормалей. Наложив ее на low-poly модель и поставив источник освещения видим, как модель из трех плоскостей начала казаться более округлой.

Low-poly модель с применением карты нормалей (Normal Map)

Комментарии (2)

RSS свернуть / развернуть
+
0
то что надо, отличный блог, нашел все что было нужно. dimanjy, а ты сможешь сделать тутор по созданию моделей для Dota 2?
avatar

G-Ray

  • 26 июля 2012, 23:09
+
0
Хм… Мне кажется нет никакой разницы для чего именно создаются модели — для Dota 2 или еще для чего. Берешь и рисуешь :)

Вообще, я моддингом не интересуюсь. Я занимаюсь разработкой игры с нуля.
avatar

dimanjy

  • 26 июля 2012, 23:51

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.