Come posso definire le aree piene d'acqua?


9

Vorrei migliorare il mio piccolo motore di gioco con una bella simulazione dell'acqua. Per iniziare a lavorarci ho bisogno di trovare un modo corretto di rappresentare l'acqua nel gioco. Purtroppo non conosco rappresentazioni molto diverse, quindi te lo chiederò. C'è una domanda simile che ho posto qualche tempo fa. Ma dal momento che non avevo formulato chiaramente il problema, la risposta è corretta ma non quella che stavo cercando.

In alcuni giochi, l'acqua è definita da un livello di altezza. Ad esempio tutto sotto l'altezza dello zero è sott'acqua. Ho visto questa rappresentazione in giochi (per lo più vecchi). Il problema è che mi piacerebbe avere grotte nel mondo all'aperto che non sono allagate e livelli di acqua diversi per ogni lago e mare.

Un'altra rappresentazione più precisa dell'occorrenza dell'acqua sono le particelle. Ogni goccia d'acqua viene immagazzinata come un punto nello spazio mondiale. Per renderli, potrei usare tecniche come i metaballs in modo che costruiscano una singola mesh. Questa rappresentazione sarebbe ottima per il realismo poiché potrei facilmente calcolare la dinamica tra di loro. Purtroppo nessuna macchina poteva calcolare un oceano di metaballs in tempo reale.

Esistono altri modi per rappresentare l'acqua in un motore? Vorrei avere laghi dinamici, quindi definire l'area dell'acqua con una geometria statica non è un'opzione. Ad esempio, se il giocatore modifica il terreno per allargare un lago, l'acqua dovrebbe riempire quella baia e il livello complessivo dell'acqua di quel lago dovrebbe diminuire leggermente.


2
Come è organizzato il tuo terreno nel motore? Esistono diverse tecniche per il terreno voxel vs. heightmap vs. polysoup (mesh).
Exilyth

Viene dato come mesh e l'acqua non deve scambiare quella mesh del terreno in modo diverso rispetto alle altre mesh statiche.
danijar,

1
commerciare o trattare?
Tom 'Blue' Piddock,

1
Ci sono alcune dimostrazioni molto belle di un simile approccio metaballico, ma non lo vedo utilizzabile in nessun gioco reale che non sia interamente focalizzato sul fatto che la simulazione dell'acqua è in qualche modo credibile fisicamente. Non vedo una ragione solo per una mesh, inoltre non dovrebbe essere un problema adeguarla alle aree circostanti o addirittura generarla sulla base di una simulazione fisica. Ma questo è qualcosa che vuoi fare solo se veramente necessario. Come riferimento per la simulazione semi realistica dell'acqua, potresti voler controllare "Dalla polvere".
Slin,

1
La soluzione di dimensioni variabili era il problema "ocean of metaballs". Inoltre, ci sarebbero ovviamente dei limiti alla variazione delle dimensioni a seconda del volume, in quanto è un mezzo per ottimizzare le prestazioni, non alterare il volume di acqua. Basta aggiungere una considerazione speciale, come la vicinanza al giocatore e la superficie, per le aree che richiedono dettagli come cascate, affluenti, coste o corsi d'acqua.
Attackfarm

Risposte:


3

Non posso dire ciò che viene comunemente usato, ma il mio primo pensiero sarebbe quello di utilizzare un sistema di particelle con particelle di varie dimensioni che rappresentano acqua di vari volumi. La parte superiore dell'acqua userebbe particelle più piccole per formare le ondulazioni della superficie e delle onde, l'acqua più vicina al giocatore userebbe le particelle più piccole per simulare schizzi e piccole ondulazioni, mentre più l'acqua sarà profonda o più profonda, più le particelle saranno grandi . Ciò consentirebbe un numero dinamico di particelle che simulano acqua di qualsiasi dimensione, dinamica dell'acqua mentre cambia e un livello di prestazione ragionevole e controllato.

Riesco a vedere problemi con questa implementazione, ma certamente sembra una soluzione relativamente semplice e "abbastanza buona" che uno spettatore / giocatore sarebbe in dubbio di mai notare deviazioni nella simulazione.


2

Se stavi usando un terreno basato su voxel, oltre a memorizzare la densità del terreno per voxel, potresti anche memorizzare un valore dell'acqua compreso tra 0e 1 - groundDensity. Disegnare l'acqua sarebbe semplice come far passare un cubo in marcia sui valori dell'acqua. Simulare l'acqua sarebbe un po 'più difficile, ma la premessa di base è che si desidera risolvere il sistema in modo tale che:

  1. L'acqua sotto la superficie dovrebbe riempire il resto del voxel
  2. L'acqua a livello superficiale dovrebbe avere la stessa densità totale groundDensity + waterDensity, come i suoi vicini
  3. L'acqua può essere spostata verso qualsiasi voxel immediatamente adiacente e al di sotto di essa, a condizione che la densità totale del vicino sia inferiore alla sua densità totale

L'algoritmo ideale verrebbe eseguito in uno shader di calcolo, un percorso di esecuzione per voxel. Se vuoi essere fantasioso, puoi anche memorizzare la velocità dell'acqua all'interno di quel voxel per ulteriori effetti di simulazione: ad esempio, tentando di distribuire una quantità di acqua proporzionale alla velocità alle celle "indicate" dal vettore di velocità. Questi dati di velocità potrebbero anche essere usati per muovere le onde, disegnare rapide, ecc.


Sfortunatamente non ho terreno voxel, come sottolineato nei commenti sotto la domanda. Grazie comunque.
danijar
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.