Fisica delle collisioni in un ambiente 2d

SoulStorm
Salve a tutti,

per un progettino sto programmando un gioco in 2d e volevo introdurre un minimo di fisica di base, più precisamente ciò che mi interessa è gestire una collisione di due o più oggetti in movimento. La mia fisica è parecchio arrugginita dato che l'ultima volta che l'ho presa in mano per programmare risale a parecchi anni, forse voi potete aiutarmi. :D

Considerando che si tratta di una simulazione nel modello non considererò un'infinità di fattori. Nello specifico assumiamo che ogni oggetto abbia una velocità, una massa ed una direzione.

Un ipotetico oggetto A può essere così riassunto:
v = 256 pixel/sec
m = 7
d = 45°


La massa non ha unità di misura poiché mi serve solo per capire l'entità della collisione, è una sorta di "valore proporzionale", se per esempio l'oggetto X ha massa 5 e l'oggetto Y ha massa 7 altro non sta ha significare che la massa di X è 5/7 rispetto a quella di Y.
La direzione è in gradi, come ho detto all'inizio sto lavorando in un ambiente a 2 dimensioni.
La velocità è costante.

Ora viene il bello. Aggiungiamo un'altro oggetto, l'oggetto B, con le seguenti caratteristiche:
v = 512 pixel/sec
m = 4
d = 80°


Ipotiziamo ora che l'oggetto A e l'oggetto B entrino in collisione. La mia domanda è la seguente, dopo la collisione come vengono modifichete le rispettive velocità, masse e direzioni degli oggetti A e B?
Per semplicità consideriamo solo tre tipi di collisione: scontro frontale, collisione sul fianco e scontro da dietro.

Per ulteriore semplicità nello scontro frontale e da dietro NON prendiamo in considerazione la direzione ok? assumiamo che sia "opposta" nel primo caso (eg. 90° e -90°/270°) e uguale nel secondo.

Per esempio, in uno scontro da dietro requisito fondamentale è che l'oggetto che "tampona" sia più veloce dell'oggetto tamponato. Ciò che mi aspetto, correggetemi se sbaglio, è che l'oggetto tamponato riceva una piccola spinta mentre l'oggetto che tampona decelleri (ovviamente bisogna considerare anche la massa degli oggetti). Le due velocità quindi si modificano, bene, secondo quale formula?

Nel caso dello scontro frontale invece mi aspetto che se per esempio le masse sono simili i due oggetti dopo lo scontro riducano notevolmente la velocità e comincino a viaggiare nella direzione opposta (come ho detto prima per semplicità non consideriamo l'attrito e un milione di altri fattori :D ). Anche qui, secondo quale formula la loro velocità si modifica?

Ed ora l'ultimo caso, quello della collisione sul fianco. Questo è il più ostico perché oltre ad un cambio di velocità mi aspetto anche un cambio di direzione. Per esempio, prendiamo il caso ideale di due oggetti con stessa massa e stessa velocità che viaggiamo uno con direzione 45° e l'altro a 315° (o -45°). I due collidono sul lato, a questo punto ciò che mi aspetto, è che le loro direzioni si invertano (ancora, correggetemi se ho detto una stupidata :-D ). Questo caso era ideale ed intuitivo, considerando un caso più "realistico" con oggetti con velocità e massa diversi qual'è la formula univoca? Suppongo c'entri anche un po' di trigonometria qui... :shock: .


Scusate se insisto sulla "formula", io capisco che quello che vince è il ragionamento ma ahimè a volte è difficile "distillare" un ragionamento in un algoritmo, riassumerlo in una singola formula per capirci.
Il fatto è che ciò che dovrò implementare è qualcosa del tipo:
function processCollision(object1, object2)

Quindi ben venga il ragionamento, che certamente mi aiuterà a performare l'algoritmo, ma purtroppo ho bisogno anche di un po' di cara e vecchia matematica dalla quale partire. ;-)


Grazie a tutti in anticipo per eventuali risposte :-D

Risposte
Quinzio
In partica quello che vuoi simulare è un "biliardo".
Credo che ti convenga subito partire con qualcosa che sia un minimo realistico, evitando di complicarti la vita successivamente.
Per fare questo dovresti evitare di definire gli oggetti come puntiformi, ma invece dovresti dargli una forma (la più semplice: un disco). Fatto questo le velocità andrebbero definite come vettori.
A questo punto tutti gli scontri si riducono a scontri unidirezionali, raggruppando sia lo sontro frontale che posteriore.
Un'altra cosa da definire subito è se gli scontri sono elastici o anelastici, ma credo che tu voglia uno scontro completamente elastico, cioè il rimbalzo ideale tipico delle palle da biliardo.
Va bene ?

SoulStorm
La fisica di un tavolo da biliardo senza attrito o altre forze in gioco (elastico come hai detto) sarebbe buona se però si considera che la pallina bianca potrebbe colpire palle ferme o palle già in movimento.

Per quanto riguarda la forma ho evitato di proposito di prenderla in considerazione per il semplice fatto che gli oggetti sono poligoni con almeno 15-20 vertici e il tutto diventerebbe notevolmente complicato . La forma, nel mio caso, è un aspetto unicamente grafico e ho considerato gli oggetti come puntiformi perché le collisioni vengono rilevate per punti. Ad ogni modo ok, consideriamo che nell'ipotetico punto x,y si scontrino due dischi ^^.

Per quanto riguarda il definire le velocità come vettori ok ma... perdonami, come scritto sopra non riesco a ricordare l'ultima volta che gli ho usati :(, ho un'idea di cosa siano ma matematicamente parlando non so usarli a meno che si tratti di un urto unidirezionale dove di fatto ho bisogno solo del modulo. =(
Se non sbaglio a riguardo ho letto che devo scomporre il vettore velocità in base al punto di collisione. Insomma, credo di essermi avventurato in qualcosa oltre la mia portata =)

Quinzio
Non è fantascienza, però serve una certa dimestichezza con i vettori.
Prova poi chiedi quello che non riesci a fare.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.