Авторизация Регистрация

Здесь пока все ясно :)

Хелп лист будет формироваться из ваших вопросов.

 

Карты нормалей. Часть I

Doom_III_E3_alpha

Здравствуйте.
Иногда по работе мне приходится спрашивать у дизайнеров про то, смогут ли они сделать карту нормалей и использовать ее на своей модели. В большинстве случаев ответ отрицательный.

Что это за технология и откуда она взялась?
Немного из истории карт нормалей.

Впервые идея о том, что можно «брать» детали с высокополигональной модели и переносить на низкополигональную, была предложена на СИГГРАФ (SIGGRAPH) в 1996 во время доклада «Использование сглаженных поверхностей для добавления плотности полигональной сетке» авторов Кришнамурати и Левои. Предлагалось использовать созданные на основе НУРБС (NURBS) карты смещения (displacement maps) для увеличения детализации низкополигональной поверхности. Это была только идея; приложение, которое смогло это сделать, появилось гораздо позже.

SIGGRAPH (The Special Interest Group for Computer Graphics) группа SIGGRAPH специальная группа в составе ASM, объединяющая специалистов по компьютерной графике. Проводит ежегодные конференции, предназначенные для художников и аниматоров, работающих с компьютерной графикой.

В 1998 опять на СИГГРАФ были прочитаны 2 доклада о трансформации деталей, составляющих объект как нормалей с высокополигональной модели на низкополигональную. Назывался доклад: «Appearance Preserving Simplification» за авторством Коэна и еще нескольких исследователей из Института инженеров по электротехнике и электронике визуализации. В первой работе представлен алгоритм, с помощью которого при упрощении можно следить за тем, как потерянные детали должны отрисовываться на упрощенной сетке. Далее был представлен простой подход, при котором высоко- и низкополигональная сетка разделяется, а утерянные детали восстанавливаются независимо от способа создания низкополигональной модели. Этот метод (с небольшими вариациями) в данный момент используется в большинстве приложений.

Что же такое карта нормалей?

Карта нормалей (normal map) — это дальнейшее развитие такой технологии как бамп (bump (англ.) – изгиб, выпуклость; выпуклая вмятина, вздутие). Иногда карты нормалей называют «3-х точечная бамп-карта» (Dot3 bump mapping).

Бамп-карта искажает значения нормалей полигонов, а карта нормалей полностью их заменяет. Т.е., оригинальные нормали объекта заменяются нормалями с высокополигональной модели.

Как и бамп, карты нормалей увеличивает визуальную детализацию 3d-модели без добавления дополнительных полигонов.

Бамп рассчитывается на основе текстуры с одним каналом (grayscale — оттенки серого). Карты нормалей используют многоканальную RGB-текстуру.

Карта нормалей рассчитывается для каждого пикселя текстуры. Значения каждого из каналов RGB — это XYZ координаты нормали текселя.

Тексель (текстурный элемент, текстурный пиксель) — это основной элемент, составляющий текстуру. Каждая текстура представляет собой массив текселей, так же как картинка — это массив пикселей.

Обычно карты нормалей существуют в 2-х вариациях: объектное пространство (object-space) и касательное пространство (tangent-space). Они отличаются системой координат, в которой нормали измеряются и сохраняются.

Tangent space (пространство касательных, касательное пространство) — это обобщение на случай произвольного многообразия понятий касательной прямой для одномерных кривых и касательной плоскости для двумерных поверхностей.

Как видите — все просто :)

Хотите больше теории — найдете в англоязычном Интернете.

По-простому говоря: 1 тексель текстуры с картами нормалей заменяет 10 полигонов, а может и больше.

Больше всего «нормала», наверное, в играх.

Игра, в которой я впервые прочувствовал, что такое «нормал» — DOOM 3 производства id Software.

Вот они — кишки с картами нормалей.

Doom_III_E3_alpha
Ссылка на это изображение на wikipedia.org

Настоящие «нормальные» монстры.

Doom3shadows2
Ссылка на это изображение на wikipedia.org

Это не игра, а гимн картам нормалей. Они там повсюду.

Сейчас 2008 год. Технология придумана давно. Применяется уже 5 лет точно, причем очень «плотно» в самых популярных играх.

Не играли в ДУМ 3?

А про «Зед-Браш» (ZBRUSH) слышали?

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

В итоге можно сказать, что использование карт нормалей — довольно старая и популярная технология.

Тем не менее, не так уж много 3d дизайнеров используют возможности карт нормалей в своей работе.

Я думаю, дело в кажущейся сложности технологического процесса.

Кнопок много. Какие надо нажимать, чтобы «получилось»? Тайна.

Вы думаете, я делал ЭТО в 2000 году? Или в 2004, когда вышел ДУМ?

Нет. Я и сам узнал про эти «нормали» недавно.

Сначала были ограничения со стороны «железа». Потом — программного обеспечения, но и они приблизительно в 2005 году закончились.

Я начал использовать «нормал» приблизительно с 2005 года, но это была не совсем та технология, о которой вы могли прочитать выше.

Я рисовал бамп, используя оттенки серого. Иногда преобразовывал цветное изображение в серое, а затем с помощью специального фильтра в Фотошопе превращал его в карту нормалей.

bump_normal

Для того, чтобы сделать объемные кирпичики на стене, отверстия от пуль или еще какие-нибудь мелочи, эта технология подходит.

