Моделирование жука

07990421384643e483379460c6ae22d8.pngКак то я слушал подкаст, в котором вскользь говорилось о написании шейдера для жука (25 минута, 35 секунда), имитирующего радужную поверхность (не знаю как сказать это по-русски, но в английском языке есть термин — iridescence). Я посмотрел этого персонажа и мне захотелось написать свой шейдер, но имитирующий более реальную поверхность хитина, о нем я расскажу в следующей статье.Однако возникла проблема — у меня не было подходящей модели жука.Сначала я поискал модели в интернете, но у бесплатных не устраивало качество, а у платных была слишком высокая цена (~50$), тем более, нужной модели вообще не было. В общем я решил сделать своего жука, поэтому опишу тот пайплайн, который я составил для себя.

Поиск референсов Моделирование high poly модели Ретопология в low poly Создание текстурных координат (развертка) Запекание нормалей Запекание ambient occlusion Добавление карты смещений для определения цвета в шейдере (об этом позже) Разумеется пайплайны могут быть разными, например, в этом могли бы присутствовать такие пункты, как «создание концепта» или «риггинг персонажа». Их нет, потому что в роли концепта у меня были рефы реальных жуков и модель не планировалась быть анимированной. В более серьезных моделях так же бывает промежуточная ретопология high poly моделей. Для разных задач в разных компаниях используется свой пайплайн.РеференсыИз всех жуков мне больше всего понравилась своим окрасом хризолина, а точнее подвид chrysolina herbacea. Этот жук имеет красивую, яркую радужную окраску, посмотрите сами: 17e3537fba6348d7af31a4a428c46de3.jpg Поэтому я нагуглил как можно больше картинок и слил их все в одну. Так же для лучшего понимания строения могут пригодиться модели других жуков. В итоге получилась такая картинка, которая маячила на втором мониторе почти все время создания жука (кликабельно): 91fb8fbe2896492c84c842ea7bea62e6.pngМоделирование high poly модели В основном скульптинг я производил в ZBrush, начал с панцирей, каждый объект вылепливал из сферы: 2c1c5ce47bc0419b9c11b8a8960efaaf.png В процессе скульптинга можно столкнуться с одной проблемой — вдавливая участок на поверхности — она выдавливается с другой стороны, что иногда бывает неудобно или вообще не нужно, чтобы этого не происходило нужно включить опцию BackfaceMask в подменю Auto Masking меню Brush.Так же может быть полезна опция Lazy Mouse в меню Stroke — если ее включить, трекинг кисти будет усредняться, что позволит избежать ненужного дрожания и проводить более сглаженные линии. Параметр LazyRadius меняет степень сглаживания.В ZBrush есть одна классная опция, которая помогает избежать некоторых проблем с сеткой — DynaMesh. По сути она перестраивает измененный участок сетки, адаптируя ее под геометрию. Некоторые недолюбливают ее, из-за того что после применения этого модификатора, сетка получается некрасивой, иногда она слегка ломает геометрию, но для моих нужд она мне подошла весьма кстати. Альтернативный вариант этой опции — постепенно повышать сабдивы модели и изредка производить ретопологию.d4cb8ad7a9f54a3587af9f0a978c56f4.pngBackfaceMask, Lazy Mouse и DynaMeshПостепенно добавлялись новые части и повышалась детализация: 62c77779ac444b3790dc5b2780b1565d.png

Отдельно стоит рассказать про глаза. У жуков фасеточные глаза, они состоят из множества полусфер, можно заметить, что располагаются они как бы по гексагональной сетке: 8a45d3947a9a4ad3bf873a219b847e49.png

Мне показалось, что проще всего их будет смоделить в 3D Max, делал их я примерно так: сначала нужно создать GeoSphere, задать нужное количество сегментов и конвертировать в редактируемую полигональную сетку: e5edff3e759c4f7b891ea8865b791519.png

далее выделяем все ребра и нажимаем на кнопку Chamfer, а точнее на кнопку рядом с ней — откроются поля с настройками. Подбираем параметры, чтобы получилось примерно как на скриншоте ниже: c74104cb6b1e47bb9a03705d053932bc.png

теперь выделяем все вершины и выбираем Weld, настраиваем так, чтобы все вершины в узловых точках слились в одну: b10c0847e453476b9cb2ac45921b5140.png

выделяем все полигоны и применяем Bevel, выдавить их нужно примерно на высоту равную размеру ячейки, и чуть-чуть расширить: f0b490fd9ecb4caca8548ce8da72ac7e.png

один раз нажимаем на кнопку Tesselate, чтобы добавить полигонов: 001a02b1243045b18ab4923303a6c136.png

