Randomizzazione dei biomi

4

Sai come in Minecraft il mondo è in continua espansione e tutti i biomi sono randomizzati?

La mia domanda generalizzata è: in relazione a una simulazione spaziale che è anche in continua espansione mentre il giocatore si muove per il mondo, come si fa a programmare questa randomizzazione in Java?

La mia vera domanda è: potrei ottenere un esempio semplificato suddiviso in queste classi di esempio:

  • astroids (Questo include quanti astroidi ci sono, il loro posizionamento nello spazio, le loro dimensioni, quanto spesso avvengono gli astroidi più grandi, quanto sono vicini l'uno all'altro, i limiti di quanti grandi asteroidi possono essere in uno campo, quanto spesso vengono generati campi astroid, ecc.)
  • tipi di stelle (dimensione, colore, tipo, quanto spesso si verificano, dove si verificano, ecc.)
  • pianeti abitabili (dimensioni, posizionamento, quanto spesso vengono generati, dove vengono generati, ecc.)

Questo sarebbe molto utile attualmente poiché desidero creare una versione semplificata di tale programma.

    
posta user24527 28.06.2013 - 00:58
fonte

1 risposta

7

Esempio di Minecraft I biomi in minecraft non sono determinati direttamente; un bioma viene selezionato in base alla temperatura e all'umidità locali (ad esempio un bioma secco caldo finisce come deserto, un bioma bagnato caldo finisce come foresta pluviale, per l'intero grafico vedi link [Nota che questo grafico è obsoleto ma il concetto è ancora attuale]).

Ora potresti semplicemente scegliere la temperatura e l'umidità in modo casuale; ma questo porterebbe ad ogni blocco che ha un bioma diverso ( veramente veramente stupido ) o potresti ancora scegliere casualmente ma su una scala più grande; questo porterebbe a orribili spigoli e biomi che non dovrebbero essere l'uno vicino all'altro. Ad esempio, il deserto potrebbe essere vicino alla tundra artica ( ancora abbastanza stupido ).

Soluzioni ingenue cioè non farlo Un metodo che risolverebbe questo problema sarebbe quello di interrompere la scelta casuale della temperatura e dell'umidità, ma iniziare a scegliere casualmente la variazione della temperatura e dell'umidità. Inizialmente questo sembra davvero bello, ma poiché il giocatore può attraversare il mondo in qualsiasi maniero si finisce con problemi quando il mondo si curva su se stesso; ottieni brutti legami. Anche se crei regole come il mondo che viene creato dall'origine indipendentemente dalla direzione del cammino, devi ancora creare parti del mondo che il giocatore non ha ancora esplorato. Cioè percorri 100 metri a nord, poi a 10.000 metri a est e poi a 200 metri a sud. All'improvviso e all'improvviso hai bisogno degli "altri 10.000 m est" che non hai camminato per capire come sarà il nuovo blocco.

Perlin Noise (e il suo rumore cugino simplex più efficiente)
Perlin noise prende le coordinate di posizione come input (come anche un seme principale) e genera un valore compreso tra -1 e +1 che è sia casuale che lentamente cambiando man mano che la coordinata cambia. Raggiunge questo campionando numeri casuali su diverse scale di lunghezza. Ad esempio, il punto su (1100, 0) campionerà:
(1088,0) [- 16 (arrotondato)]
(1120,0) [+ 16 (arrotondato)]
(1096,0) [- 8 (arrotondato)]
(1012,0) [+ 8 (arrotondato)]
...
(1100,0) [+ 0]

NB arrotondato intendo che (ad esempio) al livello + -16 il punto di campionamento viene spostato sul valore più vicino divisibile esattamente per 16, quindi (1100, 0) (1101, 0) (1102, 0) e simili saranno tutti campione (1088,0) come loro -16 punti

E li somma, la ponderazione determinerà la velocità con cui il valore cambia, l'elevata ponderazione per la grande scala creerà ondulazioni lente, una ponderazione elevata per bilance di piccole dimensioni creerà più velocemente cambiamenti di valori frastagliati.

Un punto adiacente (1101, 0) campionerà lo stesso punto di livello superiore ma il punto di livello più basso sarà diverso, quindi cambierà solo lentamente (anche la ponderazione dei punti più alti cambierà). (1109, 0) avrà solo i punti di livello molto alto in comune.

Questo significa che per calcolare (1100, 0) non hai bisogno di conoscere nessun altro punto, puoi generarli come e quando e "finiranno" cambiando gradualmente.

Si noti che il rumore simplex è considerevolmente più veloce del rumore di Perlin e anche migliore in molti modi più tecnici; tuttavia la matematica è notevolmente più complessa (che è divertente dato il nome)

Conclusione
Se vuoi solo la casualità vera (cioè sembra statica) usa solo le funzioni casuali di inbuild di java. Se si desidera un rumore casuale ma lentamente variabile (ad esempio montagne) utilizzare il rumore Perlin o Simplex. I rumori Perlin e Simplex sono disponibili per qualsiasi dimensione, ma il rumore di perlin diventa molto inefficiente per le alte dimensioni, mentre il rumore simplex cresce solo lentamente con la dimensione.

Riferimenti:
Spiegazione del rumore di Perlin < br> Java implimentation of perlin noise

    
risposta data 28.06.2013 - 12:48
fonte

Leggi altre domande sui tag