В этом девлоге я расскажу о своих экспериментах с Houdini и чего удалось достичь.
В предыдущем девлоге я уже упоминал, что начал изучать Houdini и в частности Houdini Engine, чтобы создавать процедурные ассеты непосредственно в Unity.
Мне настолько понравился процесс и результат, что я решил уделить всё своё время практике создания ассетов в Houdini. Я старался делать не какие-то абстрактные ассеты, а те, которые подходят под выбранные мной сеттинги и которые я смогу сходу использовать в левел-дизайне.
Напомню, что сеттинги в игре планируются следующие:
- Парящие острова
- Подземные руины
- Долина механизмов
- Царство грибов
Итак, на данный готовы следующие ассеты...
Генератор цепей
Цепи достаточно часто используются в качестве декоративных элементов в играх. Я планирую активно использовать их в сеттингах подземных руин и в долине механизмов.
По факту, я сделал 2 ассета.
Первый это spline-driven цепь. Дизайнер создаёт и настраивает форму сплайна и цепь повторяет его форму. Удобно, когда цепь нужно на что-то намотать или "красиво" разложить на полу.
Второй симулирует провисание цепи между двумя зафиксированными точками. Дизайнер может задавать положение точек и степень провисания.
Также, вы могли заметить, что сами звенья цепи тоже кастомизируются. В каждом генераторе можно задавать:
- Размер звеньев.
- Радиус сечения.
- Сглаживание. Можно сделать звенья гладкими и округлыми, а можно угловатыми с жёсткими гранями.
- Относительный поворот звена относительно предыдущего со случайным разбросом.
- Общий поворот звеньев относительно направляющей оси.
Генератор шестерёнок
Продолжаем тему "механических" ассетов.
Шестерёнки являются ключевым элементом в долине механизмов, так что я не мог обойти их стороной.
Хоть в универе я и занимался рассчётом и проектированием зубчатого соединения на "теории машин и механизмов" (эвольвента, я тебя ненавижу), все эти знания давно выветрились и забылись как страшный сон (ну, кроме эвольвенты). Да и казалось бы, мы же тут не реальную шестерёнку проектируем, а делаем стилизованый ассет, так ведь?
На практике оказалось, что качественное процедурное параметрическое зубчатое колесо требует приличное количество формул и взаимосвязанных параметров. Тем не менее, немного поскрипев мозгом, я добился результата, который меня удовлетворил.
Для каждой шестеренки можно задавать:
- Радиус, толщину обода, высоту.
- Количество и размер зубьев.
- Тип, количество и толщину спиц или спейсеров.
- Наличие и радиус оси, на которой закреплено колесо.
Также, пришлось немного заморочиться и написать для них свой шейдер с анизотропным спекуляром, чтобы они имели металлический блик.
Генератор лиан
Этот ассет работает по тому же принципу, что и spline-driven цепи. Дизайнер также задаёт форму сплайна, а лиана его повторяет. Только сама геометрия сложнее и количество параметров немного больше, чем у цепи.
Можно задавать:
- Количество жил.
- Толщину и цвет жил.
- Амплитуду отклонения от направляющей оси.
- Random seed для волновой функции шума.
- Количество, размер и цвет листьев.
На практике это выглядит примерно так:
В будущем я планирую доработать шейдер, чтобы листья немного покачивались на ветру.
Генератор подвесного моста
На данный момент это единственный ассет, который я планирую использовать не просто как декорацию, а как функциональный объект, который будет соединять между собой платформы в сеттинге парящих островов.
Несмотря на то, что визуально он выглядит сложнее, по факту он использует тот же принцип, что и провисающая цепь. В добавление к степени провисания можно еще задавать наличие или отсуствие верёвочных "перил" слева и справа, а также random seed, чтобы рандомизировать форму и оттенок досок.
Так как это объект функциональный и персонаж должен иметь возможность по нему бегать, то при запекании ассета ему автоматически назначается нужный Layer, чтобы Character Controller мог распознавать его как поверхность, по которой можно ходить. Также, генерируется упрощенная геметрия, которая назначается в качестве mesh collider'а.
Всё это происходит автоматически, руками ничего делать после запекания не нужно.
Сложности
Хочу поделиться неожиданным для себя откровением.
Как оказалось, делать процедурную геометрию не так сложно, если чётко понимать как работают полигоны, вертексы и ноды в Houdini. Но внутриигровой ассет подразумевает не только геометрию.
После того как модель создана, нужно для нее создать UV-развёртку, чтобы иметь возможность накладывать текстуры. И вот это оказалось большим подводным камнем.
Во-первых, количество вертексов и полигонов может отличаться на порядки в рамках вариаций одного и того же ассета. Форма и топология модели тоже может меняться. При этом, работая с ассетом в Unity, нет возможности подкорректировать развёртку руками, всё должно делаться само.
Во-вторых, для статичного батчинга, вариации одного и того же ассета должны иметь один и тот же материал. Если материал подразумевает текстуру, то надо понимать, что одна и та же текстура будет наложена на модели разных конфигураций.
И вот тут то и начинаются пляски с бубном. Иногда получается отделаться малой кровью и встроенными нодами Houdini, если грамотно сегментировать текстурное пространство. Но зачастую приходится включать "режим программиста" и внутри самой Houdini писать скрипт, который будет обходить либо все, либо определённую группу вертексов и по заданному алгоритму размещать их на UV развертке.
В целом у меня получается, что генератор самой модели я делаю за пару часов, а потом еще пару дней вожусь с настройкой UV-развёртки и подгонкой текстуры.
Тем не менее, сейчас процесс идёт гораздо быстрее по сравнению с первым ассетом (грибами), на который у меня ушло около 5 вечеров.
Новый формат общения
До этого момента у проекта в русскоязычном сегменте было всего 2 основных площадки продвижения - DTF и VK.
Я знаю, что многие здесь скептически относятся к VK или вообще не имеют в нём аккаунтов (например, как я, до того как пришлось создать там группу для проекта).
Также я думал о новом формате. Сейчас на DTF выходят большие девлоги в среднем раз месяц. В VK апдейты почаще, но они поменьше и при этом нет ощущения общения с аудиторией.
Поэтому с недавнего времени в Telegram существует группа, посвящённая King, Witch and Dragon. Я специально сделал группу, а не канал, чтобы писать мог не только я, но и любые участники могли свободно задавать вопросы и общаться между собой.
Основной фокус, это, конечно, мой проект, но мы также свободно общаемся на любые окологеймдевные и околоигровые темы.
Так что если вам хочется позадавать вопросы про проект, про разработку (в частности, соло-разработка), про используемые инструменты или просто как я докатился до жизни такой, добро пожаловать в нашу группу:
Что дальше?
Если коротко, то Houdini теперь моя любимая софтина... ну, после Unity конечно же, всё таки я игру в первую очередь делаю. Я очень корю себя за то, что не заставил себя попробовать Houdini раньше. В любом случае, я продолжу развивать и наращивать свою библиотеку процедурных ассетов окружения и потихоньку займусь левел-дизайном.
Чтобы поддержать разработку игры, добавляйте King, Witch and Dragon в вишлист на Steam, это важно не только для моей мотивации, но и для алгоритмов Steam. Чтобы принять участие в обсуждении, вступайте в telegram-группу и группу ВК, а также подписывайтесь на меня в Twitter и Instagram.
Спасибо за внимание!
Мне кажется, Вам больше нравится возиться с генерацией, чем с экшеном игры :)
Конкретно сейчас - да :) Вот наиграюсь и буду дальше делать экшон. Мальчику новую игрушку дали, как вы не понимаете, ну.
Да я прекрасно понимаю :-)
Эта игра часто и давно здесь мелькает, но автор вообще не занимается разработкой игры, судя по выкладываемым материалам. Есть блокауты всех уровней, все основные механики, основной нарратив?
Пока я с прошлого года вижу только посты типо «я сделал настраиваемый цвет левого глаза мухи». Это хорошо, но без последовательности и плана эта игра никогда никуда не выйдет.
Вот щас обидно было.
основной нарративЕсть. Но его нет смысла выкладывать. Завязка истории известна уже давно, остальное спойлеры.
все основные механикиЕсть. Половина статей в этом блоге посвящена контроллеру и логике движения персонажа, его способностям, взаимодействию с окружением и боёвке.
блокауты всех уровнейВ процессе.
без последовательности и плана эта игра никогда никуда не выйдетАбсолютно согласен. Поэтому план есть.
Значит я был не прав и твои дела лучше, чем я думал.
Ябзахавал
Итого, сколько времени понадобилось на освоение гудини до текущего уровня? Был ли опыт моделинга, если да, то в чем? Мешает ли он или помогает?
Давно думаю потрогать эту софтину, но пока что руки не доходят, по отзывам, нужно очень серьезно подходить к освоению и приложить усилия.
Первый раз запустил Houdini где-то в середине января. Грубо говоря 2 месяца неторопливого просмотра туториалов и ковыряния редактора.
До этого был опыт создания ассетов в Blender’e (модельинг, UV-развёртка, риггинг, скиннинг, анимация). Он безусловно помогает. В первую очередь нужно понимание топологии, как работают эдж-лупы и т.д. Если нет понимания как сделать вручную, то создать грамотную топологию и развертку процедурно будет ещё сложнее.
Я бы сказал, что мне сильно помог и облегчил жизнь опыт работы с шейдерами. По сути vertex shader это ведь тоже процедурная манипуляция мешем.
Ну и знание программирования на С-подобном языке тоже сыграло свою роль. Я теперь могу спокойно переключаться между редактированием нод и написанием вспомогательных скриптов (как в посте выше для развёртки).
Спасибо за развернутый ответ, за вашим проектом давно слежу, рад, что делитесь новостями
Не читал, но один комментарий насчет картинки с бегающим человечком: не надо начинать двигать фон сразу с началом движения персонажа, должно быть некоторое пространство слева-справа, в пределах которого перс может двигаться без движения фона.
Комментарий недоступен
Да, ассет запекается в статичный меш, либо сразу в префаб.
Потом на него можно навешать любые компоненты и делать всё что захочется, как и с другими ассетами в игре.
Преимущество в том, что можно очень быстро делать много вариаций схожих объектов прямо внутри unity, минуя этап импорта/экспорта из условного blender'a. Например мне нужно несколько подвесных мостов, с расстоянием между платформами 5, 10, 15 и 20 метров и с перепадом высот 2, 4, 6 и 8 метров. Вместо того чтобы экспортить 16 моделей из Blender'a я просто двигаю контрольные точки процедурного ассета и нажимаю кнопку Bake. Чем больше вариаций надо сделать, тем больше выигрыш по времени.
А всякие сплайновые цепи и лианы позволяют "моделировать" их прямо в контексте геометрии уровня. Сильно облегчает подгонку под окружение.
Комментарий недоступен
Такое лучше делать либо шейдером, либо анимацией на костях и тогда процедурный подход тут неочень работает (хотя, наверное, можно сделать генератор, которые будет сам добавлять кости и сразу скинить на них меш, но я не пробовал).
Я не утверждаю, что прямо все ассеты надо делать процедурно. Для чего-то такой подход работает, для чего-то нет. Уникальные штучные объекты, конечно, лучше делать руками.
Сам юзаю Гудини на работе, но в основном для симуляций, никак мне не даётся vex, хотя понимаю, что только с ним можно делать крутые штуки.
Vex во многих случаях можно заменить Vop’ом, но да, есть ситуации когда без vex’а никак (либо очень долго, неудобно и на костылях).
Игры - это всегда костыли, где-то больше, где-то меньше)
и где-то раньше, где-то позже ))
Норм
Респект за гудини
Прям тоже захотелось попробовать, но
Попробовать можно Apprentice версию, которая идёт бесплатно. Единственное, не будет доступа к Houdini Engine, но саму Houdini вполне можно поковырять и понять, стоит в неё инвестировать время и деньги или нет.
Узнал полезную информацию по процедурной генерации и Houdini. Благодарю за статью и удачи с игрой!