Qual è un buon algoritmo per il layout di città procedurale basato su frattali?


19

sfondo

Gestisco un server Minecraft dove ho intenzione di progettare una città di partenza di dimensioni abbastanza grandi. Ho una serie di cose, come segni di regole e gabbie di mafia, che vorrei mettere in edifici lì. La città stessa sarà estremamente grande e estesa, preferibilmente fino a 1000 per 1000 blocchi di dimensioni.

Gli edifici stessi avranno cubo o impronte rettangolari basate su un certo cubo di base, come tutti i multipli di 3 blocchi. Le strade e la distanza tra gli edifici saranno preferibilmente larghe 5-11 blocchi, a seconda dell'importanza della strada.

Quando inizierò il piano per la città, saprò esattamente quanto voglio che siano grandi gli edifici e quanti ce ne saranno.

Il problema

Il problema è la progettazione del layout per la città. Ovviamente con qualcosa di simile, e io che provengo da un background di programmazione piuttosto che da un background di urbanista, è abbastanza difficile persino iniziare a avvolgere la testa attorno al problema.

Il problema in particolare è che voglio che la città appaia il più naturale possibile. Naturalmente questo sarebbe abbastanza facile da costruire su un semplice schema a griglia, ma voglio evitare il più possibile una griglia o qualsiasi cosa che assomigli a una griglia.

La domanda

Quali algoritmi potrei essere in grado di perseguire per aiutarmi a progettarlo usando il codice? Pensavo che sarebbe stato più naturale se avessi usato i frattali in qualche modo, dato che Minecraft utilizza i frattali già nella sua generazione del terreno e una città sembra crescere naturalmente in un modello frattale.

Penso che sia simile in qualche modo a un algoritmo di riproduzione di tetris, quindi se qualcuno ha soluzioni che esistono in quella direzione, sarebbe di aiuto anche. Sto immaginando qualcosa in cui sarò in grado di definire le forme che voglio usare, e il software quindi scorre fino a trovare la soluzione più "ottimale" per una distribuzione uniforme degli edifici. Esiste già qualcosa che mi aiuti a risolvere questo problema usando Python, preferibilmente in modo visivo usando Pygame?

Naturalmente questo ha anche implicazioni interessanti per la generazione di città in generale nella progettazione dei giochi, quindi sono molto entusiasta di vedere quale sia la soluzione migliore.

modifica Per essere chiari, sto solo cercando il layout a questo punto poiché gli edifici saranno progettati e costruiti nel gioco.


3
Minecraft usa i frattali? Avevo l'impressione che utilizza solo funzioni di rumore continuo (Perlin o Simplex, credo).
Martin Sojka,

Il rumore di @Martin Sojka Perlin è in realtà un frattale, quindi lì.
Nevermind,

1
@Nevermind: La caratteristica distintiva di un frattale è l' auto-somiglianza : se scegli una parte di esso e la ridimensioni alla dimensione dell'originale, sarà "simile" (avrà la stessa struttura). In particolare, lo spettro di frequenza di un segnale frattale è invariante alla scala. Se lo fai con il rumore Perlin, tutto ciò che otterrai è un'area ingrandita di un rumore Perlin; anche lo spettro delle frequenze si sposterà.
Martin Sojka,

Il rumore di Perlin @Nevermind in realtà non è un frattale, tuttavia il movimento browniano (che è una tecnica che può usare il rumore di Perlin) è un frattale ed è comunemente indicato come rumore di Perlin.
Elva,

Sì, scusa, correggo sempre le persone quando confondono il rumore di Perlin e il rumore rosa, ma qui sto facendo lo stesso errore. La mia unica difesa è che Minecraft in realtà usa anche il rumore rosa (moto browniano), IIRC.
Nevermind,

Risposte:


20

Di recente ho implementato un algoritmo per un layout procedurale della città. È ancora un lavoro in corso, ma mi sembra promettente. Guarda:

esempio di città procedurale

L'algoritmo utilizzato per creare questo layout è vagamente basato su L-Systems . Ho una Elementclasse base , che ha un rettangolo che ne indica la posizione sulla mappa e un metodo Grow, che ne crea altri Elementsall'interno del rettangolo e / o genera alcuni oggetti sulla mappa. Poi ci sono elementi reali, ereditati da questa classe di base: City, Street, Buildingetc.

La generazione inizia con un numero di oggetti "seed" (nel mio caso, solo un singolo Cityelemento posizionato casualmente sulla mappa). Quindi il sistema esegue l'iterazione su tutti gli elementi, chiamando Grow, fino a quando tutti gli elementi diventano inattivi ( Growritorna false) o passa un gran numero di iterazioni.

La città nella foto è costruita usando solo alcune semplici regole:

  • Citydiventa un Streetelemento che divide l'area da qualche parte.
  • Tutti Streetcrescono per 0-3 strade secondarie, dividendo ulteriormente l'area.
  • Inoltre, Streetcerca continuamente di adattarsi a una dimensione casuale Buildinga lato.

Il risultato non è terribilmente interessante, ma neanche male. Il sistema può essere esteso facilmente ed è abbastanza semplice da capire cosa sta succedendo (-8


Adoro la semplicità. Le città sono, in realtà, organiche perché sono controllate da un'entità organica - che cerca di creare la perfezione come la vede l'occhio della mente - rendendo probabilmente L-Systems la migliore approssimazione di questo processo.
Jonathan Dickinson,

Mi piace. =) Ora per implementare in pygame ...
Ken

8

C'è questo discorso GDC sulla generazione di edifici procedurali di un paio di anni fa. Serve per creare singoli edifici sulla base di una serie di modelli, ma non per creare intere città (tracciare strade e così via). Purtroppo non esiste alcun codice gratuito. Il sistema descritto nel discorso è implementato in Unreal anche se non sono chiaro se sia nella versione gratuita di UDK o meno. In ogni caso, potresti usare alcune delle stesse idee per costruire il tuo sistema.

Googling "edifici procedurali" o "città procedurale" ti forniranno anche molti altri documenti e articoli sull'argomento.


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.