Создание low модели головы человека с картой нормалей от А до Я.
Автор: ES_s2
Наверно все слышали (да и видели), такие игры как Doom III, Far Cry, Bloodrayne, и задавались вопросом «Как они смогли добиться такой реалистичности моделей?». Пару лет назад некоторые журналисты заявляли, что Джон Кармак планировал использовать модели персонажей от 500.000 до 1.000.000 полигонов. Люди, писавшие это, просто не понимали с чем имеют дело. Такие высокополигональные модели используются, но не напрямую в игре, а для создания карты нормалей (normals map).
Введение:
3d модель состоит из полигонов (надеюсь, это не для кого не тайна :) ) Чем полигонов больше, тем реалистичнее она выглядит, отбрасывает тени, играет со светом и т.д. Чтобы добиться максимального реализма, модель иногда может «весить» до 1.000.000 полигонов, а иногда и больше. Но, проблема в том, что игровой движок не в состоянии «переварить» такое огромное количество. Перед нами стоит задача: получить модель в 500-2000 полигонов, но при этом обладающую всеми возможностями модели в 1.000.000. В этой статье будет рассмотрен способ, с помощью которого можно получить такую модель. Все что для этого нужно – желание работать, терпение, немного таланта и необходимые знания, которыми спешу поделиться. Итак, начинаем.
1. Для начала немного терминов.
1.1. О нормалях.
Обычно нормаль это — вектор, перпендикулярный полигону, определяющий лицевую сторону. При выводе модели и расчете normal map используются нормали к вершинам. Нормаль вершины — это нормализованная сумма нормалей всех полигонов, которым принадлежит эта вершина.
1.2. О карте нормалей (normals map).
Обычное освещение (в Direct3D или OpenGL) использует значения нормалей для расчета освещения в вершинах, освещение же в точках между вершин получается линейной интерполяцией значений, вычисленных в вершинах. Normal map позволяет избавиться от интерполяции и выполнять расчет освещения не повершинно, а попиксельно.
При обычном вершинном освещении реалистичность достигалась одним способом – усложнением модели добавлением полигонов. Тупиковость ситуации на лицо – нельзя бесконечно усложнять модель. Ответ на решение проблемы – карта нормалей.
Пример карты нормалей.
2 Основная часть работы.
2.1. Начало.
Определимся с тем, какой софт нам нужен для выполнения поставленной задачи:
• 3DS Max;
• Adobe Photoshop;
• плагин Texporter для 3dsmax (http://www.cuneytozdas.com/software/3dsmax/#Texporter);
• программа для 3д дизайнеров — NVIDIA Melody (http://developer.nvidia.com/object/melody_home.html);
• плагин NormalMapFilter для Photoshop;
• плагин *.dds экспорта для Photoshop;
• плагин NormalMapFilter.
Последние три плагина вы можете скачать тут: http://developer.nvidia.com/object/nv_texture_tools.html.
Что нужно будет моделировать:
• high полигональная модель головы (количество полигонов значения не имеет, чем больше, тем лучше);
• low полигональная модель головы (это непосредственно модель, которая будет использоваться в игре; количество полигонов – столько, сколько позволит ваш движок)
ВНИМАНИЕ: (ОЧЕНЬ ВАЖНЫЙ МОМЕНТ) – модели должны быть строго подобны! Как это обеспечить, будет рассмотрено ниже.
2.2. Убиваем двух зайцев (как из одной модели получить две).
Так как нам нужно 2 подобные модели (low и high), почему бы нам не сделать сначала high, а потом оптимизировать ее в low. Так и поступим. Для этого используем метод моделирования с помощью сплайнов и патчей, подробно описанный в книге Кима Ли "3DS Max для дизайнера". Удобство моделирования в сплайнах/патчах нам подходит больше всего по той причине, что такой моделлинг позволяет получить на выходе модель любой сложности.
Модели, полученные с помощью техники патчей.
В итоге мы и получим требуемые low и high модели, имеющие общие ключевые точки и отличающиеся между собой только количеством полигонов (а следовательно и детальностью проработки).
3. Текстурирование и расчет карты нормалей.
3.1. Текстурирование.
Итак, в нашем распоряжении есть модель человеческой головы, выполненная в двух вариантах: low и нigh.
High и low модель.
High модель можно временно спрятать, она нам в ближайшее время не понадобиться.
Теперь приступаем к работе над low моделью. Применяем модификатор UVW map, или Unwrap UVW, кто как больше привык, и готовим модель к текстурированию. После того как вы проделали эту процедуру, примените к модели утилиту Texporter (по желанию, если вы опытный текстурщик, то можете обойтись и без нее), полученную текстуру наложите на модель, и проверьте, нет ли сильных искажений.
Модель с текстурой, полученной с помощью Texporter и текстурная развертка.
ВНИМАНИЕ: разрешение стороны текстуры должно быть кратно степени 2 (256х256, 512х512 … и т.д.),
ВНИМАНИЕ: карта нормалей будет размещена точно так же, как вы настроили текстурные координаты в UVW map.
Подготовительная часть работы закончена. Экспортируйте ваши модели в формат *.3ds или *.obj (на ваше усмотрение, можно сочетать оба формата.) и приступайте к следующему этапу работы.
4. Работа с картой нормалей и diffuse текстурой.
4.1 Программа для 3д дизайнеров - Melody (NVIDIA media tool).
Установите Melody. Полученные ранее модели теперь нужно загрузить в эту программу. Melody — многофункциональный софт, предназначенный для работы с моделями (оптимизация, создание LOD-ов, и т.д.), но нас в данном случае интересует расчет карт нормалей (Generate Normal Map). Итак, жмите кнопку Load Working Model и загружайте low модель. После того как вы это сделаете, появится вторая кнопка — Load Reference Model, жмите ее и загружайте high модель. Далее должно появиться вот такое окно:
Теперь пришло время заняться настройками. Жмем кнопку Normal Map Settings, и перед вами появляется следующее окно:
О настройках следует сказать несколько слов.
Normal map filename. Этот пункт, в общем-то, не должен вызвать сложностей, просто укажите место куда сохранить текстуру (карту нормалей).
Generate Texture Coordinates for normal map. В этом пункте вас просят указать текстурные координаты которые будут использованы для расчета карты нормалей. Melody может сам создавать текстурные развертки (Generate normal map texture coordinates), этот способ вполне подходит для простых объектов, но в нашем случае лучше воспользоваться текстурной разверткой, которую мы создали в 3DS Max (см. пункт 3.1). Для этого выберите Use decal texture coordinates. Затем укажите размер требуемой текстуры width -x- height. Остальные настройки оставьте без изменений. Закрывайте это окно и в основном меню жмите кнопку Generate Normal map. Если все было сделано правильно, вы увидите на экране следующее:
Low и high модели после расчета карты нормалей.
Карта нормалей полученная в Melody.
А вот так выглядит полученная карта нормалей на 3д модели:
Модель головы с наложенной картой нормалей.
4.2. Diffuse map (текстура модели) или "шкура"(skin).
После того как получена карта нормалей, следующим шагом будет создание «шкуры». Поступаем следующим образом: Грузим фотошоп, в качестве шаблона берем карту нормалей и поверх нее рисуем «шкуру». ВНИМАНИЕ: При рисовании шкуры не злоупотребляйте рисованием теней, их можно только слегка обозначить. Готовая текстура должна быть освещена равномерно, функцию теней возьмет на себя карта нормалей.
Diffuse текстура, «шкура».
Теперь остается совместить «шкуру» и карту нормалей.
Low модель головы с картой нормали и diffuse текстурой
5. Детальная обработка. Использование NormalMapFilter.
Модель головы с картой нормалей и шкурой готова, но вам хочется внести мелких деталей которое будут реагировать на освещение (шрамы, родинки и т.д.). Добавим нашей голове три страшных шрама на левой стороне лица. Для этого воспользуемся Фотошопом и специальным плагином — NormalMapFilter (NVIDIA). Этот плагин помогает без особых усилий создавать плоские карты нормалей. Он широко используется в формировании текстур для скал, древесины, ландшафта и т.п. Им то мы и воспользуемся. Вот как это работает в теории:
Принцип работы Normal map Filter.
За основу (как и в случае рисовании «шкуры») берем карту нормалей. Чтобы сосредоточить внимание читателя на деталях, я рассмотрю этот момент на укрупненном фрагменте. Как я сказал выше, мы будем добавлять шрамы на левой стороне лица. Откройте в фотошопе «шкуру», выделите все, скопируйте и вставьте из буфера в файл с картой нормали. Затем добавляем слой (Layer 2) и заливаем его белым цветом, и (Layer 1) в нем рисуем маску шрама.
Маска шрама.
После того как маска готова, рисуем шрам уже на «шкуре», причем очень важно стараться не вылезать за границы маски.
Лицо со шрамом.
Следующий шаг: склеиваем все слои (перед этим отключить слой «шкуры» и карты нормали). У вас должна получиться черная маска шрама на белом фоне. Теперь можно применить плагин Normal map Filter. Варьируйте параметры height generation, чтобы получить требуемую интенсивность (высоту/глубину), тут можно экспериментировать, как вам нравится, можно сделать шрам выпуклым или наоборот вдавленным. Полученное изображение скопируйте и вставьте из буфера в файл с картой нормали. Затем удалите (можно использовать select color range, fuzziness ~ 60%) фиолетовый цвет ( RGB 128.128.256). Теперь склейте слои. Вот что примерно должно получится:
Добавленные шрамы.
А вот так это выглядит в итоговом варианте:
Итоговый вариант.
Заключение.
Вот, в общем-то, и все, как видите, чего-то суперсложного в этом нет. Если сразу не получится, пробуйте еще, начните с более простых моделей (например, со сферы или куба).
18 сентября 2004 (Обновление: 3 дек 2017)