Как настроить генерацию мира

Создание генератора мира для minecraft

Введение

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

Немного технической части
Выбор языка

Реализовать такую структуру можно на любом языке, я остановился Delphi 7. Во-первых, это пока единственный язык, который я знаю, во-вторых, именно на 7 версии года 4 назад я начинал писать блокноты по мануалам из Игромании.

Так как данные хранятся в сжатом виде, нам необходим модуль zlib.
Я использовал ZlibEx

Для начала создадим класс чанка, в который будем впоследствии писать данные

Код этого класса:

Функция getoffset выдает нужое смещение по формуле y + ( z *128 + ( x * 128 * 16 ) )

Добавим в var пару переменных:

Процедура для сборки всех чанков в готовый файл:

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

Обертка для writeblock:

Генерация мира, его сжатие и сохранение.

Результат:

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

Источник

[Гайд] Расширенная генерация мира в Minecraft 1.8

Итак, в Minecraft 1.8 (Снапшоты) был добавлен расширенный генератор мира. Включить его можно, выбрав в качестве типа мира «Customized«. Настройки генератора разделены на 3 блока. Для перехода между блоками используйте кнопки «Previous Page» (Назад) и «Next Page» (Вперёд)

Основные настройки (Basic Settings)
Sea Level — Уровень моря (По умолчанию: 63)
Strongholds — Крепости (По умолчанию: Включено)
Mineshafts — Заброшенные шахты (По умолчанию: Включено)
Ravines — Овраги (По умолчанию: Включено)
Dungeon Count — Количество подземелий (По умолчанию: 7)
Water Lake Rarity — Редкость озёр (По умолчанию: 4)
Water Lake Rarity — Редкость лавовых озёр (По умолчанию: 80)
Biome — Биом, который будет во всём мире (По умолчанию: Все)
River Size — Размер рек (По умолчанию: 4)
Caves — Пещеры (По умолчанию: Включено)
Villages — Деревни (По умолчанию: Включено)
Temples — Храмы (По умолчанию: Включено)
Dungeons — Подземелья (По умолчанию: Включено)
Water Lakes — Озёра (По умолчанию: Включено)
Lava Lakes — Лавовые озёра (По умолчанию: Включено)
Lava Oceans — Лавовые океаны (По умолчанию: Выключено)
Biome Size — Размер биомов (По умолчанию: 4)

Настройки руд (Ore Settings)
Spawn Size — Количество руды в одной жиле (По умолчанию: 33)
Min. Height — Минимальная высота (С какого блока распространяется?) (По умолчанию: 0)
Spawn Tries — Количество руды (Как часто будет встречаться руда?) (По умолчанию: 10)
Max. Height — Максимальная высота (До какого блока распространяется?) (По умолчанию: 256)

Расширенные настройки (Advanced Settings)
Советую не настраивать данные параметры. Неверная их настройка может повлечь за собой ужасные последствия для Вашего мира.

Источник

Как генерируются миры — описание подходов для создания процедурных локаций в играх Статьи редакции

Краткое знакомство с алгоритмом планирования, а также с симуляционным и функциональным подходами.

Инди-разработчик Руне Сковбо Йохансен в 2015 году опубликовал в своём блоге подробное описание разных подходов к процедурной генерации окружения в играх. Автор рассказал, чем друг от друга отличаются симуляционный и функциональный подходы, а также алгоритм планирования. Мы выбрали из текста главное.

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

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

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

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

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

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

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

Читайте также:  Как отремонтировать боковину дивана

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

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

В Minecraft, например, рельеф вычисляется при помощи функционального метода. А освещение затем симулируется в соответствии с имеющейся контекстной информацией о геометрии мира.

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

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

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

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

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

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

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

И только доминирующий подход должен влиять на игровой процесс и определять, как пользователь передвигается по пространству и достигает целей.

Источник

Как генерируется мир в Minecraft

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

В начале я расскажу о некоторых интересностях генерации игрового мира, чем вызваны и как связаны, а потом опишу непосредственно принцип генерации.

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

Интересности

Начнем пожалуй с того, что количество вариаций игрового мира не бесконечно, всего 281 триллион вариантов, 281 триллион возможных » seed ов», которые можно указать при генерации карты.

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

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

Сам мир тоже не бесконечен, технически. Если вы потратите 2 года реального времени и добежите до координат более 15 миллионов блоков от центра (но все предпочитают телепортироваться), то наткнетесь на так называемые «Далекие земли» :

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

Непосредственно генерация

Начать стоит с того, что мир генерируется не по блоку, существуют так называемые чанки площадью 16 на 16 блоков площади и 256 блоков в высоту, вот как они выглядят :

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

Сама геометрия генерируется с помощью шума Перлина . Крайне занятная вещь, которую в майнкрафте применили почти везде. Шум Перлина представляет из себя процедурно-генерируемую псевдо-рандомную черно-белую текстуру :

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

Можно использовать получившуюся текстуру для генерации высот карты, здесь можно уловить связь — самый черный цвет имеет значение 255 в палитре, напомнить высоту игрового мира? 256! Однако алгоритм оптимизирован и не позволит сгенерированной горе вырасти так высоко.

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

Программисты любят баловаться с шумом Перлина, я говорил о карте высот, взгляньте :

Изначально шум получается уж очень резким и карта может выглядеть вот так :

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

Читайте также:  Gta vice city не работает управление мышью

