Мне нравится способ, которым Age of Empires II генерирует случайные карты (хорошее разнообразие, приличные биомные переходы, карты чувствуются случайными, не чувствуя себя хаотично), но я изо всех сил пытаюсь воспроизвести стиль. Я пытался использовать, например, шум Перлина, но все получается либо слишком однородным, либо, если нет, значение Perlin -> эвристика ландшафта слишком чувствительна и хрупка, чтобы создать множество типов мира.
Я помню, что на карте AoE2 типа «Неизвестно» рекламировалось «100 000 возможных карт», предлагая использовать некоторые номера семян, но я не уверен, как использовать номера семян для получения сорта, который я видел.
Какие алгоритмы и эвристики я могу использовать для создания случайных карт, которые напоминают случайные карты AoE2?
Изменить, чтобы быть более конкретным:
Думая дальше о моей проблеме и изучая то, что мне нравится в механизме случайных карт AoE2, я считаю, что моей самой большой проблемой является управление распределением воды и жизни растений на карте . Теперь я вижу, что я также связал это с «переходами биома, которые имеют смысл», но это другая проблема (хотя я ожидаю, что мое дальнейшее использование шума Перлина будет сложно решить).
Я добавил несколько случайных карт AoE2, которые подчеркивают то, что мне нравится в их картографическом движке, который мои собственные усилия не воспроизводят. Все скриншоты взяты со случайного типа карты «Пользовательский» -> «Неизвестный». Я не поручил игре использовать определенные географические области, такие как архипелаги.
Ниже приведены изображения из моего собственного картографического движка. Каждый пиксель соответствует одному фрагменту карты AoE2.
Одним из осложнений для моего проекта является то, что я хочу, чтобы карты были во много, много раз больше, чем карты AoE2. Таким образом, какой бы движок я ни использовал, он должен иметь возможность создавать полный спектр биомов на каждой карте, а не один узкий набор биомов на карту, как использует AoE2.
Эпоха империй II карты
Вот пример, который показывает внутренние озера и некоторые вещи вида реки. Мне нравится, как карта включает в себя большое количество разбросанной воды, но эта вода все еще в некоторой степени сконцентрирована - есть большие участки земли, которые доступны для строительства вашей империи. Вам не нужно тратить всю игру на планирование своего города вокруг воды.
Вот аналогичный пример, где игра была достаточно умной, чтобы соединить острова с проходимыми болотами. Я не могу себе представить, как алгоритм на основе шума может создать болото там, и только в тех местах. Кроме того, обратите внимание, как игра создала землю так, что у каждого игрока есть свой собственный большой участок земли, с которого можно начать. Это не создавало случайных участков земли, а затем делалось предположение, какой из них будет наименее ужасным для каждого игрока.
Мне нравится, что эта карта также интенсивно использует воду, но не включает много внутренних озер. Сравните это с первым изображением. Мне нравится, как AoE2 создает совершенно разные географии, используя одни и те же строительные блоки. Моя попытка использовать шум Перлина здесь потерпела неудачу - я либо получаю огромные раскидистые океаны, которые затмевают сушу, либо Землю из 10 000 озер. Мне также было трудно найти и острова, и соединенные континенты (вспомним Северную и Южную Америку).
Сравните это изображение с изображением над ним. Они показывают, что засушливость карты не зависит от уровня воды. Первое изображение показывает карту, которая почти лишена воды, но содержит леса и траву. Второе изображение имеет умеренное количество воды, но все же пустыня. Мне нравится, что это возможно (подумайте, есть ли в вашем мире и Нью-Мексико, и Сахара, и Коста-Рика).
Мои собственные карты
Я читал во многих местах, что хороший способ создания карт - это наложение нескольких уровней шума Перлина, каждый из которых представляет разные измерения данных. Следуя популярным рекомендациям, я пошел по высоте и влажности, выбирая типы местности из таблицы Уиттекера здесь .
Я взял две карты perlin, квантовал значения каждого из них в целые числа с помощью простых if perlin_val < x { i=some_int } else if perlin_val < y...
, а затем отобразил пары целых чисел (высота, влажность) в таблицу типов местности (например, [1,0] -> тропическая пустыня, [1,1 ] -> пастбища). Океаны были включены в эту систему - высота = 0 определяется океаном.
Есть хорошие вариации, и во многих отношениях это похоже на реальный мир, но есть несколько проблем:
Во-первых, нет никакой картины глубин океана. Вы ожидаете, что мелкие воды у берега и глубокие воды дальше, нет никаких рифм или причин относительно того, где
Во-вторых, вся вода сосредоточена в океанах; здесь нет озер или рек, потому что шум Перлина не падает внезапно до более низкого значения в середине континента.
Создание баланса между количествами каждого биома очень и очень сложно. Я приписываю это:
Шум Перлина следует нормальному распределению, поэтому сложно оценить, как отрегулировать вероятность отображения каждого измерения
Попытка сбалансировать несколько измерений трудна - возможно, я хочу больше (2,3), поэтому я увеличил шансы на получение (n, 3). Ну, теперь у меня слишком много (3,3), и все выглядит неправильно.
Когда я приблизил шум достаточно близко, чтобы получить гладкие данные, я не получил очень полную выборку значений Perlin. Поэтому я настраивал свои распределения для карты передо мной, перезагружал новую случайную карту и получал очень разные результаты.
Я попытался решить проблему рек / озер, сделав воду из третьего набора значений Perlin. Бинарное решение вода / земля, затем примените все вышеупомянутые вещи к земле. Это значительно упрощает контроль распределения воды (все еще не идеально, но лучше), но создает проблему, заключающуюся в том, что существует множество переходов биома, которые не имеют смысла. Например, необъяснимые участки пустыни среди пышных лугов, снег на пляже и т. Д. Также по-прежнему сложно контролировать пропорции биомов суши по причинам, упомянутым выше.
Глядя на вышеупомянутые проблемы, я попробовал более простой алгоритм, который отображал шум Перлина только в одном измерении. Теперь у меня есть массив типов местности, растущих из 0 = глубокий океан -> 1 = мелкий океан -> 2 = пляж ... -> N = снег. В то время как это приводит к образованию островов и континентов и облегчает баланс пропорций каждого ландшафта, типы ландшафтов слишком сгруппированы. Каждая масса суши выглядит как карта высот, как правило, без типов местности, разбросанных по ее поверхности. Каждая масса суши имеет примерно одинаковые характеристики, всегда в одном и том же порядке и всегда в форме кольца.