7

Sto calcolando il risultato scontrando coppie di oggetti convessi 2D (senza rotazione), utilizzando the basic equations on wikipedia. Tuttavia, quando ci sono dipendenze, come due oggetti colpire un altro oggetto allo stesso tempo:Come gestire più collisioni elastiche simultanee?

enter image description here

Come qui, con oggetti 1 e 2 colpendo 3 allo stesso momento, l'approccio a coppie fallisce . A seconda dell'ordine in cui computo le collisioni (1-3 prima o 2-3 prima), otterrò risultati diversi. L'iterazione ripetuta attraverso le collisioni darà comunque risultati dipendenti dall'ordine.

L'ho già impostato in modo da poter capire quali oggetti sono in contatto tra loro, quindi il mio codice saprà quando calcolerà una di queste coppie che l'oggetto 3 si scontrerà con un altro oggetto in quel momento (quindi il 1- 3 collisioni sapranno della collisione 2-3 e viceversa). Saprò quali bordi/angoli sono in contatto con cosa, pure.

Qualunque sia la soluzione deve essere robusto ... Per esempio, se l'installazione è resa più complicata come questi 2 esempi:

enter image description here

Il processo deve essere in grado di gestire tale e peggio. Ogni possibile catena di contatti/collisioni simultanee. Avrò tutti i dati a portata di mano che li descrivono, quindi "solo" ho bisogno di sapere come risolvere il caso generale di questi sistemi. Al momento non sto facendo nulla con la rotazione, il che semplifica le cose.

Sembra che implichi il raggruppamento di oggetti insieme, ma l'interferenza causata da spigoli che non sono ortogonali (si veda l'ultimo esempio con un esagono) sembrerebbe far fallire quell'approccio.

Ho visto a similar question che è stato chiesto prima, ma la risposta data non è mai stata verificata (vicolo cieco?). Non sono sicuro di come la propagazione degli shock possa risolvere il mio primo esempio, come C si sta allontanando dopo la prima collisione ... quindi quale shock c'è da propagare? edit: Ok, ora vedo che le collisioni simultanee e la propagazione degli shock sono due idee diverse, ecco perché non sembra utile.

+0

In realtà esiste una risposta alla domanda a cui ci si collega e che potrebbe essere quello che stai cercando. –

+0

@AlexSzatmary Non sono sicuro di quale approccio sia applicabile al mio primo esempio. Una volta che si è verificata una collisione, C si allontanerà ... Non c'è nessuno shock da propagare quando si ha a che fare con la seconda collisione. – user173342

risposta

4

Questo tipo di dynamic simulation of multi-contact physics dà origine a linear complementarity problem. Esistono algoritmi disponibili per risolvere this kind of problem; la matematica è correlata a quella utilizzata per problemi di programmazione lineare.

La necessità di risolvere questo tipo di problema è più comune di quanto si possa pensare. Qualsiasi tipo di simulazione vagamente realistica (vale a dire con collisioni gravitazionali, terrestri e anelastiche) finirà presto con oggetti che si appoggiano l'uno sull'altro; gestire con precisione e robustezza la transizione dalle collisioni dinamiche nello spazio, agli oggetti scorrevoli e rotanti, alle configurazioni di "block-stacking", può essere tecnicamente impegnativo.

Mi raccomando di cercare books or other resources sull'argomento. Esattamente quali tecniche effettivamente necessarie dipenderanno dalla tua specifica applicazione, ma potresti essere in grado di trovare alcune librerie che ti aiuteranno.

1

A seconda dell'ordine, calcolo le collisioni (1-3 prima o 2-3 prima), otterrò risultati diversi.

Che è corretto. Ciò è dovuto al modo in cui funziona la fisica delle collisioni. Considerate questo semplice esempio, utilizzando la prima figura:

m_1 = m_2 = m_3 
u_1 = u_2 
u_3 = 0 
x_1 = x_2 + d 

L'unica differenza tra 1 e 2 è che 1 è più vicino al 3 per d. 1 colpisce 3 prima, si ferma e v_3 diventa u_1 (u è iniziale e v è velocità finale). Poiché u_2 e il nuovo v_3 sono uguali, entrambi gli oggetti 2 e 3 procederanno verso destra a velocità costante con una distanza costante, d, tra di loro; non toccheranno mai. Se 1 e 2 sono scambiati, cioè se x_2 = x_1 + d, allora 2 colpisce 3 e si ferma, e 1 scia dopo 3 per d.

