Algoritmi di generazione di città


8

In questo post di RPG.SE viene menzionata una pagina persa da tempo con diversi generatori online.

Sono particolarmente curioso di sapere come sono state generate le città. Prendi questa immagine per esempio:

Una città PCG del defunto Irony Games

Sebbene molte cose possano essere migliorate dal punto di vista grafico, è stato molto buono considerando gli strumenti disponibili al momento (dalla metà alla fine degli anni '90):

  • Il layout della strada sembra abbastanza organico (anche considerando che tutte le strade sono disposte in modo ortogonale).
  • Non tutte le strade sono necessariamente collegate, ma sembra giusto .
  • Gli edifici sono collocati in punti credibili .
  • Perfino gli alberi sembrano essere collocati in punti logici .

Penso che sarebbe divertente provarlo e provarlo da solo. Soprattutto da quando i miei precedenti tentativi sono stati troppo "bloccati":

Il mio ultimo tentativo di generazione di città

Noterai che sto descrivendo molte delle qualità con aggettivi non abbastanza misurabili ( sembra , si sente , credibile , ecc.), Quindi ho difficoltà a tradurle in istruzioni e, infine, in un algoritmo.

Esistono algoritmi collaudati per la generazione di città?

Capisco che questo sembra essere troppo ampio, quindi considera questo: se avessi chiesto un algoritmo per la generazione di mappe delle masse terrestri continentali, avrei subito riferimenti a Perlin e ad altri algoritmi di rumore; seguito da vicino da Voronoi.

Ho visto domande come questa, ma sembra che abbiano già in mente un'idea più concreta (ad esempio: case 2x2, numero fisso di case, restrizioni sul canale e sul posizionamento delle strade).

Quello che mi piacerebbe avere è qualcosa di meno vincolato. Tranne forse per il layout della griglia, che dovrebbe essere molto più semplice per un primo tentativo rispetto, per esempio, al sistema L.


Gli algoritmi di quotazione per un vasto dominio problematico di solito finiscono troppo per rispondere bene nel nostro formato di domande e risposte. Generalmente abbiamo più fortuna con "Come posso generare contenuti di gioco con queste caratteristiche specifiche " - in cui fornisci una serie di criteri o esempi positivi / negativi che possiamo usare per valutare potenziali risposte e valutare la proposta migliore. Puoi provare a modificare la tua domanda per spiegare più in dettaglio ciò che rende un output di città adatto rispetto a uno meno adatto?
DMGregory

troppo ampio, soprattutto perché tali generatori sono probabilmente composti (ad esempio il passaggio 1 genera strade, il passaggio 2 genera case, il passaggio 3 genera alberi). Se riesci a restringere le cose a un generatore specifico e quali problemi specifici stai avendo con quello, sarebbe meno ampio.
congusbongus,

1
Abbiamo anche questa domanda sulla generazione procedurale di città . Potrebbe essere utile se potessi articolare in che modo le tue esigenze differiscono da quella domanda.
Pikalek,

1
Nessuna grande risposta qui, ma una cosa che noto è che nel buon esempio, ogni edificio è vicino a una strada, mentre nel tuo esempio non lo sono.
user1118321

@ user1118321: In realtà, le case non sono sempre accanto a una strada, ma o le trame sono (approccio moderno) o almeno c'è un modo per la strada successiva (forse approccio più vecchio, non come una casa sul retro). Quindi gli spazi non sono così innaturali, come ad esempio i mercati.
PSquall

Risposte:


9

Introversion Software ha creato un generatore di città davvero impressionante per il progetto Subversion annullato indefinitamente sospeso :

Generatore di città di sovversione

L'algoritmo è progettato per generare metropoli grandi e moderne. Ma le stesse tecniche possono essere utilizzate per generare più insediamenti rurali.

È un algoritmo top-down che genera prima i contorni grezzi e quindi genera sempre più dettagli per adattarli (per l'approccio bottom-up opposto alla generazione procedurale, controlla la risposta con uliwitness). Ecco un video che visualizza l'algoritmo in corso .

L'algoritmo sembra funzionare come segue (leggermente semplificato):

  1. Centri città: seleziona alcuni punti della mappa ancora vuota come nodi di traffico principali. Dovrebbero essere distribuiti uniformemente sulla mappa
  2. Autostrade: collega i principali nodi di traffico ai loro vicini e al mondo esterno utilizzando le strade principali.
  3. Autostrade: suddividere le celle generate dalle strade principali creando alcune strade secondarie.
  4. Strade: ripeti il ​​processo di suddivisione in modo ricorsivo con strade sempre più piccole fino a quando non hai raggiunto la dimensione desiderata del blocco predefinito
  5. Blocchi: Decidi lo scopo di ogni blocco (residenziale, commerciale, aziendale, industriale ...). I fattori rilevanti sono le dimensioni delle strade vicine e la distanza dal centro.
  6. Assegnazioni: dividere i bordi di tutti i blocchi in lotti (questo significa che ogni lotto ha almeno un bordo collegato a una strada).
  7. Edifici: genera un edificio adatto per ogni lotto.

Per quanto riguarda il posizionamento degli alberi: il mio primo approccio sarebbe quello di integrare quelli nell'algoritmo di generazione dell'edificio. Un edificio non ha bisogno di riempire completamente il suo lotto. Puoi riempire lo spazio libero con oggetti decorativi appropriati.

Il problema con l'approccio top-down è che mentre potrebbe generare una città plausibile, potrebbe non generare una città plausibile con tutto ciò che desideri . Diciamo che ogni città del tuo gioco ha bisogno di un negozio di armi, un negozio di armature, un negozio di pozioni e una locanda. L'algoritmo di cui sopra raccoglie gli edifici in base ai requisiti del lotto, quindi potresti finire con 12 negozi di armature ma non una singola locanda. Affronterei questo problema nella fase di generazione dell'edificio. Prima di iniziare a generare edifici in modo casuale, consulta l'elenco degli edifici indispensabili e seleziona il lotto più appropriato per ciascuno di essi. Quindi riempire i lotti rimanenti con edifici randomizzati.

Non vedo l'ora di esplorare le città generate proceduralmente nel tuo gioco.


Ho completamente dimenticato di menzionare strade di varie dimensioni, buon punto!
uliwitness

Grazie! Non sono sicuro se proverò dall'alto verso il basso o dal basso verso l'alto ... ma rendendomi conto di avere due opzioni, il mio cervello è ripartito di nuovo. ;)
Roflo

5

Ottieni vincoli dalla vita reale

Spesso la risposta su come trovare l'algoritmo giusto inizia osservando come accadono queste cose nella vita reale. Hai esaminato questo? Dalla parte superiore della mia testa, posso pensare a quanto segue:

  • Le strade sono lì per collegare edifici e altri punti di interesse
  • Gli edifici sono collocati lungo strade esistenti, se possibile
  • Se non c'è strada, un edificio viene posto in un punto vuoto e collegato a una strada vicina tramite la propria strada
  • Gli edifici sono collocati vicino ad altri edifici che sono di interesse per i loro abitanti: le persone si trasferiscono per vivere vicino ai loro luoghi di lavoro, negozi di alimentari e abbigliamento ecc
  • Gli edifici sono collocati vicino a risorse necessarie per l'uso previsto. Ad esempio una segheria viene posizionata vicino a foreste o addirittura in una radura. le persone hanno bisogno di acqua e cibo (piante, animali) per vivere da qualche parte.
  • Gli edifici sono collocati lontano da altri edifici che sono dannosi per l'uso previsto o ai quali sarebbero dannosi. Ad esempio, un negozio di tintorie ha un odore orribile, quindi di solito non è collocato in una zona residenziale. Allo stesso modo, le taverne e i ristoranti sono rumorosi, quindi i residenti non vogliono viverci sopra, ma hanno bisogno di clienti, quindi devono essere vicini alle aree residenziali.
  • Alcuni paesi hanno leggi di zonizzazione che influenzano anche il posizionamento degli edifici. Di solito si tratta di un modo più formalizzato di anticipare quali tipi di edifici possono essere dannosi l'uno per l'altro o quali risorse sono uniche per l'area (come il terreno di alta qualità è per i campi, non per la costruzione di parcheggi).
  • Gli edifici sono destinati agli abitanti e il loro stile personale e le loro preferenze si riflettono in essi. Ad esempio, se una popolazione è povera, è molto più probabile che condividano il terreno (grattacieli, condomini), se sono più benestanti, possono ottenere condomini, se sono ricchi, ottengono una villa indipendente. Se ad alcuni gruppi non piacciono altri gruppi, avranno meno probabilità di convivere. Se esiste un'affinità tra determinati gruppi, questi possono spostarsi in aree simili.

Applicali alla tua topografia

Una volta che hai questi vincoli, puoi provare a costruire un algoritmo attorno ad esso. Ad esempio, genera la tua topografia e distribuisci le risorse necessarie intorno alla mappa (magari tenendo d'occhio il posizionamento di piccoli depositi delle risorse più importanti nell'area di partenza, quindi depositi più grandi più distanti tra loro). È qui che entrano in gioco le esigenze e le meccaniche del tuo gioco, ma probabilmente aggiungerai anche un elemento casuale.

Quindi costruire attività commerciali (e i loro edifici residenziali) vicino alle risorse che le utilizzano. Ad esempio una cava accanto a una grande montagna. Quindi aggiungere l'infrastruttura necessaria da loro. Ad esempio una stazione commerciale con ufficio postale e taverna dove possono fare affari e vendere i loro prodotti, una fucina per fornire strumenti ecc.

Per decidere cosa va dove, dividi la mappa in tessere dove calcoli un numero per ogni tessera quanto è desiderabile per un certo scopo, usando una funzione di ponderazione. Metti gli edifici nelle piastrelle più desiderabili per quel tipo di edificio. Aggiungi regole come "una postazione commerciale può gestire 50 aziende o 100 case", aumentando la probabilità di aggiungere un'altra postazione commerciale se una città raggiunge una determinata dimensione.

Una volta che hai questo, dovresti ottenere alcune mappe abbastanza decenti. Se noti che le mappe finiscono tutte come forme innaturali, aggiungi penalità alle tue funzioni di ponderazione per quelle forme, come "se la mia strada finisce proprio accanto a un'altra strada, -100 desiderabilità", o "se la mia strada si incrocia, -100 desiderabilità "ecc. Puoi sempre aggiungere un elemento casuale per consentire una sensazione più eccentrica o aggiungere altri meccanismi come" se un incrocio ha più di N edifici collegati alle sue strade, trasformalo in una rotonda ".

Puoi anche usare questi vincoli per dare a diverse mappe un aspetto diverso, come fare in modo che un determinato paese abbia più montagne nella sua topografia, o che una certa cultura costruisca più strade tortuose, e un'altra preferisca strade diritte ecc. Tutto semplicemente modificando una delle tue funzioni di ponderazione.

Semplificare

Naturalmente, questo approccio è troppo complesso per i giochi che non sono simulazioni commerciali, ma risolvono comunque e vedi quali tipi di edifici hanno senso per il tuo gioco ed elimina quelli non necessari. Quindi elaborare regole semplificate come "posizionare le città vicino a un fiume, una montagna o un buon terreno. 1 edificio per 100 risorse, attività commerciali in base al tipo di risorsa, 10 edifici residenziali per ogni set completo di risorse alimentari / artigianali ... o semplicemente" 1m di fiume / 1mq di terreno può supportare 10 edifici residenziali ... qualunque cosa abbia senso per un gioco. Tuttavia, una volta che sai quanta area hai (ad es. Nessun edificio sui ripidi fianchi delle montagne) e quanti edifici la zona può supportare, posiziona solo gruppi di edifici in quella zona fino a quando non è piena (come, 1 edificio commerciale, 10 residenziali , 3 infrastrutture o altro) e collegarli alle strade.


1
Questa risposta descrive l'approccio dal basso verso l'alto alla generazione procedurale. Si complimenta molto bene con la mia risposta che descrive un esempio dell'approccio top-down opposto. Entrambi gli approcci presentano vantaggi e svantaggi. Il vantaggio del bottom-up è che hai un ottimo controllo su quali oggetti hai nella tua città generata. Lo svantaggio è che hai bisogno di un regolamento molto più complesso e fragile per generare una città che sembra realistica nel suo insieme.
Philipp

Si. Dipende anche molto dal tipo di gioco e dalla disposizione della città desiderata. Il bottom-up funziona meglio per le città più piccole, in stile medievale e coltivate naturalmente, mentre il top-down funziona meglio per le città e le metropoli in stile americano. Allo stesso modo, se hai un gioco che coinvolge edifici funzionali e gestione delle risorse, il bottom-up può darti un controllo più preciso, mentre il top-down è la migliore ottimizzazione per le città nei giochi di corse ecc. Dove non ti interessa davvero la funzione degli edifici .
uliwitness

Grazie per la risposta. Have you looked into that?Io ho. Beh, in un certo senso (non riuscivo a pensare a molte "regole della vita reale"). Ma questo è un vero colpo d'occhio rispetto ai miei precedenti tentativi: non riuscivo a riconoscere le risorse che potrei non disegnare (cioè: c'è una foresta a est ... indipendentemente dal fatto che la disegni o meno).
Roflo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.