2012-04-28 8 views
5

Ho imparato a conoscere la collisione nella programmazione fisica e ho un grosso dubbio.Programmazione collisione oggetto (caso collisione multipla)

Pensando in sfere, quando una collisione con 2 sfere contemporaneamente, ho pensato che l'entità delle forze che sposta le sfere di entrambi, deve essere divisa per 2. Ma quando lo sto programmando, vedo sempre che una sfera ha più velocità della seconda, perché il modo in cui la programmo è collisione prima con una che con l'altra. Facciamo vedere un'immagine per disegnare chiaramente il problema:

enter image description here

In un primo momento rilevare la sfera rossa. Quindi viene rilevata la collisione e l'intensità della forza è come se ci fosse solo una sfera. Quindi rileva la sfera arancione e l'intensità della forza è inferiore alla prima.

Qualche idea di cosa devo usare per programmare questo, o se ho qualche idea sbagliata?

mod:

Inoltre, se mi aiuti alla ricerca di un meccanismo che rende questo accada ben vorrei darvi 50+ di più.

+0

Questo è realistico. Sei sicuro di volerlo rendere più "perfetto"? – Beta

+0

mi piace renderlo il più vicino possibile alla collisione reale in modo da rendere successive le stime se il costo computazionale non ne vale la pena. –

risposta

1

il problema è che per una collisione di due corpo, conservazione dell'energia e del momento sono sostanzialmente sufficienti per determinare l'esito, ma per un problema dei tre corpi questo non è più il caso. Anche se fai ciò che Mark e Daren suggeriscono, e determina tutti i corpi in collisione entro un timestep, non ti porta in alcun modo, perché 1) non saprai ancora come spostare gli oggetti dopo la collisione; e 2) la domanda principale su quanti oggetti considerare durante ogni collisione non è il timestep ma la deformazione degli oggetti, e se la trattate correttamente la sequenza di aggiornamento all'interno di un timestep non ha importanza. Ad esempio, se si dispone di oggetti molto morbidi, saranno probabilmente in contatto per molti timestep e gli oggetti molto duri solo per alcuni timestep.

Una buona risposta a questo problema è un po 'complicata, e la ragione di ciò è contenuta nella domanda bonus, ovvero qual è il meccanismo. Il meccanismo è fondamentalmente solo le cose che non stai considerando nel tuo problema semplificato: la deformazione degli oggetti, lo slittamento, la rotazione, ecc., Ma questi saranno generalmente problemi dominanti in tre collisioni del corpo.

Quello che fai dipende interamente da quanta precisione hai bisogno. Potresti semplicemente fingere che tutte le collisioni siano o tra due oggetti, o un terzo che colpisce due sia sempre esattamente simmetrico (che è un evento molto raro). Come inizio più accurato, puoi semplicemente considerare che sono oggetti deformabili, assumere che ogni collisione abbia un momento nel tempo in cui tutto è deformato al massimo, e quali sono le forze che derivano da queste deformazioni, e mandare via le cose in base a queste forze (F = dp/dt). Altre approssimazioni potrebbero essere fatte però, diciamo solo dividendo il trasferimento di quantità di moto in base al quale si viene colpiti per primi, e dando a questa una quantità proporzionale (la quantità di deformazione)/(la distanza dall'oggetto successivo), o qualcosa del genere.

-2

Questo è un caso di N-body problem. In generale non esiste una soluzione analitica, quindi è solo un'approssimazione. Trattarlo come due collisioni separate è un'approssimazione abbastanza buona.

[Modifica] Per chiarire: quando i tre corpi interagiscono tutti, per un periodo di tempo molto breve, è il problema di n-body. Non il problema del n-corpo di Newtoninan, ma un caso più generale.

+6

No, non * è * il problema N-body. – Beta

+0

Sì, lo è. L'unica differenza dal problema del corpo n di Newton è che questa non è forza gravitazionale, quindi la costante è diversa. L'interazione segue ancora una legge a distanza inversa quadrata. Anche se lo si semplifica in un'interazione istantanea. – Aleph7

+0

Per errore ho votato questo. Scusa, penso che tu abbia ragione, in quanto tutto è determinato dal momento della collisione, quando sono tutti deformati e in contatto, e quindi è un problema di tre corpi. (È troppo tardi per me cambiare, ma se modifichi la tua risposta farò l'upvote.) – tom10

1

Fate attenzione a testare tutte le possibili interazioni a coppie prima di calcolare eventuali forze, cambiamenti di velocità, energia, ecc. Suoni come la simulazione fisica è felice di calcolare la dinamica subito dopo la prima collisione rilevata.

+0

come calcoleresti la dinamica? –

1

Che DarenW significava (come un n00b Non posso commentare la sua risposta direttamente) era che la sequenza dovrebbe andare qualcosa come questo:

//test for collisions 
blueHitRed = didCollide(blue, red) 
blueHitOrange = didCollide(blue, orange) 
... 
//calculate resultant velocities 
red.velocity = ... 
orange.velocity = ... 
blue.velocity 

considerando che appare dalla descrizione che qualcosa di simile è in realtà accadendo

//red 
blueHitRed = ... 
red.velocity = ... 
blue.velocity = ... 
//orange 
blueHitOrange = ... 
orange.velocity = ... 
blue.velocity = ... 
+0

Mmmmm, questo è un ottimo modo. Calcola ciò che collide con cosa e poi calcola la velocità in ordine. Un punto per te :). –