L'ordine delle collisioni è importante e il trattamento di collisioni simultanee come due collisioni istantanee successive darà risultati contrastanti a seconda dell'ordine in cui le collisioni vengono elaborate.

Le collisioni che si verificano realmente simultaneamente sono spesso un caso patologico (matematicamente) e probabilmente non è necessario risolverlo correttamente per un gioco o anche per molti modelli scientifici.

Se è davvero importante risolvere correttamente più collisioni elastiche, è possibile elaborare i calcoli matematici, ma è necessario aggiungere ulteriori presupposti. La collisione elastica di due corpi è dato dalla conservazione del momento:

m_1 u_1 + m_2 u_2 = m_1 v_1 + m_2 v_2 

e conservazione dell'energia:

(1/2) * m_1 u_1^2 + (1/2) * m_2 u_2^2 = (1/2) * m_1 v_1^2 + (1/2) * m_2 v_2^2 

Date le velocità iniziali degli oggetti, le velocità delle due oggetti post-collisione potrebbe Essere trovato. Se si voleva modificare queste equazioni per conto di un terzo oggetto,

m_1 u_1 + m_2 u_2 + m_3 u_3 = m_1 v_1 + m_2 v_2 + m_3 v_3 
(1/2) * m_1 u_1^2 + (1/2) * m_2 u_2^2 + (1/2) * m_3 u_3^2 = (1/2) * m_1 v_1^2 + (1/2) * m_2 v_2^2 + (1/2) * m_3 u_3^2 

una terza equazione indipendente avrebbe dovuto essere introdotto. Un semplice vincolo potrebbe essere che il trasferimento di moto degli oggetti 1 e 2 devono essere proporzionali alle loro masse:

m_1^2 (v_1 - u_1) = m_2^2 (v_2 - u_2) 

Questo sarebbe bello per la situazione rappresentata in figura 1: intuitivamente, ci si aspetterebbe 1 e 2 per avere la stessa velocità finale, e questo vincolo potrebbe darti questo. Attenzione, questa equazione non ha una base fisica chiara e può dare strani risultati in altri scenari. Sperimenta e vedi cosa sembra giusto.

Le equazioni citate su Wikipedia (le equazioni standard, abbastanza utili, da manuale) presumono che vi sia un trasferimento istantaneo di quantità di moto tra i due oggetti. Questo non è vero per niente nella vita reale. Quando una palla da biliardo colpisce un'altra, le sfere si deformano molto leggermente e questa deformazione richiede tempo; questa volta è in scala di millisecondi o meno ed è in genere trascurabile.

+0

Tutto ciò è molto vero, ma la mia simulazione è molto più semplice della realtà. Il tempo ha passi discreti e gli oggetti sono rigidi. Quindi, mentre un caso veramente simultaneo può essere patologico, ho la sfortunata necessità di doverlo gestire poiché è una possibilità inevitabile nella mia simulazione.E ho bisogno di gestirlo in modo deterministico, altrimenti ci saranno desinenze tra diversi clienti ... Ad ogni modo, quali sarebbero le ipotesi per affrontare questo? – user173342

+0

user173342, stai provando a modellare cosa succede realmente, o semplicemente qualcosa di plausibile (ad esempio per un gioco)? Molto diverso. Le simulazioni di vita reale regolano le dimensioni del passo in base alla configurazione (distanza tra oggetti e velocità). Mentre il tuo programma può essere deterministico e produrre sempre lo stesso risultato, nella vita reale ciò che accade quando fai la pausa di apertura nel biliardo non lo è. Se vuoi che produca risultati plausibili e realistici probabilmente dovrai introdurre dei suoni casuali come succede nella vita reale. Rendere questa simulazione autentica è difficile. Semplicemente plausibile è più facile. –

0

Eseguire le singole collisioni una per una, ma utilizzare sempre la velocità iniziale di ciascun oggetto. Al termine, aggiungi le variazioni di velocità per ciascun oggetto.

(v1_1,v3_1) = collide(u1,u3,m1,m3) 
(v2_2,v3_2) = collide(u2,u3,m2,m3) 
v1 = u1 + (v1_1 - u1) = v1_1 
v2 = u2 + (v2_2 - u2) = u2_2 
v3 = u3 + (v3_1 - u3) + (v3_2 - u3) = v3_1 + v3_2 - u3 

In questo modo, non sarà sensibile all'ordine.

Problemi correlati