Come simulare la pressione con le particelle?


11

Sto cercando di simulare la pressione con una raccolta di particelle sferiche in un gioco Unity che sto costruendo. Un paio di note sul problema:

  • L'obiettivo è riempire uno spazio / vuoto 2d in costante cambiamento con sfere piccole e senza attrito. Il gioco sta cercando di simulare la pressione sempre crescente di più oggetti spinti in questo spazio.
  • Il livello stesso scorre costantemente da sinistra a destra, il che significa che se le dimensioni dello spazio non vengono modificate dall'utente, si ridurrà automaticamente (la parte più a sinistra dello spazio scorrerà continuamente fuori dallo schermo).

Mi chiedo quali sono alcuni approcci che posso adottare per affrontare questi problemi ...

  1. Sapere quando rilevare quando c'è spazio da riempire e quindi aggiungere sfere allo spazio.
  2. Rimozione di sfere dallo spazio quando si sta restringendo.
  3. Strategie per simulare la pressione sulle sfere in modo tale che "esplodano verso l'esterno" quando viene creato più spazio.

L'approccio attuale che sto contemplando sta usando un muro in costante movimento, che è fuori dallo schermo e si muove con lo schermo, come questa immagine illustra:

pressione!.

Questo muro mobile spingerà e intrappolerà le sfere nello spazio. Per quanto riguarda l'aggiunta di nuove sfere, avrei dovuto replicare entrambe (1) sfere al rilevamento dello spazio libero, oppure (2) generarle sul lato sinistro dello spazio (dove si trova il muro) - spingendo il resto delle sfere verso riempi lo spazio. Prevedo problemi con l'idea n. 1 perché questo probabilmente non creerebbe / simulerebbe davvero la pressione; l'idea n. 2 sembra più promettente, ma solleva la questione di come fornire un luogo per la generazione di queste nuove particelle di sfera (e le conseguenze di generarle quando non c'è spazio).

Grazie mille in anticipo per la tua saggezza!

Risposte:


6

Non sono esattamente sicuro di cosa tu voglia ottenere, il muro sta spingendo le particelle mentre lo spazio rotola giù dallo schermo una meccanica di gioco?

Per quanto riguarda i tuoi tre punti, penso che tutti questi comportamenti emergerebbero se trattassi le tue particelle in questo modo: fai in modo che ogni particella respinga ogni altra particella inversamente proporzionale alla distanza, e anche che si scontrino con le pareti del tuo spazio per fermarli.

Le particelle vicine si respingono a vicenda e quindi si espandono per riempire lo spazio vuoto fino a quando non vengono bloccate da ostacoli. Se / quando le pareti si muovono per ridurre lo spazio e spingono le particelle, verranno spinte più vicine ad altre particelle, respingendole più forti che a loro volta spingeranno su altre particelle, aumentando la pressione complessiva.

Questo sarebbe abbastanza simile a una simulazione n-body con attrazione negativa, quindi a seconda del numero di particelle, potrebbe essere abbastanza costoso calcolare la repulsione per ogni particella con ogni altra particella. Potresti forse provare a semplificare questo facendo respingere ogni particella proprio dal centro di gravità mediato della tua massa di particelle, che potrebbe produrre un comportamento strano in aree lunghe e sottili con curve (il tuo gas non si espande in aree che si piegano lontano dal centro di gravità, per esempio).

Per quanto riguarda la creazione e l'eliminazione di particelle (per assicurarsi che ci sia la giusta quantità per riempire visivamente lo spazio che presumo?), Probabilmente vorrai assicurarti di non aggiungere o rimuovere semplicemente le particelle quando la densità è carente, poiché ciò introdurrebbe più particelle respingono altre particelle e quindi aumentano o diminuiscono la pressione.

Quindi potresti voler introdurre un fattore nel calcolo della repulsione, diciamo iniziare con 1.0 e quando aggiungi x particelle, crea il nuovo fattore n / (n + x) dove n è il numero di particelle totali prima di aggiungere quelle nuove.


2

La pressione (come in un gas) è solo il risultato di semplici collisioni elastiche tra le particelle e tra le particelle e il muro. Misuri semplicemente la quantità di collisioni alla volta con le pareti per ottenere un valore per la tua pressione.

Le 2 idee che dai non hanno alcun legame diretto con la pressione, dato che la pressione viene data con una quantità costante di particelle in una volumina chiusa e una data temperatura (che si traduce in un movimento più veloce o più lento).

Se aggiungi particelle a questo sistema chiuso, la pressione dovrebbe aumentare, perché c'è più energia nell'intero sistema (hai appena aggiunto una nuova particella con una data temperatura <-> velocità).


le particelle dovrebbero avere una massa per le collisioni elastiche, dato che si presume che le pareti abbiano una massa vicino a + infinito
Aron_dc

Ho detto "la pressione è la quantità di collisioni per volta con le pareti" che è preciso al 100%. In una collisione elastica prendi l'impulso di quella particella e misuri quanto impulso viene dato al muro. Quindi, se una particella si scontra in direzione verticale rispetto alla parete, la parete riceve un impulso di 2mv (m = massa della particella; v = velocità della particella). Quindi misuri effettivamente l'impulso in arrivo sul muro. La particella viene appena riflessa (v prima della collisione = -v dopo la collisione). Questo aiuta anche a misurare la pressione di miscele di gas diversi (m diversi per particelle).
Aron_dc,

0

Ogni ciclo, dovresti scorrere tutte le tue particelle e quindi calcolare una forza finale su quella particella. Fondamentalmente, il muro dà sempre loro un vettore di forza positiva sull'asse x, se si scontrano con esso (particle.x - particle.r <= 0).

Quindi, ogni particella con cui si scontrano dà loro anche un vettore di forza, a seconda dell'angolo tra di loro. Raccogli questi angoli per tutte le particelle, calcola la media e il gioco è fatto!

Ci sono molte tecniche di ottimizzazione che puoi usare anche qui, basta guardare un tutorial sulla fisica della palla. Fondamentalmente vuoi iterare attraverso ogni coppia di particelle solo una volta e calcolare il vettore di forza per entrambi e memorizzarlo in essi.

Questo simulerà i gas, fondamentalmente, e se dai loro una forza costante, presumo anche i liquidi.

Per quanto riguarda la creazione e l'eliminazione di particelle, implemento una classe ParticleEmitter, che ha una posizione, una direzione e alcune altre cose utili. Il tuo esempio sarebbe meglio con un emettitore che può creare particelle in un certo intervallo, o ancora meglio, un rettangolo.

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.