Road Run, или как я свою первую игру делал. Часть 3

781e0a58b096a4553bef3a28b472b212.png

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

Введение 

В предыдущей части я рассказывал о том как сгенерировать текстуру кирпичной стены и окно в ней. Но одних стен и окон для окружающего мира в игре недостаточно. Чтобы окружающий игрока мир не походил уж совсем на коридор, стену нужно расположить на заднем плане, а пространство перед ней заполнить разнообразными строениями, такими как дома, магазины, гаражи, хранилища и прочие хозяйственные и не очень постройки. Таким образом, игрок будет видеть, что он едет через город, а не через пустырь, свидетельствующий о лени разработчика.

Поэтому, темой этой части и стал дом. В общем-то, здесь я хочу изложить принципы, которые применимы не только к моделям построек, но и к любым другим моделям, таким например, как автомобили и прочая техника.

Материал этой части опирается на сведения, изложенные в первых двух частях, настоятельно рекомендую с ними ознакомиться, так материал, изложенный далее, будет понятнее и легче к восприятию.

Дом

Зачем вообще нужна модель дома, если у нас уже есть модели стен, которые можно скомпоновать вместе на сцене, и получить готовый дом без траты времени и сил на создание отдельной модели?  

Ну, во-первых, это удобно, выставить на сцену в игровом движке уже готовую модель дома получится намного быстрее, чем собирать этот дом из отдельных стен. Во-вторых, ресурсов единая модель с одной текстурой будет потреблять меньше, чем несколько моделей, каждая со своей текстурой. Одна большая модель с одной большой текстурой предпочтительнее с точки зрения производительности, чем много маленьких моделей с небольшими текстурами.

В качестве примера, думаю, стоит взять небольшое одноэтажное строение. Создание такой модели не потребует много времени , ведь она не должна быть слишком подробной, игрок не будет к ней близко подходить, а лишь проезжать мимо неё. Основные команды, которые я использовал для решения подобной задачи — это «экструзия», она вытягивает грани, активируется клавишей «Е» в режиме редактирования геометрии, и команда изменения размера, запускаемая клавишей «S».

Запускаем программу 3D моделирования Blender и создаём в ней плоскость: в рабочем пространстве «Layout» в редакторе »3D Viewport» вызываем контекстное меню «Add» комбинацией клавиш «Shift + A», в котором выбираем в пункте «Mesh» плоскость «Plane».

Дом с плоской крышей

Дом с плоской крышей

Выделяем только что созданную плоскость, нажимаем клавишу «Tab» для перехода в режим редактирования геометрии. Теперь вытягиваем плоскость при помощи команды экструдирования, клавиша «Е» (английская) на клавиатуре, и изменяем её размер — клавиша «S», пока не получится строение, отдалённо напоминающее дом с плоской крышей.

Сама модель дома готова, её надо будет только раскрасить, ну или затекстурировать, кому как больше нравится. На этом этапе я делаю копию уже готовой модели, для чего выхожу из режима редактирования геометрии. Очень важно не забыть перейти в режим взаимодействия с объектами «Object Mode», иначе модель так и останется одна, просто будет состоять из двух домов. В режиме редактирования геометрии копируется сама геометрия (вершины, рёбра и грани) внутри модели, а не сама модель. Но для запекания текстур нужны две отдельные модели.

Находясь в режиме «Object Mode» нужно выделить модель и нажать комбинацию клавиш «Shift + D», а затем клавишу «Escape», чтобы копия не сдвинулась относительно оригинала. Я советую в названии одной из моделей использовать постфикс «texture» — она будет содержать конечную текстуру для игрового движка, а в названии другой — «paint», так как эта модель будет содержать материалы, цветовая информация которых запечётся в текстуру первой модели.

Выкройка

Начну с первой модели, которая должна содержать итоговую текстуру. Подробно о том, как создать для неё материал и подключить к нему картинку, в которую будет записана текстура, можно прочесть в предыдущей части, здесь я на этом останавливаться не буду.

Материал с текстурой

