Вы находитесь на странице: 1из 18

XYZ Media Геймдизайн Как игры создают сами себя — чудеса процедурной генерации

КАК ИГРЫ СОЗДАЮТ САМИ СЕБЯ — ЧУДЕСА


Artyom Kaleev
Шеф-редактор XYZ Media

ПРОЦЕДУРНОЙ ГЕНЕРАЦИИ
250 23

2575 47 3 25 3 ноября 2020

Рассказываем на примере Minecraft и No Man's Sky о том, почему псевдослучайные миры получаются такими
насыщенными.

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

Из-за простоты применения процедурную генерацию используют везде — от ААА-блокбастеров вроде третьего
«Ведьмака» до инди-песочниц и «рогаликов». Она значительно упрощает производство игры — ведь написать
алгоритм создания мира куда дешевле, чем привлечь к работе штат художников.

Но что если построить всю игру вокруг одной идеи — исследования бесконечно разнообразных миров, и ни один
из них не будет похож на прежний? Minecraft, No Man’s Sky и прочие «выживалки» — именно про это. И добились
они такого эффекта благодаря простой, но в то же время гениальной задумке генерации миров.

Немного теории
Все когда-либо созданные миры в Minecraft или Terraria кардинально отличаются друг от друга. Да, они состоят из
одних и тех же элементов, так называемых биомов — гор, равнин, пустынь и океанов, — но эффекта дежавю у вас
никогда не возникнет.
Почему? Всё благодаря принципу работы генератора уровня. И тут стоит немного углубиться в теорию.

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

Броуновское движение — частицы перемещаются хаотически и беспорядочно

Но в играх такие переусложнения никому не нужны — поэтому вместо истинной случайности разработчики
используют псевдослучайность. Она достигается благодаря важному элементу процедурных генераторов миров
— ГПСЧ, или генератору псевдослучайных чисел, который работает на основе сложных математических формул.

Говоря простыми словами, «случайные» числа в компьютерах не берутся из воздуха — они создаются
специальными алгоритмами. А функция «random» в любом языке программирования — и есть результат работы
одного из таких алгоритмов.

Но если процедурный генератор работает на основе одних и тех же алгоритмов и правил, а истинной
случайности в играх нет, почему каждый раз создаются совершенно разные миры? Для этого необходимы «сиды»
(seeds) — «зёрна» или, если корректнее, «порождающие элементы».

Сид — это, по сути, значение, которое закладывается в алгоритмы генератора при создании мира. Чаще всего оно
представлено в виде псевдослучайного ряда цифр. В качестве «зерна» можно использовать точное время, взятое
из системы: например, если вы создадите мир 19 ноября 2020 года в 19:13, 26 секунд и 874 миллисекунд, сид
может выглядеть так — 19112020191326874. Но обычно, конечно, за основу берутся значения намного сложнее.

Линейный конгруэнтный метод — один из самых простых ГПСЧ

Главное свойство сидов — это воспроизводимость. Если раз за разом использовать одно и то же зерно в
генераторе мира, результат будет одним и тем же. Это помогает разработчикам экономить ресурсы — чтобы
загрузить сохранение, игре достаточно помнить зерно уровня и все изменения, которые игрок совершил в
созданном мире. Иначе говоря, загружаемый уровень каждый раз как бы создаётся заново.

Как это работает


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

В первом случае процедурный генератор работает как своего рода конструктор — собирает уровень из уже
созданных вручную элементов. Например, классический «рогалик» Binding of Isaac, где данжи хоть и случайные,
но по сути состоят из заранее заготовленных комнат. Единственное, что меняется — проходы к ним, а также
запрятанный лут и расстановка противников.

Генератор в Binding of Isaac работает так. Создаётся комната, в которой может быть как минимум одна дверь и как
максимум — четыре. Там, где проход всё же есть, создаётся ещё одна комната по тому же принципу. В какой-то
момент комнат в подземелье становится достаточно много — и на краях «коридоров» генерируются тупиковые
помещения. Как правило, в них находятся боссы или хороший лут.

В Binding of Isaac тоже есть сиды, значения которых можно ввести при генерации мира. Если два игрока введут
один и тот же сид, они получат абсолютно идентичные подземелья.

То есть, в играх в духе Binding of Isaac мир в самом деле создаётся из заранее готовых элементов. Но как в таком
случае устроен процедурный генератор, например, в Minecraft? Здесь мы переходим ко второму подходу
создания уровней.

Создатель игры Маркус Перссон взял за основу шум Перлина — математический алгоритм, который генерирует
текстуру псевдослучайным методом. То, что получается в итоге, выглядит как-то так.
На первый взгляд может показаться, что это текстура от облаков или, например, дыма. Действительно, шум
Перлина часто применяется в компьютерной графике при генерации спецэффектов для повышения
реалистичности.

В Minecraft же шум Перлина — это, по сути, карта высот. Чем светлее пиксель, тем выше находится отдельно
взятый блок. Иначе говоря, белые пятна — это горы, серые — равнины, а чёрные — низины.

Трёхмерное представление шума Перлина в Roblox


Шум Перлина может применяться и в 2D-играх. Для этого достаточно взять двухмерный срез карты.

