Алгоритмы генерации городов


8

В этом посте RPG.SE упоминается давно потерянная страница с несколькими онлайн-генераторами.

Мне особенно любопытно, как возникли города. Возьмите это изображение, например:

Город PCG от несуществующей Игры Иронии

Хотя многое можно улучшить с точки зрения графики, это было очень хорошо, если учитывать инструменты, доступные в то время (с середины до конца 90-х):

  • Схема дороги выглядит довольно органично (даже если учесть, что все дороги расположены ортогонально).
  • Не все дороги обязательно связаны, но это кажется правильным .
  • Здания размещены в правдоподобных местах.
  • Даже деревья, кажется, расположены в логических точках .

Думаю, было бы интересно попробовать и попробовать самому. Тем более что мои предыдущие попытки были слишком "блочными":

Моя последняя попытка поколения города

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

Есть ли проверенные алгоритмы для генерации городов?

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

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

То, что я хотел бы иметь, является чем-то менее ограниченным. За исключением, может быть, компоновки сетки, которая с первой попытки должна быть намного проще, чем, скажем, L-система.


Перечисление алгоритмов для широкой проблемной области обычно оказывается слишком широким, чтобы отвечать в нашем формате вопросов и ответов. Как правило, нам больше повезло с тем, «Как я могу генерировать игровой контент с этими конкретными характеристиками » - где вы предоставляете ряд критериев или положительных / отрицательных примеров, которые мы можем использовать для оценки потенциальных ответов и оценки наилучшего предложения. Можете ли вы попробовать отредактировать свой вопрос, чтобы объяснить более подробно, что делает подходящую продукцию города менее подходящей?
DMGregory

слишком широкие, тем более что такие генераторы, скорее всего, являются составными (например, на этапе 1 создаются дороги, на этапе 2 создаются дома, на этапе 3 создаются деревья). Если вы можете сузить круг вопросов до конкретного генератора, и какие конкретные проблемы у вас с этим, это было бы менее широким.
congusbongus

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

1
Здесь нет хорошего ответа, но я замечаю одну вещь: в хорошем примере каждое здание находится рядом с дорогой, а в вашем примере - нет.
user1118321

@ user1118321: На самом деле дома не всегда находятся рядом с дорогой, но либо участки есть (современный подход), либо, по крайней мере, есть путь к следующей дороге (возможно, старый подход, а не дом на заднем дворе). Так что места не так уж и противоестественны, как, например, рынки.
PSquall

Ответы:


9

Introversion Software сделали действительно впечатляющий городской генератор для своего отмененного на неопределенный срок проекта Subversion :

Subversion City Generator

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

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

Алгоритм работает следующим образом (слегка упрощенно):

  1. Центры городов: выберите некоторые точки на все еще пустой карте в качестве основных транспортных узлов. Они должны быть равномерно распределены по карте
  2. Шоссе: соедините основные узлы движения с соседями и с внешним миром, используя основные дороги.
  3. Автострады: Разделите ячейки, генерируемые основными дорогами, создав несколько второстепенных дорог.
  4. Улицы: рекурсивно повторяйте процесс деления на все меньшие и меньшие дороги, пока не достигнете желаемого размера строительных блоков
  5. Блоки: Определите назначение каждого строительного блока (жилого, торгового, корпоративного, промышленного ...). Соответствующими факторами являются размеры соседних дорог и расстояние от центра.
  6. Выделения: разделите края всех строительных блоков на участки (это означает, что у каждого участка есть хотя бы один край, связанный с дорогой).
  7. Здания: Создать подходящее здание для каждой партии.

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

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

Я с нетерпением жду знакомства с процедурно созданными городами в вашей игре.


Я совершенно забыл упомянуть улицы разных размеров, хорошая мысль!
Uliwitness

Спасибо! Не уверен, что я попробую сверху вниз или снизу вверх ... но, понимая, что у меня есть два варианта, мой мозг снова заработал. ;)
Roflo

5