Материал с текстурой

Перейду сразу к UV-развёртке и работе с ней. Проблема, с которой предстоит столкнуться, заключается в том, что текстура двумерная, а дом трёхмерный, следовательно возникает вопрос, как перенести объёмную модель на плоскую текстуру. Со стеной из второй части было проще, сама стена хоть и была трёхмерной моделью, но имела всего два измерения, поэтому легко накладывалась на текстуру.

Если модель имеет три измерения, на помощь и приходит UV-развёртка. Подобно тому, как портной делает выкройку на плоском отрезе ткани, из которой потом получается объёмный костюм, UV-развёртка создаёт карту на плоском изображении текстуры, которая будет указывать какая область текстуры на каком полигоне модели будет отображена. Таким образом объёмная модель будет окрашена плоской картинкой.

Как и в портном деле, для создания развёртки модели на ней необходимо отметить швы, по которым происходить разрезание её на плоские фрагменты. Вот изображения этих фрагментов и будут располагаться на текстуре. Швы отмечаются в режиме редактирования геометрии командой «Mark Seam» контекстного меню «UV Mapping». Его можно вызвать, нажав клавишу «U» на клавиатуре.

При разметке швов иногда удобно воспользоваться режимом отображения каркаса «Wireframe», он располагается в самом начале меню «Viewport Shading» в правом верхнем углу редактора »3D Viewport».

Швы

Швы

Переходим в режим редактирования модели с постфиксом «texture».  Выделяем те грани модели, по которым пройдут швы, и вызываем команду «Mark Seam». Выделенные грани окрашиваются в красный цвет — швы готовы. По этим швам модель разрезается на сегменты, которые в развёрнутом виде помещаются на текстуре, для чего необходимо снова вызвать меню «UV Mapping», выбрать в нём команду «Unwrap», которая развернёт модель на текстуре.

Модель «texture» и её развёртка

Модель «texture» и её развёртка

В редакторе «UV Editor» можно перемещать, вращать и изменять размер разделённых швами частей модели для более оптимального их расположения внутри текстуры. Нажатие клавиши «G» запустит команду перемещения выбранной части или частей, «R» — вращение, «S» — изменение размера, если во время выполнения команд перемещения или изменения размера нажать «X» или «Y», то изменения будут происходить только вдоль одной из осей, той клавиша которой была нажата. Чтобы применить изменения и завершить выполнение команды надо нажать «Enter», если изменения применять не нужно — «Escape».

Первая модель готова, займёмся теперь второй. Вторая модель — это модель с постфиксом «paint», которую мы будем раскрашивать, и с которой потом запечём цвета в текстуру первой модели. Для неё тоже нужно создать UV-развёртку, она пригодится для позиционирования процедурно сгенерированного изображения на гранях модели.

Модель «paint» и её развёртка

Модель «paint» и её развёртка

Расположение развёртки модели на данном этапе не так важно, перемещать её мы будем уже после создания процедурных материалов, если такая необходимость возникнет.

В редакторе «Shader Editor» создадим материал с уже знакомой нам процедурной кирпичной кладкой, но с одним отличием от созданных во второй части материалов: со входом «Vector» узла «Brick Texture» вместо выхода «Object» узла «Texture Coordinate» будет соединён выход «UV» того же узла.

Кирпичная кладка

Кирпичная кладка

Таким образом, информация для позиционирования материала на гранях модели теперь черпается из UV-развёртки этой модели. Следовательно смещение UV-развёртки модели будет влиять на отображение генерируемой текстуры на гранях модели. Это очень удобно, когда нужно текстуру расположить на грани модели определённым образом, например, кирпичная стена смотрится куда лучше, когда вмещает целое число кирпичных рядов, а кирпичи в этих рядах расположены симметрично. 

Выравниваем кирпичи

Выравниваем кирпичи

