Ecco come potresti farlo:
Movimento approssimativo
Ogni oggetto fisico ha bisogno di questi vettori:
- Posizione : dove si trova l'oggetto.
- Velocità : come sta cambiando la sua posizione.
- Accelerazione : come sta cambiando la sua velocità.
Quindi, intuitivamente, devi fare questo genere di cose ogni fotogramma per ogni oggetto fisico a
:
a.speed += a.acceleration
a.position += a.speed
Insidie : questo è noto come il metodo di integrazione Euler . Questa approssimazione è migliore per piccole velocità e accelerazioni e con piccoli intervalli di tempo. In un gioco, questo è normalmente vero. Ma se un oggetto si muove molto velocemente verso un muro sottile o direttamente verso un altro oggetto in movimento, può saltare la collisione con quell'oggetto quando la sua posizione viene incrementata di una quantità sufficiente per attraversarlo completamente. Se hai oggetti in rapido movimento, potresti aver bisogno del rilevamento di collisioni continue per cavartela .
Collisione
La collisione può essere approssimata con questo tipo di sequenza:
- Rilevamento : viene rilevato che due corpi si intersecano.
- Risoluzione : la posizione di ciascun corpo viene modificata in modo che non si intersecino più.
- Fisica : la velocità di ciascun corpo viene modificata per tenere conto di quantità di moto, attrito e restituzione (rimbalzo).
Questo è noto come rilevamento discreto di collisioni, come accade in punti discreti nel tempo. Ogni passaggio merita attenzione:
Passaggio 1: rilevamento delle collisioni (le cose si stanno scontrando?)
Per due cerchi : controlla solo se i loro centri sono più della somma dei loro raggi separati.
Per due rettangoli : controlla se una delle loro coordinate angolari si trova all'interno dell'altro rettangolo.
Per qualsiasi cosa che coinvolga poligoni più complessi , avrai bisogno del teorema dell'asse di separazione , che è un argomento per un'altra domanda.
Insidie : ci sono davvero molti altri tipi di collisione che potresti voler prendere in considerazione. Alcuni sono davvero complessi: i poligoni convessi potrebbero intersecarsi più volte !
Passaggio 2: risoluzione delle collisioni (spostandole separatamente)
Un metodo semplice per risolvere una collisione è la traduzione mediante penetrazione minima , utilizzando i valori ottenuti dal rilevamento delle collisioni. Ciò comporta essenzialmente lo spostamento degli oggetti con la minima distanza possibile di movimento.
Ad esempio, considerare la collisione cerchio-cerchio in cui uno dei cerchi è fissato in posizione. Il vettore di spostamento minimo ha la stessa direzione della differenza tra i loro vettori del punto medio. La sua lunghezza è la differenza tra la somma dei loro raggi e la distanza tra i centri.
Questa idea si generalizza facilmente ad altre forme.
Insidie : se entrambi gli oggetti in collisione sono mobili, potrebbe essere necessario spostarli entrambi di una frazione della distanza complessiva per ottenere un'approssimazione credibile del loro movimento. Dovranno ovviamente spostarsi in direzioni diverse.
Passaggio 3: fisica della collisione (altre modifiche)
La cosa più ovvia che tende ad accadere è che uno o due oggetti cambiano direzione, cioè ruota il suo vettore di velocità. È abbastanza facile da implementare.
Insidie : gli oggetti potrebbero essere elastici , ma potrebbero non esserlo , nel qual caso l'energia totale nel sistema viene ridotta. Potrebbe essere necessario trascinare a causa della resistenza dell'aria. L'attrito (in particolare l' attrito statico ) è notoriamente complesso da implementare .
Alcune conclusioni
La simulazione della realtà è esponenzialmente più difficile se si desidera simulare. Stai camminando in un campo minato di innumerevoli casi limite, formule incredibilmente difficili e pile di documenti di ricerca in continua crescita.
Se le tue esigenze sono semplici o sei ansioso di imparare, provalo.
Se le tue esigenze sono complesse o non ti piacciono i calcoli matematici, chiedi a un motore fisico di esaminare i dettagli per te. Box2D e Bullet sono piuttosto popolari nei giochi.