Можно всё же не усреднять, а объединять. Спавним деревенщину шумом Перлина — многовато в одном месте? Стянуть всех сюда и воткнуть город.
Это будет не сглаживание, а наоборот, группировка или уплотнение.
Так же можно нарастить лес.

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

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В играх зачастую используется не рандом, а псевдорандом

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

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

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

Однако, отсюда вытекает иная проблема: как тестировать поведение программы, основанное на полностью непредсказуемом поведении? Ответ: никак.

Алсо: еще на первом курсе универа нам рассказывали о том, что полностью случайная генерация чисел будет возможна при появлении квантовых компьютеров, а любые махинации на текущем этапе технологического прогресса так или иначе работают по принципу ГПСЧ. И чем сложнее воспроизвести этапы генерации, тем интереснее он будет для Криптографии, т.к. принципы шифрования/дешифрования как раз опираются на ГПСЧ

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

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

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

Читайте также:  Графический планшет wacom как настроить перо графического планшета

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

Собственно, про это Церни и говорил про PS5, что будет подстраивать температуру, чтобы у всех была одинаковая производительность, и следовательно и детерминированность.

Оно зависит от температуры и других факторов не потому что берут таймер, а потому что реально кроме таймера используют другие источники, и хитро замешивают.
Там есть специальные элементы, на особенности работы которых влияет тепловое движение молекул.
https://ru.wikipedia.org/wiki/RdRand
В приставках и некоторых процессорах реально брали просто время и это можно было соответсвенно подделывать. В приставках умельцы даже воспроизводили игровые особенности, вовремя стартуя игру. И вроде как для этого просили рисовать мышкой на площадках — типа ты становишься источником энтропии и это тяжелее подделать. ред.

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

Комментарий удален по просьбе пользователя ред.

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

Комментарий удален по просьбе пользователя

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

А вот изменения этих миров вполне себе будут.

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

Площадь Земли, занятая городами, составляет около 30*10^9 квадратных метров. Если каждый кв.метр записать в 16-битном представлении, то получим около 57гб данных. Если заполнить эту площадь 40 метровыми строениями, то 2.2тб. Добавим процедурный мир окружающей среды для наполнения промежуточных областей (океаны, горы, пустыни), и получим практически реальную Землю в цифровом представлении.
3тб очень даже недорого можно сохранить на игровом сервере, и это без учёта компрессии. ред.

Вы каждый квадратный метр решили двумя символами описывать?

16 битным числом же, как обычно это делают в генераторах поля по которым строится изоповерхность алгоритмами marching cubes.
http://vcg.informatik.uni-rostock.de/

Статья хорошая, но читается как 1/100 от полноценной, хочется больше.

А что конкретно хочется?

Сгенерировать что-то шумом много ума не надо.
А вот сделать так, чтобы, например, сгенрированные пещеры ВСЕГДА были проходимым (имели как минимум 1 вход, 1 выход и не имели изолированных зон) вот тут начинается веселье. То же самое с ландшафтом. А если надо, чтобы это еще и интересно получалось, ууу.

Самое сложное в процедурной генерации — это правила, которые накладываются поверх. ред.

Вам в дварф фортресс.

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

Потому что там поверх рандомной симуляции натягивают 250 лет существования государсв людей, эльфов гоблинов и дворфов .

Так и как это противоречит моему первому сообщению?

Никак 🙂 я просто решилконкретно указать на какой пример нужно смотреть

Комментарий удален по просьбе пользователя

В статье с виду серьезные проблемы — почему то противопоставляются процедурная генерация и псевдослучайная генерация и примеры, соответственно, фейловые.
Хотя принципы рассказаны неплохо и понимание дают.
Псевдослучайная генерация используется повсеместно, собственно любые «случайные» числа на компьютере — обычно взяты из псевдослучайного ряда со случайным сдвигом.
Иногда ее используют как генератор случайных чисел и это нам не интересно.
Но часто используется как раз это свойство — воспроизводимость. Алгоритм дает нам последовательность, которая выглядит случайно, но при этом ее можно воспроизвести столько раз, сколько нужно.
Это позволяет получать очень стабильные результаты простыми методами — сохранив один сид, можно сколько угодно создавать из него вселенную с миллионом звезд.
Соответственно в сейве нужно будет хранить только сид (ну и алгоритм хранится в коде)
Процедурная генерация — это самые различные алгоритмы, используемые для автоматического построения игровых сущностей. Сюда входят и алгоритмы расстановки элементов и генерации поверностей на основе ГПСЧ, и всякие правила и шаблоны.
Соответственно в приведенных в статье примерах в The Binding of the Isaac используется процедурная генерация, которая расставляет шаблонные уровни на основе ГПСЧ, сохраняя seed — за счет этого сгенерированные уровни можно снова и снова создавать и они будут одинаковыми.
То же самое генерация поверхностей на основе шумов — это алгоритм процедурной генерации, но при этом сами шумы получают из случайных чисел.
Зачастую с практической точки зрения для процедурной генерации не важно, что она использует псевдослучайный алгоритм — для нее он случайный. Так как задача воспроизведения не стоит — сид берется случайный и после генерации никто его не сохраняет.
Получается, что ГПСЧ — это набор алгоритмов с интересными свойствами, используемых для симуляции случайности.
А процедурная генерация — это класс алгоритмов, используемых для автоматического создания уровней. В них в том числе входят ГПСЧ.

Источник

Оцените статью