Осматриваем наш дом со всех сторон, если то, как наложен материал на ту или иную грань модели нас не устраивает, двигаем эту грань в развёртке. Здесь удобно будет воспользоваться рабочим пространством «UV Editing», где можно сразу двигать развёртку и смотреть за изменением изображения на гранях. Клавиша «G» вызывает команду перемещения, как только команда вызвана, вслед за движением курсора мыши начнёт перемещаться и выделенная часть развёртки. Если во время выполнения команды перемещения нажать клавишу «Shift», то скорость перемещения снижается, позволяя двигать развёртку с большей точностью. Думаю, не стоит напоминать, что при нажатии на клавишу «G» курсор мыши должен находится над областью редактора «UV Editor».

Ровная кирпичная кладка

Ровная кирпичная кладка

Считаю уместным упомянуть, как я сделал обрамление кирпичной кладки на крыше — две красные полоски. В общем, тут нет ничего сложного, я добавил рёбра по периметру крыши сверху и снизу, таким образом, каждая боковая грань крыши теперь разделена на три части — три грани. Каждой из граней можно назначить свой материал, чем я в итоге и воспользовался.

Материал красного цвета содержит всего два узла: «Diffuse BSDF» и «Material Output». В узле «Diffuse BSDF» в поле «Color» установлен красный цвет. 

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

Советую все стены сделать разными, с разным количеством окон и дверей. Игроку видна обычно одна, в лучшем случае две стены, поэтому, располагая один и тот же дом под разным углом к игроку, можно добиться впечатления, что это разные дома.

Для дублирования окон и дверей можно воспользоваться модификатором массива. Модификаторы находятся в редакторе «Properties» на вкладке с одноимённым названием и иконкой в виде гаечного ключа. В выпадающем списке «Add Modifier» нужно выбрать «Array» и настроить его по собственному желанию. 

Здание

Здание

Процесс запекания материалов дома и его элементов в растровую текстуру ничем не отличается от аналогичного процесса, описанного в предыдущей части, где запекали текстуры стены и окна. Если текстура не генерируется, то следует проверить правильность всех настроек, особое внимание стоит уделить полям «Extrusion» и «Max Ray Distance» и проверить их значения. В поле «Extrusion» значение должно быть больше нуля, я установил единицу. В поле «Max Ray Distance» следует оставить нулевое значение. 

Подготовка к запеканию

Подготовка к запеканию

Выделяем все элементы, изображения которых желаем видеть на итоговой текстуре, если модель дома с итоговой текстурой не является активной, то делаем её таковой кликнув на ней левой кнопкой мыши, удерживая при этом клавишу «Ctrl» на клавиатуре.

Итогова текстура

Итогова текстура

Спустя некоторое время, текстура будет готова. Теперь её можно сохранить на диске ПК или упаковать внутрь блендер-файла, а модель с постфиксом «texture» экспортировать в понятный игровому движку файл. Сам процесс экспорта моделей из блендер-файла в файл, формат которого понятен Unity, был описан в первой части.

Заключение

В этой части я изложил базовые принципы того, как можно, не имея обширного опыта в создании трёхмерных моделей, и без больших затрат по времени создать модель небольшого дома. Такую модель легко менять, увеличивая её длину и ширину, добавляя новые этажи, балконы и колонны, получая новые здания, и тем самым делая пейзаж игры всё более разнообразным.

Но наличие одних только домов вдоль дороги недостаточно, картина, предстающая взору игрока кажется незаконченной. Нужно что-то ещё: деревья, припаркованные автомобили, столбы, заборы и всё такое прочее, чем обычно изобилуют придорожные территории.

Следующую часть, думаю, стоит посвятить зелёным насаждениям, а если конкретнее, то деревьям. Деревья во многих городах встречаются не реже домов, да и озеленение придорожной территории пойдёт только на пользу как пейзажу игры, так и экологии, пускай и виртуальной.

Надеюсь, что изложенный материал не сильно утомил читателя, а кого-нибудь может даже и заинтересовал. Описываемую игру можно скачать тут, так же удобно воспользоваться приложением для загрузки и установки игр с itch.io, которое скачивается здесь.

© Habrahabr.ru