Road Run, или как я свою первую игру делал. Часть 4
Одних домов для игры недостаточно, пейзаж с плотной застройкой не особо разнообразен, да и для глаза сильно приятен. Кроме того, большинство реальных улиц имеют те или иные зелёные насаждения. В общем, озеленение улиц - это хорошо, как с экологической точки зрения, так и с эстетической.
Генератор деревьев
Как же лучше решить решить задачу озеленения? В игре решено было использовать малополигональные модели, что конечно упрощает задачу - не надо создавать сложную реалистичную модель модель дерева, но и делать деревья из конусов, шаров, цилиндров и прочих примитивов тоже не выход - слишком уж просто будут такие модели выглядеть.
Можно взять несколько цилиндров и попытаться придать одному из них форму ствола дерева, а из остальных сделать ветки. Но это длительный и довольно трудоёмкий процесс, особенно для того, кто знаком с трёхмерным моделированием лишь поверхностно, и изучал его по мере необходимости.
Можно ещё использовать возможности блендера по работе с кривыми Безье, с помощью кривых Безье намного удобнее формировать стволы и ветки дерева, они лучше подойдут для создания форм с многочисленными изгибами, встречающимися в природе, чем редактирование геометрии цилиндра. Но есть и более простой и эффективный метод.
Для озеленения обочины дороги я воспользовался бесплатным аддоном «Sapling Tree Gen», который позволяет быстро генерировать деревья. Этот аддон не предустановлен изначально, поэтому заходим в меню «Edit» и выбираем пункт «Preferences…». В открывшемся окне «Blender Preferences» выбираем раздел «Add-ons», в нём находим аддон, который носит название «Add Curve: Sapling Tree Gen», для чего в поиске набираем «sapling». Ставим напротив найденного аддона галочку - теперь предоставляемая им функциональность доступна и можно переходить к моделированию деревьев.
Генерируем дерево. Вызываем меню «Add» комбинацией клавиш «Shift + A», в котором выбираем раздел «Curve», а в нём пункт «Sapling Tree Gen». Дерево сгенерировано, остаётся настроить его так, чтобы оно подходило под наши цели. Сразу после создания дерева в левом нижнем углу редактора «3D Viewport» появится меню «Sapling: Add Tree», в нём можно настроить то, как дерево будет выглядеть: количество стволов, ветвей, углы под которыми стволы и ветви будут расходиться и много чего ещё.
В самом верху этого меню есть выпадающий список «Settings», с его помощью можно переключаться между вкладками настроек. Я пользовался только тремя из них: «Geometry», «Branch Radius» и «Branch Splitting», остальные не трогал.
Первая вкладка, с которой стоит начать - «Geometry». В самом её низу есть выпадающий список «Load Preset», в нём можно выбрать род дерева, например ива или сосна. Род дерева очень сильно влияет на форму итоговой модели дерева, а его изменение сбрасывает уже сделанные настройки, поэтому начинать надо с настройки рода. Поднимаясь вверх от списка, мы можем изменить размер дерева в поле «Scale», в поле «Random Seed» можно незначительно изменить форму дерева, провести ему тонкую настройку. Поле «Branch Rings» позволяет располагать ветви кольцами вокруг ствола дерева, а поле «Branch Distribution» можно настроить распределение ветвей по вертикали, например, сделать так, что ветви будут расти гуще у основания ствола и редеть по мере приближения к вершине.
Если дерево не имеет объёма и состоит из одних кривых чёрного цвета, то причиной этому, скорее всего, отсутствие галочки «Bevel», которая находится в самом верху под именем вкладки «Geometry».
Следующая вкладка носит название «Branch Radius» и регулирует толщину ствола и ветвей дерева. В ней мне пригодилось поле «Ratio», которое регулирует общую толщину модели как ствола, так и ветвей. Если есть желание сделать толще основание ствола, корневище у дерева, то можно воспользоваться полем «Root Flare».
На вкладке «Branch Splitting» настраивается количество стволов и ветвей у дерева. Первое сверху поле «Levels» устанавливает сколько уровней ветвей будет иметь дерево: 1 - дерево состоит только из одного ствола, без ветвей, 2 - от ствола отходят ветви, но на этих ветвях ничего нет, 3 - на отходящих от ствола ветвях появляются ветви поменьше и так далее. Максимум у ветвей может быть 4 уровня. Поле «Base Splits» отвечает за количество стволов у дерева, если в нём указан ноль, то дерево имеет один ствол. В поле «Trunk Height» можно установить высоту, на которой начинается рост ветвей. Вводя различные значения в два следующих поля можно менять положение ветвей на дереве. Ниже идут блоки настроек для каждого из четырёх уровней ветвей.
Каких-то конкретных советов по работе с настройками дерева я дать не смогу, сам я настраивал форму дерева эмпирическим путём - менял один из параметров, затем смотрел, как изменится форма. На картинке «Настройки дерева» показаны итоговые значения.
Ствол и ветви дерева готовы, но модель дерева построена сплайнами, а не сеткой, в чём можно убедиться нажав клавишу «Tab» и перейдя в режим редактирования геометрии. Вместо привычной сетки из полигонов будут кривые, окружённые оболочкой. Нужно преобразовать сплайны кривой в сетку. Что делается следующим образом: в режиме «Object Mode» выделяем дерево, затем щёлкаем на нём правой кнопкой мыши и в появившемся контекстном меню «Object Context Menu» выбираем группу «Convert To», в которой выбираем пункт «Mesh». Модель дерева теперь состоит из полигонов, а не из кривых и оболочки вокруг.
Листья
Кроме ствола и ветвей у деревьев есть ещё листья, особенно в летний период. Нашему дереву для полноты картины их явно не достаёт. Что сейчас и будет исправлено.
Кроны деревьев редко имеют правильные геометрические формы, поэтому просто использовать какой-либо примитив из меню «Add» без доработки не получится. Нужен объект неправильной формы, который в низком разрешении будет напоминать крону дерева. К счастью, как и в случае со стволом и ветвями дерева, в блендере есть все необходимые инструменты для решения и этой задачи.
Решение по своей сути достаточно простое: взять какую-нибудь базовую геометрическую модель из списка в меню «Add», взяв её за основу, и исказить её форму так, чтобы она стала похожа на крону дерева.
В качестве основы для листвы я взял икосферу «icosphere», её геометрия лучше всего подходит для подобной задачи, она не имеет углов и острых кромок, как, например, куб или цилиндр, или ярко выраженных центров, как, например, UV-сфера.
Но икосфера сама по себе имеет правильную шарообразную форму и нашу задачу до конца не решает. Надо придать ей форму более похожую на скопление листьев. Можно сделать это вручную отредактировав геометрию, но есть и более удобный способ.
Способ заключается в использовании модификатора «Displace» и процедурной текстуры, генерирующей изображение облачности. Если просто и коротко, то модификаторы в блендере позволяют автоматически выполнять разнообразные операции над геометрией объектов. Основное преимущество модификаторов состоит в том, что они не затрагивают изначальную геометрию объекта, пока, правда, не будут применены. После вызова команды «Apply», геометрия объекта будет изменена, а её изменения станут необратимыми.
В редакторе «Properties» вкладка, посвящённая модификаторам, обозначена иконкой гаечного ключа синего цвета. Переходим в неё и в выпадающем списке «Add Modifier» выбираем модификатор «Displace».
На вкладке появится плашка с настройками выбранного модификатора, а икосфера немного изменится в размерах. Этих изменений для нашей цели явно недостаточно. Нужно создать текстуру, которая укажет модификатору величины, на которые следует переместить геометрические вершины модели, на которой он установлен.
Жмём кнопку «New», и текстура создана, теперь необходимо её настроить. Настройка текстуры осуществляется на вкладке «Texture», она имеет иконку шахматной доски алого цвета.
Перейдя в на вкладку «Texture» в выпадающем списке «Type» нужно выбрать пункт «Clouds». Форма икосферы изменится на более произвольную.
Остаётся дело за малым, продублировать икосферы, и распределить их по ветвям дерева в местах, где должны быть листья, или вернее, скопления листьев. Чтобы эти скопления отличались друг от друга, в настройках модификатора «Displace» в выпадающем меню «Coordinates» нужно выбрать пункт «Global». Теперь для позиционирования облачной текстуры «Clouds» вместо локальной системы координат модели будет использоваться глобальная система координат. Благодаря ей, в случае изменения позиции модели в пространстве, изменится и позиция текстуры в модификаторе, что в нашем случае приведёт к изменению формы икосферы. То есть не надо будет менять настройки или геометрию каждой отдельной кроны, её достаточно будет переместить, и форма изменится сама.
Дублируем скопления листьев сочетанием клавиш «Shift + D» и распределяем их по дереву клавишей «G». После проделанных операций должно получится дерево похожее на то, что изображено на картинке. Но оно имеет лишь один цвет - серый. Раскрасим его в более традиционные цвета.
В этой операции нет ничего нового, я рассказывал о ней ранее. В случае с деревом нужно создать два материала: один для листвы, другой для ствола и ветвей. Затем назначить материалы соответствующим им моделям. Оба материала состоят из двух узлов: «Diffuse BSDF» и «Material Output», отличаются они только цветом, установленном в узле «Diffuse BSDF».
Дерево раскрашено, теперь составляющие его модели можно объединить в одну модель. Объединять модели в одну лучше после назначения им материалов, если их материалы отличаются. Дело в том, что пока листья - это одна модель, а ствол - это другая, можно выделить одним щелчком мыши только одну модель, например модель ствола или одну из моделей листьев, и назначить всей этой модели материал. Если же ствол дерева и его листья будут единой моделью, то придётся заходить в режим редактирования геометрии модели дерева и назначать уже каждой из её граней соответствующий материал, что займёт намного больше времени.
Для объединения нескольких моделей в одну их нужно выделить, затем щёлкнуть правой кнопкой мыши на одной из них и в появившемся меню «Object Context Menu» выбрать пункт «Join». Я рекомендую активной моделью, она выделяется жёлтым цветом и является единственной в выделении, сделать модель ствола дерева, таким образом, после объединения центр «Origin» модели будет находиться у основания ствола дерева, что лучше и с эстетической точки зрения, и облегчает работу с моделью. Например, относительно этой точки будет происходить изменение размера модели, жёлтая точка «Origin» будет неподвижна в то время, как остальная модель будет менять своё положение, сжимаясь или увеличиваясь в размере, вращение модели тоже будет происходить вокруг точки «Origin».
Теперь у нас есть окрашенная модель, недостаёт только текстурированной. План действий здесь такой же, как и в случае с моделями дома и стены: сделать копию модели, удалив с неё все материалы, создать материал для этой копии и подключить к нему растровое изображение - будущую текстуру.
Остаётся только UV-развёртка и можно запекать текстуру. Вопрос лишь в том, как разворачивать модель, наше дерево мало того, что имеет больше граней чем дом, так ещё и не имеет правильной формы, поэтому использование швов и развёртки по ним модели в данном случае затруднительно.
Выходом из положения может стать способ развёртки, применяемый для карт освещения, доступ к которому находится в меню «UV Mapping». Переходим в рабочее пространство «UV Editing», находясь в режиме редактирования геометрии модели «Edit Mode» в редакторе «3D Viewport» выделяем все грани, для чего можно воспользоваться клавишей «А», затем нажимаем клавишу «U» и вызываем меню «UV Mapping», в котором выбираем пункт «Lightmap Pack».
После чего должно появиться окно с одноимённым названием, в нём нажимаем кнопку «ОК». Настройки можно использовать те, которые уже есть при открытии, изменение их влияет не на многое, по крайней мере в рассматриваемом здесь случае.
Работа с развёрткой закончена, можно переходить к запеканию. Сам процесс и его настройки читателю должны быть уже хорошо известны, но здесь есть особенность, на которой стоит остановиться немного подробнее, иначе результат может оказаться как на картинке ниже.
В первом случае, текстура покрылась пятнами, а во втором - цвета перетекли на соседние полигоны. Если такие проблемы возникли, то решать их, меняя настройки в окне «Lightmap Pack», бесполезно. Для борьбы с подобными негативными эффектами понадобится вкладка «Render» рабочего пространства «Properties», на ней запускается и настраивается запекание текстуры.
В группе настроек «Selected to Active» есть поле «Extrusion», в которое можно ввести значение от нуля до единицы, по умолчанию в нём стоит ноль. Если ноль там так и оставить, то получится первый вариант - текстура будет в пятнах, если ввести в это поле слишком большое число, то получится уже второй вариант проблемы. Для того, чтобы устранить обе проблемы сразу в поле «Extrusion» следует ввести очень маленькое число, например «0.01».
Теперь текстура должна сгенерироваться без описанных выше негативных эффектов.
Заключение
Модель дерева и текстура к ней готовы, как и с моделью дома в прошлой части, всё оказалось не так уж сложно, как могло показаться с первого взгляда. Деревья станут хорошим дополнением к домам и разнообразят пейзаж, украсив улицы в игре.
Моделей для полноценной игры, конечно, ещё недостаточно, но создать из них небольшой тестовый уровень уже можно. Такой уровень будет полезен и поможет пролить свет на некоторые особенности компоновки моделей в игре. Когда всё собираешь вместе проще увидеть какие-либо недочёты и несоответствия среди трёхмерных моделей, например, цвета могут плохо сочетаться между собой у разных моделей, или размеры кирпичей у одного здания будут отличаться от таковых у другого здания. Всё это лучше исправить на начальном этапе, чем возиться этим потом, когда будет хватать других проблем.
Поэтому следующую часть нужно будет посвятить созданию уровня, на котором будет дорога, создание которой описано ещё в первой части, и обочины с домами и деревьями.
Надеюсь, что изложенный материал был интересен читателю, и от его прочтения читатель получил, как минимум, удовольствие, а как максимум - знания. Описываемую игру можно скачать тут, так же удобно воспользоваться приложением для загрузки и установки игр с itch.io, которое скачивается здесь.