Creazione di pioggia 2D (e fluidodinamica)


11

Sto sperimentando le condizioni meteorologiche in una mia partita e sono rimasto colpito dal modo in cui Starbound ha gestito la pioggia. Fondamentalmente, quando la pioggia colpisce il suolo, viene dispersa orizzontalmente (e assorbita dal terreno) oppure crea pile d'acqua (quando le gocce di pioggia atterrano all'interno di un buco nel terreno).

Questo video lo dimostra chiaramente: http://imgur.com/gallery/CKCGKbG

So come far cadere la pioggia e controllare dove colpisce il terreno, ma è lì che mi blocco. La mia domanda è: come è stato creato? E come si può modellare il flusso d'acqua in modo così perfetto, senza uccidere le prestazioni?

Grazie in anticipo!


1
La chiave è il sistema fluidodinamico. Ho il sospetto che quando una goccia di pioggia colpisce il terreno, generi una piccola quantità di acqua in quella posizione che viene poi elaborata dal sistema fluidodinamico come al solito. Su superfici piane è contrastata dall'evaporazione, ma quando le pendenze causano la concentrazione di acqua in un'area, l'afflusso è più forte dell'evaporazione e iniziano a formarsi le pozzanghere.
Philipp,

Risposte:


9

Il sistema idrico di Starbound è in realtà automi cellulari basati su piastrelle 2D. Ogni piastrella sullo schermo che non contiene uno strato di piastrella frontale, è in grado di trattenere l'acqua. La quantità di acqua viene calcolata tramite automi cellulari.

Maggiori informazioni su questa tecnica qui:

http://www.gamasutra.com/view/feature/134736/an_intro_to_cellular_automation.php

http://www.jgallant.com/2d-liquid-simulator-with-cellular-automaton-in-unity/

Per quanto riguarda le gocce di pioggia, quelle sono particelle. Servono principalmente a fingere che in realtà ci sia acqua che cade dal cielo. L'acqua si accumula solo perché il gioco sa che sta piovendo. Le singole gocce non hanno nulla a che fare con l'effettiva formazione delle pozze d'acqua.

Il modo in cui riescono ad accumularsi, è determinando dove ci sono buchi nello strato superiore del terreno. Se esiste un'area che può accumulare acqua, le celle in quell'area aumentano di conseguenza i loro livelli d'acqua.

Starbound si occupa anche della pressione dell'acqua e la loro tecnica di rendering è piuttosto sorprendente. Hanno la migliore implementazione 2D della fisica delle simulazioni dell'acqua usando automi cellulari che io abbia mai visto.

Ecco una visione primitiva di un motore fisico liquido, che utilizza la tecnica degli automi cellulari sopra menzionata. La porzione di rendering diventa un po 'più complessa, poiché l'acqua è rappresentata da un valore numerico.

http://www.jgallant.com/images/pressuretest.gif

In questo esempio, un miglioramento molto semplice sarebbe quello di nascondere le celle d'acqua che hanno meno di 1 unità piena d'acqua nella sua tessera se non ci sono tessere solide sotto di essa. Ma poi stai nascondendo il flusso d'acqua. Invece di nasconderlo, dovresti determinare come scorre l'acqua, quindi disegnare lo sprite d'acqua appropriato al suo posto.


2
Per aggiungere al fatto che le particelle di goccia di pioggia falsano l'effetto di caduta dell'acqua: anche i piccoli schizzi di gocciolina sulla superficie non sono correlati alle particelle di pioggia effettive ma a un effetto separato. La combinazione fa sembrare che le goccioline facciano gli schizzi.
Felsir,

Wow, è esattamente quello che stavo cercando. Pensavo che avrei dovuto ricorrere a un sistema fluido troppo complesso basato su particelle, ma i sistemi a griglia sembrano funzionare altrettanto bene. Tuttavia, per aggiungere la pressione dell'acqua immagino che hai solo bisogno di un secondo array che memorizza i valori della pressione e scorre da alta pressione verso luoghi a bassa pressione? In tal caso, ciò non dovrebbe essere troppo difficile per il computer.
Pandaqi,

No, tutto ciò che devi fare con la pressione è aggiungere una regola come ad esempio, una tessera può contenere più di 1 unità completa di liquido. Se quella tessera ha più di 1 unità completa di liquido e non è in grado di fluire secondo il normale insieme di regole, allora fallo scorrere verso l'alto. Regolare in modo che consenta a più acqua di scorrere in base al valore pressurizzato di quella piastrella.
Jgallant,

3

Ci sono molti modi per affrontarlo. Come sempre "dipende"

E quindi immagino che un modo sarebbe così ... Dato un arbitrario "tuffo nel terreno" Sovrapponi una "scatola d'acqua" che lo delimita. Il terreno e il waterbox sono disegnati a strati in modo che il terreno sia mostrato per primo, il waterbox dopo.

ogni volta che una goccia d'acqua colpisce l'immersione nel terreno, aggiungine una alla scatola dell'acqua. Quando il waterbox raggiunge un numero magico, aggiungi una linea d'acqua. Quindi diciamo che 10 gocce atterrano nel tuffo, questo aggiunge una linea al waterbox.

Quindi supponiamo che il waterbox sia di 32X32 pixel. Aggiungi una linea di acquarello da 0,31 a 31,31. Altre 10 gocce, traccia una linea da 0,30 - 31,30. Quindi, quando le gocce si accumulano, costruisci la scatola dell'acqua dal basso fino al suo pieno.

Spero che abbia un senso.

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.