Создание предмета с нуля
А давайте попробуем создать какой-нибудь простой предмет совсем-совсем с нуля. Например, банку сгущёнки, её все видели и все понимают, как она выглядит и что с ней делают. Замоделим высоко- и низкополигональные модели, создадим развёртку, запечём карту нормалей (normalmap), нарисуем фототекстуру, обработаем всё это в сталкерском СДК и добавим в игру.
В этом руководстве используются:
- Maya 2019 и плагин X-Ray Maya tools
- Photoshop CC
- текстовый редактор с подсветкой синтаксиса, например, SciTE
- и собственно сам сталкерский SDK
Майю предварительно нужно настроить так, как описано в этой статье.
Содержание
Моделирование
Нам нужны две модели: одна высокополигональная, очень детализированная; и вторая, без детализации. С первой мы снимем карту нормалей, и запечём её на вторую, низкополигональную модель, которая будет использоваться в игре.
Размеры
Стандартная банка сгущёнки имеет диаметр 73мм (75мм по буртику) и высоту 80мм.
Заходим в настройки сцены Windows -> Settings/Preferences -> Preferences, по вкладке Settings переключаем Working Units в миллиметры, сохраняем.
Высокополигональная (high-poly) модель
Создаём примитив типа "цилиндр", задаём ему радиус 36,5мм и высоту 80мм, число разбиений увеличим до 40:
Это базовая заготовка. Подобный метод создания модели так и называется - моделинг от примитива.
Далее создаём два буртика, расположенных на равных расстояниях друг от друга. Для этого открываем свойства инструмента Mesh Tools -> Insert Edge Loop, включаем режим Multiple edge loops, и задаём количество лупов: 2.
Кликаем по любому вертикальному ребру цилиндра, получаем две петли. Переключившись на инструмент маштабирования клавишей R, смещаем лупы вертикально.
Далее нужно выделить полигоны будущих буртиков и выдавить их наружу. Для этого нажатием клавиши Пробел переключаемся на вид сбоку, выделяем нужные полигоны, и применяем к ним операцию Edit Mesh -> Extrude, и доводим буртики манипуляторами инструмента масштабирования до нужного вида:
Тем же методом формируем бурты сверху и снизу:
Некоторые лупы после выдавливания получились мягкими, хотя углы между полигонами в районе 90 градусов. Нужно сразу исправить их, выделив двойным щелчком LMB и применив операцию Shift+RMB -> Soften/Harden Edges -> Harden Edge.
Теперь нужно как-то создать кольцевые рёбра жёсткости на крышках. Если бы мы собирались рисовать текстуру без использования фото или сканов, то рёбра жёсткости можно было бы сделать на глаз, но у нас уже есть готовый скан крышки банки, поэтому мы будем использовать её как референс.
Сохраняем картинку рядом со сценой, смотрим на её разрешение: 512х512 пикселей. Создаём плоскость размером 512х512мм, назначаем ей новый материал типа lambert (RMB - > Assign New Material). Материал назначен, но к его файл-ноде не привязана текстура. Чтобы исправить это, жмём RMB -> Material Attributes, и в свитке Common Material Attributes клацаем по кнопке-шахматке напротив параметра Color:
В открывшемся окошке из списка справа выбираем кнопку File. Теперь в редакторе атрибутов в свитке File Attributes в поле Image Name указываем нашу текстуру. Получается что-то такое:
Поскольку и текстура, и плоскость, на которой она лежит, являются квадратными, то никаких действий с развёрткой предпринимать не нужно. Требуется лишь переключиться на вид сверху, включить режим X-Ray на панели над вьюпортом и отмасштабировать изображение донца под размер банки.
Смещаем плоскость вниз, чтобы она не перекрывала банку, затем, не снимая выделения, открываем панель Channel Box/Layer Editor и добавляем её в новый слой, который можно назвать REF. Слою ставим тип отрисовки Reference – так он будет отображаться во вьюпорте, но плоскость невозможно будет случайно выделить.
Наконец-то переходим к созданию рёбер жёсткости. Будем делать их по-старинке, выдавливанием. Для этого в том же виде сверху удаляем полигоны крышки, выбираем рёбра по краям, и, выполняя операцию Extrude, последовательно выдавливаем их по ширине выпуклостей, но не пользуемся манипуляторами Extrude, а каждый раз переключаемся на инструмент масштабирования клавишей R. Это нужно для того, чтобы рёбра выдавливались в одной плоскости, а не по какой-нибудь дуге.
Оставшееся отверстие закроем операцией Shift+RMB -> Fill Hole. Затем выберем лупы, расположенные по центру выпуклостей, переключимся в перспективу и сместим выделенные рёбра вверх:
Форма задана, теперь нужно её детализировать, заодно добавив поддерживающие рёбра буртикам. Делается это тем же инструментом Insert Edge Loop с включенным параметром Insert with edge flow. Числовое значение этого параметра подбирается экспериментально.
Проконтролировать результат можно нажатием кнопки 3, она включит режим сглаженного отображения:
В этом режиме тоже можно редактировать геометрию.
Итак, верхняя крышка высокополигональной модели полностью готова. Но как быть с нижней крышкой, не моделить же её заново? Удобнее всего продублировать полигоны крышки, воспользовавшись операцией Shift+RMB -> Duplicate Faces. В результате выделенные полигоны крышки будут продублированы отдельным мешем. Остаётся только отзеркалить его по оси Y на панельке Channel Box'а; удалить полигоны нижней крышки; операцией Shift+RMB -> Combine объединить дублированную крышку в один объект с остальной банкой; проверить, совпадают ли вертексы на границе разрезов; подвинуть их, если они не совпадают; и сшить соприкасающиеся вершины операцией Shift+RMB -> Merge Vertices.
Важно!
На этом этапе стоит перейти в режим редактирования вершин и проверить, не осталось ли где-то неудалившихся, мусорных вертексов. |
Результат:
Высокополигональная модель закончена, именуем её в Outlinerе как HI_TIN и переходим к низкополигональной модельке.
Сцену на текущей стадии (формат Maya 2019) можно скачать с нашего сервера.
Низкополигональная (low-poly) модель
Есть два способа получить низкополигональную модель:
- вернуться в прошлое и продублировать заготовку цилиндра на отдельный слой
- продублировать существующую высокополигональную банку и убрать с неё детализацию
В нашем случае удобнее будет убрать детализацию. Для этого:
- нажатием Ctrl+D дублируем существующую банку и добавляем её на новый слой, который назовём HI_GEO. Этот слой пока скроем, нажав на кнопочку V в Layer Editor'е, и не будем трогать до тех пор, пока не перейдём к запеканию нормалмап.
- на оставшейся банке при зажатой клавише Shift кликом ЛКМ выделим каждое второе ребро по диаметру и нажмём Ctrl+Del – этим сочетанием клавиш удалятся и рёбра, и вертексы на пересечениях удаляемого ребра со всеми прочими. Так же поступим с поддерживающими рёбрами на буртиках, а крышки вовсе удалим и закроем образовавшиеся дыры операцией Fill Hole.
- Добавим получившуюся низкополигональную банку на новый слой, который назовём LO_GEO.
Низкополигональная модель готова, именуем её в Outliner'е как LO_TIN и переходим к процессу создания её развёртки.
Сцену на текущей стадии (формат Maya 2019) можно скачать с нашего сервера.
Создание UV-развёртки для низкополигональной модели
Выделяем банку и в основном вьюпорте нажатием Shift+RMB -> Mapping -> Automatic Map накидываем на неё автоматическую развёртку, а в UV Editor'е для большего удобства включаем режим Shaded UV:
Автоматика сделал половину работы за нас, и осталось лишь подправить полученные куски по своему вкусу. Для этого понадобятся лишь два инструмента: Cut и Move and Sew Edges. К ним можно получить доступ в режиме редактирования рёбер, удерживая Shift+RMB.
Сначала сошьём боковину банки в один лоскут:
Затем разделим буртики на отдельные полигоны, выделив их граничные рёбра:
После чего двойным кликом выделим по окружности рёбра крышки и выполним Move and Sew:
Получаем эдакую розочку с лепестками наружу. Критически важно, чтобы куски развёртки не пересекались и не накладывались друг на друга, иначе впоследствии не получится запечь карту нормалей.
Аналогичные манипуляции проделываем и с остальными кусками развёртки:
Подсказка
Вовсе необязательно выделять каждое ребро крышки вручную. Можно кликом LMB выбрать все рёбра нужного куска развёртки, а затем при зажатой Ctrl прокликать лупы - с них снимется выделение, и выделенными останутся только нужные рёбра. |
К полученным кускам применяем операцию Unfold, чтобы дополнительно разгладить их:
А затем выполняем операцию Layout UV, чтобы куски получили одинаковый масштаб и равномерно расположились в UV-пространстве от 0 до 1:
После чего их можно немного раздвинуть, чтобы они не касались друг друга вплотную.
На этом создание развёртки можно считать оконченным.
Сцену на текущей стадии (формат Maya 2019) можно скачать с нашего сервера.
Запекание карты нормалей
Суть процедуры: запекалка берёт информацию о положении нормалей с высокополигональной модели, и сохраняет её в специальную текстурку по UV-координатам низкополигональной модели. В итоге низкополигональная моделька с картой нормалей в игре будет выглядеть почти так же, как высокополигональная, хотя её геометрия нисколько не поменялась.
Вот основные принципы, которые нужно помнить при создании карт нормалей:
- для высокополигональной модели развёртка не нужна вовсе;
- куски развёртки низкополигональной модели не должны накладываться друг на друга;
- развёртку крайне желательно помещать внутри UV-пространства [0,1]
Запекать карту нормалей будем с помощью подключаемой к Майе запекалки под названием Turtle. Она поставляется в виде расширения (плагина), и её нужно включить вручную в Windows -> Settings/Preferences -> Plug-in Manager:
Далее открываем редактор слоёв запекалки: Windows -> Rendering Editors -> TURTLE -> Bake Layer Editor:
В окне редактора есть несколько полей:
- Bake Layers — список слоёв, которым можно задавать разные настройки. Мы будем работать в слое по умолчанию;
- Target Surfaces — целевая, т.е. низкополигональная модель;
- Source Surfaces — высокополигональная модель, с которой будет взята информация о нормалях;
- Envelope Surfaces — специальная модель, используемая в тех случаях, когда различия между высоко- и низкополигональной моделями слишком велики и карта нормалей запекается с дефектами. В нашем случае не пригодится.
Выделяем низкополигональную модель, и добавляем её в поле Target Surfaces нажатием кнопки Add Selected. Высокополигональную модель добавляем в поле Source Surfaces.
Важно!
Обеим моделям нужно включить видимость слоёв в Layer Editor (не том, что в запекалке). Если одна из моделей не будет отображаться во вьюпорте, то карта нормалей не запечётся корректно. |
Закрываем редактор слоёв, открываем окно настроек рендера Windows -> Rendering Editors -> Render Settings, и в ниспадающем списке Render Using переключаем рендерер на Turtle:
Ниже переключаемся на вкладку TURTLE и меняет тип рендера с Rendering на Baking:
И переключаемся на вкладку Baking, расположенную ещё ниже. Здесь нужно включить опцию запекания карт нормалей, отметив флажком пункт Normal Map в свитке Outputs -> Shader Outputs:
Минимальный набор установок задан, можно нажать на кнопочку Render the current frame и посмотреть, что получилось:
Выглядит вполне корректно! Но размерчик маловат. Нужно увеличить размер итоговой текстуры до 2048х2048 пикселей и задать папку (например, X:\import), в которую будет сохранена карта нормалей:
Далее можно поменять настройки применяемого к картинке фильтра и увеличить число проходов во вкладке Sampling. Однако сразу стоит уяснить, что чем больше число проходов, тем медленнее рендерится текстура, поэтому не следует накручивать сэмплы для тестовых прогонов.
Карта нормалей автоматически сохраняется как файл в указанную раньше папку, и впоследствии его можно будет преобразовать в сталкерский бамп средствами СДК.
Сцену на текущей стадии (формат Maya 2019) можно скачать с нашего сервера.
Текстурирование
На время отойдем от модели, чтобы создать для неё текстуру.
Рисовать с полного нуля не будем, воспользуемся сканами крышек банки. Но прежде чем лезть в Фотошоп, придётся снова открыть Майю и сохранить снимок развёртки банки в отдельный файл, поверх которого и будем мастрячить диффуз. Для этого открываем UV Editor - Edit -> UV Snapshot и сохраняем снимок развёртки в отдельный .tga:
Затем открываем его в Фотошопе, и сразу создаём новый слой нажатием неприметной кнопочки в правом нижнем углу:
Теперь открываем скан крышки. Нужно каким-то макаром выделить её, чтобы скопировать на предыдущее изображение. К счастью, в новом Фотошопе есть чумовая опция Выделение -> Предмет, которая хитрым нейросетевым образом сама выделит нужный участок изображения:
Жмём Ctrl+C, чтобы скопировать выделенное. Переключаемся на вкладку со снимком развёртки, жмём Ctrl+V, чтобы вставить скопированное. Далее нажатием Ctrl+T переходим в режим трансформирования выделенного участка, и с зажатой клавишей Shift (для пропорционального масштабирования) подгоняем его под контуры развёртки.
Для большего удобства можно поменять масштабирование, удерживая Alt и вращая колёсико мыши, а на панельке справа настроить прозрачность трансформируемого слоя. Также можно перемещать выделение стрелочками на клавиатуре.
Боковину, конечно, мы не будем сканировать, а просто возьмём участок жести без засветок (ссылка) и сохраним его как новый узор. Для этого нужно выделить кусок картинки инструментом "Прямоугольное выделение", затем перейти в Редактирование -> Определить узор, и сохранить его.
Полученным узором заполним боковину. Для этого нужно создать новый слой, инструментом прямоугольного выделения выделить нужный участок, выполнить ПКМ -> Выполнить заливку, в настройках инструмента включить Содержание: Регулярный и в Заказной узор... выбрать ранее определённый узор:
Участок залит, но масштаб узора слишком велик. Изменить его можно, кликнув по слою на панели справа. Откроется окно Стиль слоя, в нём нужно выбрать Наложение узора, и перемещением ползунка подобрать подходящий масштаб.
Результат:
На боковине явно заметен тайлинг, но это не беда — мы перекроем её этикеткой, которую сейчас и нарисуем.
Этикетка
Дизайн этикетки сгущённого молока практически не менялся с советского времени, так что при желании можно создать полностью аутентичную банку. Берём банку сгущёнки (настоящую, не виртуальную), сдираем с неё этикетку, сканируем, и перерисовываем в фотошопе. Можно и не перерисовывать, но зачем нам проблемы с копирайтом?
Поехали:
- открываем скан, выделяем этикетку прямоугольным выделением, жмём Ctrl+T и выравниваем её
- выделяем одну секцию и жмём Изображение -> Кадрировать
- включаем отображение направляющих через Изображение -> Линейки
- помещаем направляющую вертикально по центру изображения, это будет линия симметрии
Поверх фонового слоя создаём слой-заливку, который заливаем преобладающим голубым цветом.
Поскольку дизайн этикетки горизонтально симметричный, то и обрисовывать будем лишь половину - скажем, левую. Для этого переключаемся на инструмет Кисть, берём образец цвета с фонового слоя при зажатой клавише Alt (режим пипетки), и последовательно обводим контуры на новом слое. Чтобы получить строго вертикальную или горизонтальную линию, нужно удерживать клавишу Shift и вести кисть в нужном направлении. Чтобы получить косую линию, нужно отметить кистью точку её начала, затем зажать Shift, и клацнуть по точке, где линия должна окончиться - после этого она создастся автоматически. Таким же образом можно создавать непрерывный контур.
Обрисовку проводим последовательно: сначала белые области, затем фиолетовые и т.д.
После того, как обвели контуры, заливаем их содержимое нужным цветом. Инструменту Заливка лучше выставить допуск 0, чтобы не создавалась лишняя растушёвка.
Половина этикетки отрисована. Теперь нужно отразить её по горизонтали. Для этого копируем готовую половинку по Ctrl+C, вставляем по Ctrl+V, и отражаем по Ctrl+T и ПКМ -> Отразить по горизонтали. Направляющие можно скрыть нажатием Ctrl+H.