Псевдослучайные миры: как создаются локации с помощью процедурной генерации и ГПСЧ

Краткое описание применимости в левелдизайне.

Автор YouTube-канала DigiDigger опубликовал познавательное видео о разнице между генераторами случайных чисел и процедурной генерацией. Он объяснил, на каких принципах строится каждый подход, а также рассказал, как всё это применяется при создании игр. Мы выбрали из видео главное.

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

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

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

Конечно, в реальности используются более сложные формулы, которые позволяют получить более непредсказуемые результаты. Но в основе принцип сводится именно к этому
Конечно, в реальности используются более сложные формулы, которые позволяют получить более непредсказуемые результаты. Но в основе принцип сводится именно к этому

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

Генератор псевдослучайных чисел используется, например, в The Binding of Isaac. Разработчики изначально создали игровые комнаты и весь необходимый контент, а игра самостоятельно расставляет их в случайном порядке.

Примерно так выглядит рандомно сгенерированная карта в The Binding of Isaac. Также по комнатам случайно распределяются полезные предметы
Примерно так выглядит рандомно сгенерированная карта в The Binding of Isaac. Также по комнатам случайно распределяются полезные предметы

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

Процедурная генерация устроена иначе: она применяется в том случае, если нужно создать контент с нуля. При этом важное значение имеют карты шума. Для примера возьмём генерацию уровней в Terraria.

Всё начинается с определения линии горизонта.

Белые пиксели — твёрдая поверхность, чёрные — пустота
Белые пиксели — твёрдая поверхность, чёрные — пустота

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

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

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

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

Подойдёт нечто такое
Подойдёт нечто такое
Можно настроить ширину проходов так, чтобы создать интересную систему подземелий
Можно настроить ширину проходов так, чтобы создать интересную систему подземелий

Этот же подход работает ещё и в 3D-окружении. Например, карту шума можно использовать для определения высоты ландшафта.

На светлых участках горы выше, на тёмных — ландшафт ниже
На светлых участках горы выше, на тёмных — ландшафт ниже
Далее на ландшафте можно воссоздать разные условия — низкие участки покрыты водой, а вершины гор — снегом
Далее на ландшафте можно воссоздать разные условия — низкие участки покрыты водой, а вершины гор — снегом

Для создания системы пещер в 3D можно использовать сразу две карты шума. Тогда в месте пересечения оттенков разного тона появятся пустоты.

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

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

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

6060
28 комментариев

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

15
Ответить

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

Ответить

Ну мне кажется, это не основная проблема статьи.
Понятно, что все алгоритмы так или иначе псевдослучайные с большим периодом.
Но с практической точки зрения их используют как случайные - инициализируют чем нибудь случайным и потом не ожидают, что они будут повторяться.
В то время как для некоторых целей, принципиально используют псевдослучайные ровно для воспроизводимости генерации. Иногда даже пишут специальные - например иерархические, или применяют алгоритмы, которые не требуют предвычислений (то есть если в ЛК алгоритме для нахождения 1001 числа нужно найти 1000 предыдущих, то в таких можно найти сразу 1001 - это удобно, если ты хочешь сгенерировать кусок вселенной с 93 по 101 км, не генерируя остальную вселенную)

Ответить

Комментарий недоступен

6
Ответить

обычно когда непонятно объясняют, это значит сами не понимают
зато, поумничали

Ответить

 При этом всё это будет появляться по ходу прохождения и не будет занимать лишнее место на жёстком диске.А вот изменения этих миров вполне себе будут.

Жаль и слова нет про новомодный WFC.

3
Ответить