Чтобы разнообразить ландшафт, разработчики создают октавы — то есть, накладывают разные вариации карт
шумов друг на друга, чтобы их амплитуда как бы усреднилась между собой.

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

В No Man’s Sky мы генерируем столько слоёв шума... Один лежит на другом, каждый следующий
исходит из предыдущего, и так далее и тому подобное.

Шон Мюррей
создатель No Man’s Sky
Шум Перлина уникален тем, что ни одна из карта шумов, созданная алгоритмов, не похожа на предыдущую.

Изначально шум Перлина создали для компьютерных спецэффектов в фильме «Трон» 1982 года

Карты шумов отвечают не только за ландшафт карты. При создании сетей извилистых пещер используется Ridged
multifractal noise — или ребристый мультифрактальный шум. В двухмерных «выживалках» он выглядит примерно
так.

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

В трёхмерных играх вроде Minecraft пещеры создаются точно таким же образом, но для этого используется не
одна карта шумов, а сразу несколько — в разных плоскостях. Там, где линии накладываются друг на друга,
образуются трёхмерные пустые пространства.
После того, как основа для уровня сгенерирована, набор специфических алгоритмов и шаблонов случайным
образом раскидывает по миру объекты — деревья, крепости, данжи, места спауна мобов. К примеру, игра
определяет, что уровень моря не может подняться выше 63 блока по вертикали. А деревья могут заспауниться
только на поверхности, но никак не в пещере или под водой.

Набор правил определяется в том числе и биомом, в котором размещаются объекты — будь то леса или пустыни,
тундра или болота. К примеру, берёзы никогда не появятся в саванне, а в пустыне не пойдёт дождь. Октавы в
каждом из биомов тоже разные — поэтому в горах амплитуда перепада высот намного выше, чем в равнине.
В No Man’s Sky процедурный генератор устроен ещё сложнее — местные миры состоят не из блоков, а вокселей.
Поначалу шум Перлина создавал недостаточно реалистичные планеты — для того, чтобы они казались
натуральными, не хватало эффектов вроде эрозии ландшафта. И чтобы добиться его, разработчикам пришлось
прямо-таки извернуться.

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

В итоге в Hello Games взяли производную с шума Перлина, которая позволила увидеть изменения в ландшафте
ещё до непосредственной генерации планеты. Теперь разработчики знали, где находится воксель, будь то склон
или равнина, — и благодаря этому они смогли детально настроить отдельные типы поверхностей.
На изображениях ниже хорошо видна разница «оригинальный» шум Перлина и тот, к которому применили
производную. Это не карта из No Man’s Sky, а просто наглядный пример.

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

Вот так выглядит стандартный шум Перлина.


Вот так — после первой деформации.

И вот так — после второй.

Процедурная генерация в других жанрах


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

Так, например, XCOM 2 — это пошаговая стратегия, но уровни в нём создаются вполне себе по принципу
«рогаликов». О том, как в нём работает процедурный генератор, разработчики рассказывали на конференции
GDC в 2018 году.

Там в основе генерации лежит так называемый plot — «сюжет» или «чертёж». Это, по сути, заранее заготовленный
шаблон, который определяет сеттинг карты — городской центр, природа, пригороды, посёлки отшельников или
же инопланетные сооружения.

«Чертёж» городского центра

Внутри «чертежей» расположены «участки земли» (parcels) — области, в которых генерируются различные
объекты и здания. Здесь авторы XCOM совместили и процедурную генерацию, и ручную работу: здания могут как
создаваться автоматически на основе библиотеки ассетов, так и подгружаться уже в готовом виде из файлов
игры.
При этом планировка улиц ещё и подчиняется некоторым правилам, заложенным в генератор карт. Так,
например, в «чертеже» пригорода жилые дома расположены по краям уровня, в то время как магазины и кафе —
в центре. А главный вход у торговых центров находится со стороны улицы, а не переулка.

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

К примеру, генератор карт постоянно менял расположение домов — вращал их по оси и перекидывал с одной
улицы на другую. Более того, разработчики предусмотрели так называемые «чертёжные участки» (plot covered
parcels, или PCP) — районы карты, которые не были зданиями и отдельно прорабатывались художниками.

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

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

Брайан Хесс
Б
ведущий левелдизайнер Firaxis

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

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

Нравится (47) В избранное (25)

Поделиться:

3 комментария Сначала популярные

Войти Войди, чтобы оставить комментарий

TownForces
T
Скоро игру Майнкрафт улучшать строение гор, то есть шум Перлина будут использовать лучше. Чтобы горы появлялись реалистично, а не
как в фантастиках, то есть не будут летающих строений, будут горы лучше выглядят чем раньше и с пещерами тоже самое. Пещеры станут
больше и будут подводные реки и т.д.

1 26 ноября 2020

Pushkan
Хотелось бы больше информации про деформацию шума Перлина. Как именно достигают такого результата?

0 11 ноября 2020