Если вы делаете персонажа, машину или еще какой либо сложный объект, вам придется использовать другой метод. Тот самый, который предложили в 1998 году. Когда вы «снимаете» карту нормалей с высокополигональной модели, а затем накладываете эту карту на низкополигональный объект.

Попробуем преодолеть технологические сложности, сделав простейшую карту нормалей.

Генерировать нормал можно в Maya, 3ds max, NVIDIA Melody и Z-Brush. Наверное список программ больше.

Я делал это в 3ds max.

Переходим в 3ds max 9

Попробуем сделать карту нормалей для этого объекта.

base_object

Это 2 полигона, соединенных под прямым углом.

Вот «усики» нормалей. По 2 штуки на фэйс (видны в Edit Mesh при включении одной галочки).

base_object_normals

Я хочу добиться от этого угловатого объекта сглаженных углов, как на скриншоте ниже.

hipoly_normals

Вот что у нас есть перед началом работы.

objects

Внимание! На объекты должна быть назначена только одна группа сглаживания.

one_smooth_group

Первым делом надо разложить анврап на низкополигональной модели.

Именно на анврап упрощенной модели будут спроецированы детали высокополигональной модели.

Как ляжет анврап, так и произойдет проецирование. Если анврап «кривой» — ждите неправильной карты нормалей.

Выделив упрощенный объект, сразу перейдем в Unwrap UVW и сделаем Flatten Maping с установками по умолчанию.

Вот что получилось. Красным обведено проблемное место.

weld_stage_02

Это разрыв UV-координат. Я специально наложил на объект простую текстуру, которая помогает продемонстрировать проблему.

weld_stage_03

От разрывов необходимо избавляться по максимуму или прятать их в незаметные места.

Пару раз отразим наши полигоны. Немного подвинем. Именно подвинем, а не растянем. Объединим точки (Weld).

Готово.

Белая линия на стыке говорит о том, что разрыва текстурных координат нет.

OK_stage_04

И на текстуре все в порядке.

Теперь надо совместить объекты. Для этого обычно достаточно поместить Pivot объекта в центр объекта (делается для двух объектов автоматически) и выровнять объект один относительного другого по всем осям координат.

Вот Pivot’ы.

pivots

Выравниваем объекты относительно друг друга. Ctrl+A

align

Внимание! Объекты находятся в точке с координатами 0,0,0

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

Выделив низкополигональный объект, применяем модификатор «Проекция» (Projection).

projection

Этот модификатор будет проецировать что-то с одного объекта на другой. В нашем случае что-то — карта нормалей.

Указываем — с какого объекта будет сниматься карта нормалей. Без этого ничего работать не будет.

pick

Выбираем детализированную геометрию, кликнув по объекту (Pick) или выбрав из списка присутствующих в сцене (Pick List).

Внимание! Чтобы не запутаться, я назвал простой объект — LowPoly, а сложный HiPoly.

Появился Контейнер (cage) — фиолетовые линии. Он охватывает модели. Что в него попадет — то и будет спроецировано. Иногда контейнер очень кривой, особенно на моделях со сложной геометрией — тогда делаем Сброс (Reset).

reset_push

Без ресета в Максе никуда!

После сброса контейнер плотно прижмется к упрощенному объекту, повторяя его формы. Мы должны увеличить контейнер. Не забудьте: что в нем — то и попадет на карту нормалей.

Внимание! Контейнер не должен пересекать сам себя или низкополигональный объект.

Нажимаем 0 (ноль) — появляется окно Render to Texture.

projection_start

Бывает нужно указать Target Slot. Это чтобы Макс знал, куда класть свежесгенерированную текстуру. По умолчанию выбран Бамп.

Нажимаем Render.

Макс рендерит. Но мы не видим нормала.

Да, во время рендера он не виден. Зато в указанном месте создается файл. Вот что получилось у меня.

normal

Похоже на нормал. Как проверить работает он или нет?

В слот Bump Редактора материалов назначаем материал NormalBump. Значение 100.

normalbumpmat

В слот Normal назначаем обычный Bitmap с нашей текстурой.

Обратите внимание, я отключил диффузную текстуру. Она мешала оценить результат.

Можно посмотреть, если хочется, как лег нормал, включив отображение текстуры (кубик с шашечками) Bitmap’a в слоте Normal.

view_normal

Тоже вроде все правильно.

Результат отлично виден на рендере. Запускаем обычный сканлайн.

Где низкополигональный «уголок»?

render_01

А вот с такого ракурса?

render_02

Сделаем картинку крупнее.

render_03

Если бы не угол — то заметить разницу было бы довольно сложно.

А вот во вьюпорте.

compare_in_max

Карта нормалей готова!

Высокополигональный объект — 64 полигона.
Низкополигональный — 2 полигона.

Визуальные отличия минимальные. Цель достигнута.

Хотя конечно многое зависит от ракурса :-)

Что дальше?
Дальше куча глюков, проблем и шаманства.

В следующий раз попробуем сделать что-нибудь посложнее.

Библиография:
Normal map
Texel
Tangent space

Автор материала: Иванов Дмитрий

Вам также может быть интересным ↓

Один комментарий на «“Карты нормалей. Часть I”»

  1. Для тех, кому надо- урок просто отличный! Сейчас как раз осваиваю ZBrush, и недавно подумал-а на кой чёрт мне красивая модель с 2000 000 полигонов ( занимаюсь 3d для создания в будущем спецэффектов ). Теперь я наконец полностью врубился в суть того, о чём краем уха как то слышал .

Добавить комментарий

Редизайнчик

View Results

Loading ... Loading ...