и наконец, применяем модификатор TurboSmooth, мне хватило двух итераций, чтобы получить более-менее сглаженный вариант: c492eb95a51f409fbdc65128d60dba6d.png

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

Ретопология в low poly Несмотря на то, что в ZBrush есть свои инструменты для ретопологии, ее я проводил в TopoGun, так как по мне там ее проводить удобнее на порядок. Там есть очень удобный инструмент для сглаживания — можно сделать довольно крупную сетку, потом применить его. Эта сетка разобьется на заданное количество сабдивов, причем новые вершины будут располагаться на высокополигональной модели: 89b144a408424a01b236323cab98b85d.pngОпять же отдельно глаза — так как это по сути сферы, то в качестве лоу поли сетки я взял обыкновенные сферы и обрезал у них невидимую часть.В результате ретопологии получилась модель в 60к полигонов. Это, конечно, не совсем лоу поли, но для сцены состоящей только из одного объекта нормально.d46bf6f316a147178b5124331878a16e.pnglow poly модель

Создание текстурных координат Развертку я делал в UVLayout — довольно удобная программа, основанная на хоткеях, работает быстро и наглядно, особенно нравится то, как она показывает цветом растяжение/сжатие полигонов.396725fda4e941398b45c66e8180e01b.pngНарезая модель следует делать как можно меньше швов, но в тоже время стараться слишком не растягивать полигоны. Так как у меня не будет диффузной текстуры, швы могут проявиться только в рельефе (при нормал маппинге), на карте смещений и окклюжена они будут не заметны. Меня больше заботило отсутствие перекосов полигонов, поэтому швов получилось довольно много.Когда для всех моделей была готова развертка, я импортировал их в 3D Max, чтобы отрегулировать относительный размер развертки. Это довольно важный шаг, так как позволяет повысить детализацию особо важных участков без увеличения текстуры. Так, например, развертку пуза жука я намеренно уменьшил, а головы — наоборот увеличил. В конечном итоге я воспользовался стандартным упаковщиком модификатора Unwrap UVW, и получил вот такую развертку всей модели: f05fd445a09348349977cd179b8dfe9e.png

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

Запекание нормалей Карту нормалей составлял в xNormal — довольно своеобразная программа с «интересным» интерфейсом. Оффтопик, вообще, если честно удивляет то, что все программы связанные с графикой имеют свой неповторимый интерфейс, разобраться в котором порой сложно даже с инструкцией, которую еще попробуй найди. Хотя если какое то время попользоваться ею, то привыкаешь и кажется даже удобно. Но это лишь мое мнение.cdfdd54661b140738034dfe7b9e9510e.pngТак как модель состоит из нескольких частей — запекать пришлось каждую отдельно, если попробовать просчитать их все разом — могут возникнуть артефакты. Размер текстуры выбрал 4096×4096, для модели крупным планом в самый раз, если будут возникать проблемы — всегда можно уменьшить в два или более количество раз.67ea725545cc42379eb1db7849e136d3.png

Запекание ambient occlusion AO просчитывал в Maya рендер-движком Mental Ray (в 3D Max с ним были какие то проблемы, а xNormal с полным списком моделей немного косячил, считал довольно долго и сам по себе имеет мало настроек)6e41f9abcecf488ba42dcb21b42242a5.pngДобавление карты смещений Если присмотреться, то заметно, что у настоящего жука есть места, которые отличаются цветом, нечто вроде пятен на голове и панцире: 9277669d4b4a4852b47f4549fac9e78b.pngЧтобы обозначить эти места, я вручную нарисовал в MudBox на отдельном слое черно-белые пятна. В последствии их я буду использовать в шейдере, чтобы смещать одну из составляющих цвета: 03f84199621c4d47817f62f75dcc52c0.png

В итоге получилось три карты, все их можно упаковать в одну текстуру следующим образом:

Красный и зеленый каналы — карта нормалей Синий канал — ambient occlusion Альфа канал — карта смещений Итоговая карта стала выглядеть так:)fcc4f27bb22147c8b795f9202e5d8321.pngВ следующей статье я расскажу как применить эту карту к модели. Кстати, вот предыдущая.Моделька получилась довольно корявенькая, сетка не очень красивая, но с другой стороны я не моделлер и не художник, я только учусь, следующие модели надеюсь будут лучше. Да и суть статьи не в том, чтобы показать как надо моделить, а какие существуют для этого инструменты, как мог бы выглядеть процесс сосздания статичной модели и подготовить для использования в игровом движке, думаю программисту в геймдеве это полезно знать.274377bdbb7747c8b27d64f2b513bc92.png

Ссылки

© Habrahabr.ru