Получить ограничения из реальной жизни

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

  • Есть дороги, чтобы соединить здания и другие достопримечательности
  • Здания размещаются вдоль существующих дорог, если это возможно
  • Если дороги нет, здание помещается в пустое место и соединяется с соседней дорогой через собственную дорогу.
  • Здания размещаются рядом с другими зданиями, которые представляют интерес для их жителей: люди переезжают жить на свои рабочие места, в магазины продуктов питания и одежды и т. Д.
  • Здания размещаются рядом с ресурсами, необходимыми для их предполагаемого использования. Например, лесопилка находится рядом с лесами или даже на лесной поляне. людям нужна вода и еда (растения, животные), чтобы где-то жить.
  • Здания размещаются вдали от других зданий, которые наносят ущерб их предполагаемому использованию или могут нанести им ущерб. Например, магазин красок пахнет ужасно, поэтому обычно не находится в жилом районе. Точно так же таверны и рестораны очень шумные, поэтому жители не хотят жить на них, а нуждаются в покупателях, поэтому должны быть рядом с жилыми районами.
  • В некоторых странах действуют законы о зонировании, которые также влияют на размещение зданий. Обычно это более формализованный способ предвидеть, какие типы зданий могут быть вредными друг для друга, или какие ресурсы являются уникальными для данного района (например, высококачественная почва предназначена для полей, а не для строительства парковок на них).
  • Здания предназначены для жителей, в них отражается их личный стиль и предпочтения. Например, если население бедное, они гораздо чаще разделяют землю (небоскребы, жилые дома), если они более обеспечены, они могут получить презервативы, если они богаты, они получат отдельную виллу. Если определенным группам не нравятся другие группы, они будут менее склонны к совместному проживанию. Если есть сходство между определенными группами, они могут перемещаться в аналогичные области.

Примените их к вашей топографии

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

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

Чтобы решить, что и куда делится, разбейте карту на плитки, где вы рассчитываете число для каждой плитки, насколько это желательно для определенной цели, используя весовую функцию. Поместите здания в наиболее желательные плитки для этого типа здания. Добавьте правила типа «один торговый пост может обрабатывать 50 предприятий или 100 домов», что увеличивает вероятность добавления другого торгового поста, если город достигает определенного размера.

Получив это, вы должны получить несколько приличных карт. Если вы заметили, что все карты заканчиваются как неестественные фигуры, добавьте штрафы к своим весовым функциям для этих фигур, например, «если моя улица заканчивается рядом с другой улицей, -100 желательность» или «если моя улица пересекает себя, -100 желательность "и т. д. Вы всегда можете добавить случайный элемент, чтобы придать этому более причудливый вид, или добавить другую механику, например," если к перекрестку подключено более N зданий, то превратите его в перекресток с круговым движением ".

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

Упростить

Конечно, этот подход слишком сложен для игр, которые не являются торговыми симуляторами, но в любом случае решите эту проблему и посмотрите, какие типы зданий имеют смысл для вашей игры, и исключите ненужные. Затем придумайте упрощенные правила, такие как «размещать города рядом с рекой, горой или хорошей почвой. 1 здание на 100 ресурсов, предприятия на основе типа ресурса, 10 жилых зданий на каждый полный набор продуктов питания / крафта ... или просто» 1 м реки / 1 м 2 почвы может поддерживать 10 жилых зданий ... все, что имеет смысл для игры. Тем не менее, как только вы узнаете, сколько у вас территории (например, нет зданий на крутых склонах гор) и сколько зданий эта территория может поддерживать, просто разместите наборы зданий в этой области, пока она не заполнится (например, 1 бизнес-здание, 10 жилых домов , 3 инфраструктуры, или что угодно) и соединить их с дорогами


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

Да. Также многое зависит от типа игры и желаемого расположения города. Снизу вверх лучше подходит для небольших городов средневекового стиля, выращенных естественным путем, а сверху вниз для городов и мегаполисов в стиле США. Точно так же, если у вас есть игра, которая включает в себя функциональные здания и управление ресурсами, восходящий может дать вам более полный контроль, тогда как нисходящий - это лучшая оптимизация для городов в гоночных играх и т. Д., Где вы действительно не заботитесь о функции зданий. ,
Uliwitness

Спасибо за ответ. Have you looked into that?Я имею. Ну, вроде (я не мог придумать много «реальных правил»). Но это довольно откровенно по сравнению с моими предыдущими попытками: я не смог распознать ресурсы, которые я не мог бы привлечь (то есть: есть лес на востоке ... независимо от того, рисую я его или нет).
Roflo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.