dnnkeeper
d
Pushkan, если мы используем просто функцию Random для каждого пикселя, то получится шум, напоминающий помехи на
экране телевизора. Его не получится никак интерпретировать для создания реалистичного ландшафта. Шум Перлина же решает
эту проблему, генерируя такой шум, что в нем появляются плавные переходы значений - градиенты. Это достигается за счёт того,
что каждое значение зависит от предыдущего (или соседних). Возникают мягкие пятна, сливающиеся в случайный узор.
Складывая несколько слоёв такого шума на разных масштабах можно получить реалистичный образ, напоминающий облака или
подводный ландшафт, поскольку в реальности грунт под водой также формируется, оседая слоями под действием различных
хаотичных природных сил разного масштаба.

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

Поэтому "Волшебная" функция из No Man's Sky которая упоминается в статье, как раз пытается создавать иллюзию действия
эрозии на ландшафт (но получается это посредственно, хоть и лучше чем ничего).

2 20 ноября 2020

Еще статьи Подписка


Твой E-mail
Olga Yakovleva Геймдизайн

Разбор: 15 характеристик melee-противников Подписаться

На примере первого драугра из God of War.


Отборный контент без спама и воды
Эксклюзивные скидки на курсы

19 1 25 февраля в 15:28

Новое
Мария Гёрке Геймдизайн

Гайд: как и зачем деконструировать механики из чужих игр Ева Никитина

Геймдизайнерам часто приходится изучать игры конкурентов, чтобы находить Учимся на ошибках геймдизайна: Little
удачные решения для собственных проектов и избегать распространённых ошибок. Nightmares 2
0 0 Сегодня в 0:03

19 0 8 февраля в 17:10 Olga Yakovleva

Разбор: 15 характеристик melee-


противников
Olga Yakovleva Геймдизайн
19 1 25 февраля в 15:28

Гайд: как создать UI/UX

На конференции Games Gathering выступил UI/UX дизайнер Слава Леонов (Murka, A Andrew Rain
BetterMe). Он занимается дизайном уже семнадцать лет, в том числе проектирует и
Как применяется музыка в Left 4 Dead?
игры. Слава рассказал, как правильно организ…
2 1 18 февраля в 16:17

26 0 27 января в 15:38
Olga Yakovleva

Как в Amanita Design создавали Creaks


Юрий Кулагин Геймдизайн 3 0 11 февраля в 20:20

Коллекционные предметы в играх: как вас заставляют


собирать всякую фигню Мария Гёрке
Почему надпись «найдено 99 из 100» так раздражает. Гайд: как и зачем деконструировать
механики из чужих игр
19 0 8 февраля в 17:10

24 1 29 января в 16:41

Olga Yakovleva

Как стимулировать воображение — семь


Валентин Шакун Геймдизайн
методов генерации идей
Как и зачем злить игрока — намеренная фрустрация в 25 1 2 февраля в 17:27
геймдизайне

Разбираемся в том, как использовать негативные эмоции при разработке.


Валентин Шакун

Как и зачем злить игрока — намеренная


фрустрация в геймдизайне
20 2 1 февраля в 20:26
20 2 1 февраля в 20:26

Olga Yakovleva
Captain Grimm Геймдизайн

Гайд: Процедурное создание бесшовного


Как работают "уютные" игры, и что это вообще такое?
города на примере Townscaper
Стоит сказать, что "уютные игры" это не какой-то отдельный жанр, это скорее
20 0 29 января в 16:03
эстетика, которая присутствует в таких играх, как например Animal Crossing или
Stardew Valley. Она очень редко где-то обсужд…

Юрий Кулагин

Коллекционные предметы в играх: как


76 10 3 декабря 2020
вас заставляют собирать всякую фигню
24 1 29 января в 16:41

Overwolf Геймдизайн

Создание автомобилей без нарушения АП. Способы и примеры Olga Yakovleva

Гайд: как создать UI/UX


Доброго времени суток читателям блога media-xyz.com. Сегодняшнюю статью я бы
хотел посвятить весьма интересному, но при этом частому инструменту 26 0 27 января в 15:38

геймдизайна. Да, речь пойдёт о автомобилях в играх. Вед…

Иван Косолапов

29 3 18 января в 03:16 Космические симуляторы — как они


появились и чем привлекают
13 0 23 января в 01:20
Olga Yakovleva Геймдизайн

Гайд: Процедурное создание бесшовного города на примере


Overwolf
Townscaper
Создание автомобилей без нарушения
Автор проекта — о том, как одним движением руки (буквально) создать уникальные АП. Способы и примеры
здания.
29 3 18 января в 03:16

20 0 29 января в 16:03 Больше нового


Мария Гёрке Геймдизайн

Невозможные пространства: как игры используют


неевклидову геометрию

Фракталы, искривление пространства, бесконечные лестницы и многое другое.

50 3 16 ноября 2020

Olga Yakovleva Геймдизайн

Как стимулировать воображение — семь методов генерации


идей

Советы о том, как быстро искать интересные решения, разнообразить игровые


механики и научиться проверять идеи на прочность.

25 1 2 февраля в 17:27

Показать еще

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

Написать

Геймдизайн hello@media-xyz.com
Кино

Арт

Игры

Разработка

Дизайн уровней
Обо всём

Вам также может понравиться