Какие бывают нормали, и зачем нужны. Часть первая (Normal map, группы сглаживания, введение в Vertex Normals)
Пикабушник @SuperMopsek в соседнем сообществе (Вот тут) поднял интересную тему - карты нормалей в 3D графике. И даже пошагово показал процесс запекания карты нормалей средствами Blender. Но как показывает практика, такая манера подачи ясна не всем :)
Попробую рассказать подробнее, а так же рассказать о некоторых хитростях в использовании нормалей. Используемое ПО - 3DS Max, но принципы общие, и могут использоваться при работе в любом 3D пакете.
-Для чего?
В большинстве случаев, проще использовать некую текстуру, вместо миллионов полигонов (допустим, складочки на футболке ГГ).
- Звучит круто! А как оно работает вообще?
Простыми словами, нормаль - это перпендикуляр к поверхности. По нему движок определяет, под каким углом отражать свет. В случае карт нормалей (normal map), эта информация ложная, текстура хранит информацию о рельефе, которого нет. И плоская поверхность отражает свет так, словно на ней есть неровности. Зачастую подобного "обмана" человеку хватает, чтобы принять низкополигональную модель за что-то более детализированное:
На данной картинке два простых квадрата, но карта нормалей на втором заставляет нас поверить, что это нечто детальное, ведь некоторые участки затенены, а другие бликуют. Аналогично она работает и на более сложной геометрии.
Для создания панелей, заклепок и т.д. (как в примере выше) достаточно простого графического редактора и пары плагинов, но для сложных форм необходим детализированный объект-источник, как в примере у @SuperMopsek со скульптурой.
Источником может служить 3D скан, цифровая скульптура, выполненная, например, в Zbrush и т.п.
- О, круто, печем нормали со всяких крутых штук на полтора полигона и получаем графон, да?
Не совсем. Контуры исходной модели и лоуполи-приемника не полностью совпадают, и на финальной модели возникают искажения. А насколько они будут значительны зависит от нескольких факторов:
1. Чем дальше конкретная точка хайполи находится от лоуполи, тем сильнее искажение. Потому чем плотнее сетка приемника, тем точнее она прилегает к источнику, и тем меньше будет искажений. Но и нагружать компьютер она будет сильнее. Чтобы найти идеальный вариант, проверяйте силуэт лоуполи - включите отображение без освещения (flat color в случае 3DS Max) и покрутите лоуполи и хайполи поочередно, осматривая со всех сторон. Детали, не влияющие на силуэт, полигонами моделировать не нужно, нормалями их можно перенести с минимальными потерями.
2. Не вся информация в нормалях одинаково полезна. Со скруглением на "цилиндрах" справляется разделение на группы сглаживания, и если хотите получить красивые фаски - добавьте на "хайполи" только их. В противном случае получим искажения из-за того, что местами цилиндр-источник отдален от приемника сильнее. С определенного угла выглядит неплохо, но с большинства точек обзора возникают косяки.
3. Вытекает из предыдущего пункта. А нужно ли для вашей задачи вообще возиться с созданием хайполи, или достаточно сгладить неровности с помощью групп сглаживания? Бывает и так.
- Минуууточку, опять упоминаешь группы сглаживания, а это что вообще такое?
А группы сглаживания - тоже результат работы нормалей. Только не текстур, а тех, что хранит сама модель. Дело в том, что каждая вершина хранит в себе информацию о том, куда отражать (vertex normals). А на участках между ними вычисляется среднее значение. Сравните:
На иллюстрации два одинаковых объекта. Но боковая поверхность первого обманывает глаз, т.к. свет отражается под усредненным углом, и в целом картина соответствует цилиндру. Правый же отражает свет вполне честно, и уже явно видно, что в основании лежит многоугольник, а не цилиндр. Такая разница тоже по причине нормалей, только теперь к вершине. Обратите внимание на то, что на левом "цилиндре" их как бы меньше. Просто значения накладывающихся вершин усредняются, если они в одной группе сглаживания, и результат сглаживается. Для работы вручную с группами сглаживания в 3DS Max в EditPoly/EditMesh выделите полигоны , которые должны быть сглажены, и назначьте им незанятую группу во вкладке Polygon Smoothing Group.
Для автоматического сглаживания примените модификатор Smooth, выберите Auto Smooth, затем в Treshold укажите угол между полигонами, начиная с которого поверхности перестают считаться сглаженными.
- А вручную эти нормали к вершинам как-нибудь крутить можно, без этого вашего "smooth"?
Можно, и даже нужно! Таким образом можно добиться поразительных результатов. Но об этом следующим постом, а то этот и так затянулся. А пока превью:
Следующий урок научит вас делать такие вот фаски без запекания, кучи полигонов и искажений от групп сглаживания. И не только этому, разумеется)
P.S. Я в курсе, что сетка неоптимальна, оно только для примера по быстрому накидано, смотрите только на фаски, и как с ними объект реагирует на свет ;)