Моделирование жука
Как то я слушал подкаст, в котором вскользь говорилось о написании шейдера для жука (25 минута, 35 секунда), имитирующего радужную поверхность (не знаю как сказать это по-русски, но в английском языке есть термин — iridescence). Я посмотрел этого персонажа и мне захотелось написать свой шейдер, но имитирующий более реальную поверхность хитина, о нем я расскажу в следующей статье.Однако возникла проблема — у меня не было подходящей модели жука.Сначала я поискал модели в интернете, но у бесплатных не устраивало качество, а у платных была слишком высокая цена (~50$), тем более, нужной модели вообще не было. В общем я решил сделать своего жука, поэтому опишу тот пайплайн, который я составил для себя.
Поиск референсов Моделирование high poly модели Ретопология в low poly Создание текстурных координат (развертка) Запекание нормалей Запекание ambient occlusion Добавление карты смещений для определения цвета в шейдере (об этом позже) Разумеется пайплайны могут быть разными, например, в этом могли бы присутствовать такие пункты, как «создание концепта» или «риггинг персонажа». Их нет, потому что в роли концепта у меня были рефы реальных жуков и модель не планировалась быть анимированной. В более серьезных моделях так же бывает промежуточная ретопология high poly моделей. Для разных задач в разных компаниях используется свой пайплайн.РеференсыИз всех жуков мне больше всего понравилась своим окрасом хризолина, а точнее подвид chrysolina herbacea. Этот жук имеет красивую, яркую радужную окраску, посмотрите сами: Поэтому я нагуглил как можно больше картинок и слил их все в одну. Так же для лучшего понимания строения могут пригодиться модели других жуков. В итоге получилась такая картинка, которая маячила на втором мониторе почти все время создания жука (кликабельно): Моделирование high poly модели В основном скульптинг я производил в ZBrush, начал с панцирей, каждый объект вылепливал из сферы: В процессе скульптинга можно столкнуться с одной проблемой — вдавливая участок на поверхности — она выдавливается с другой стороны, что иногда бывает неудобно или вообще не нужно, чтобы этого не происходило нужно включить опцию BackfaceMask в подменю Auto Masking меню Brush.Так же может быть полезна опция Lazy Mouse в меню Stroke — если ее включить, трекинг кисти будет усредняться, что позволит избежать ненужного дрожания и проводить более сглаженные линии. Параметр LazyRadius меняет степень сглаживания.В ZBrush есть одна классная опция, которая помогает избежать некоторых проблем с сеткой — DynaMesh. По сути она перестраивает измененный участок сетки, адаптируя ее под геометрию. Некоторые недолюбливают ее, из-за того что после применения этого модификатора, сетка получается некрасивой, иногда она слегка ломает геометрию, но для моих нужд она мне подошла весьма кстати. Альтернативный вариант этой опции — постепенно повышать сабдивы модели и изредка производить ретопологию.BackfaceMask, Lazy Mouse и DynaMeshПостепенно добавлялись новые части и повышалась детализация:
Отдельно стоит рассказать про глаза. У жуков фасеточные глаза, они состоят из множества полусфер, можно заметить, что располагаются они как бы по гексагональной сетке:
Мне показалось, что проще всего их будет смоделить в 3D Max, делал их я примерно так: сначала нужно создать GeoSphere, задать нужное количество сегментов и конвертировать в редактируемую полигональную сетку:
далее выделяем все ребра и нажимаем на кнопку Chamfer, а точнее на кнопку рядом с ней — откроются поля с настройками. Подбираем параметры, чтобы получилось примерно как на скриншоте ниже:
теперь выделяем все вершины и выбираем Weld, настраиваем так, чтобы все вершины в узловых точках слились в одну:
выделяем все полигоны и применяем Bevel, выдавить их нужно примерно на высоту равную размеру ячейки, и чуть-чуть расширить:
один раз нажимаем на кнопку Tesselate, чтобы добавить полигонов:
и наконец, применяем модификатор TurboSmooth, мне хватило двух итераций, чтобы получить более-менее сглаженный вариант:
На самом сетка получилась не совсем гексагональной, есть сегменты, состоящие не из шести, а из пяти ребер. Это обусловлено спецификой построения данного вида сферы. Но для жука сойдет :)
Ретопология в low poly Несмотря на то, что в ZBrush есть свои инструменты для ретопологии, ее я проводил в TopoGun, так как по мне там ее проводить удобнее на порядок. Там есть очень удобный инструмент для сглаживания — можно сделать довольно крупную сетку, потом применить его. Эта сетка разобьется на заданное количество сабдивов, причем новые вершины будут располагаться на высокополигональной модели: Опять же отдельно глаза — так как это по сути сферы, то в качестве лоу поли сетки я взял обыкновенные сферы и обрезал у них невидимую часть.В результате ретопологии получилась модель в 60к полигонов. Это, конечно, не совсем лоу поли, но для сцены состоящей только из одного объекта нормально.low poly модель
Создание текстурных координат Развертку я делал в UVLayout — довольно удобная программа, основанная на хоткеях, работает быстро и наглядно, особенно нравится то, как она показывает цветом растяжение/сжатие полигонов.Нарезая модель следует делать как можно меньше швов, но в тоже время стараться слишком не растягивать полигоны. Так как у меня не будет диффузной текстуры, швы могут проявиться только в рельефе (при нормал маппинге), на карте смещений и окклюжена они будут не заметны. Меня больше заботило отсутствие перекосов полигонов, поэтому швов получилось довольно много.Когда для всех моделей была готова развертка, я импортировал их в 3D Max, чтобы отрегулировать относительный размер развертки. Это довольно важный шаг, так как позволяет повысить детализацию особо важных участков без увеличения текстуры. Так, например, развертку пуза жука я намеренно уменьшил, а головы — наоборот увеличил. В конечном итоге я воспользовался стандартным упаковщиком модификатора Unwrap UVW, и получил вот такую развертку всей модели:
Упаковщик упаковывает не очень оптимально, к тому же я оставил довольно большой паддинг, чтобы соседние сегменты не мешали друг другу на маленьких мипах.
Запекание нормалей Карту нормалей составлял в xNormal — довольно своеобразная программа с «интересным» интерфейсом. Оффтопик, вообще, если честно удивляет то, что все программы связанные с графикой имеют свой неповторимый интерфейс, разобраться в котором порой сложно даже с инструкцией, которую еще попробуй найди. Хотя если какое то время попользоваться ею, то привыкаешь и кажется даже удобно. Но это лишь мое мнение.Так как модель состоит из нескольких частей — запекать пришлось каждую отдельно, если попробовать просчитать их все разом — могут возникнуть артефакты. Размер текстуры выбрал 4096×4096, для модели крупным планом в самый раз, если будут возникать проблемы — всегда можно уменьшить в два или более количество раз.
Запекание ambient occlusion AO просчитывал в Maya рендер-движком Mental Ray (в 3D Max с ним были какие то проблемы, а xNormal с полным списком моделей немного косячил, считал довольно долго и сам по себе имеет мало настроек)Добавление карты смещений Если присмотреться, то заметно, что у настоящего жука есть места, которые отличаются цветом, нечто вроде пятен на голове и панцире: Чтобы обозначить эти места, я вручную нарисовал в MudBox на отдельном слое черно-белые пятна. В последствии их я буду использовать в шейдере, чтобы смещать одну из составляющих цвета:
В итоге получилось три карты, все их можно упаковать в одну текстуру следующим образом:
Красный и зеленый каналы — карта нормалей Синий канал — ambient occlusion Альфа канал — карта смещений Итоговая карта стала выглядеть так:)В следующей статье я расскажу как применить эту карту к модели. Кстати, вот предыдущая.Моделька получилась довольно корявенькая, сетка не очень красивая, но с другой стороны я не моделлер и не художник, я только учусь, следующие модели надеюсь будут лучше. Да и суть статьи не в том, чтобы показать как надо моделить, а какие существуют для этого инструменты, как мог бы выглядеть процесс сосздания статичной модели и подготовить для использования в игровом движке, думаю программисту в геймдеве это полезно знать.
Ссылки