Come faccio a costruire un motore fisico 2D? [chiuso]


20

I giochi più avanzati che ho realizzato sono un gioco di biliardo a 8 palline realizzato con il motore fisico Box2dFlashAS3 e un gioco a piattaforme con livelli.

Quando ho realizzato giochi platform, ho sempre desiderato sapere come realizzare un motore, in modo da poterlo riutilizzare. Quando vedo giochi che hanno pendenze, pendenze curve, gravità perfetta e fisica della vita reale, ho sempre desiderato sapere come programmare il motore.

Si prega di suggerire tecniche e articoli per qualsiasi base di conoscenza rilevante sia necessaria.


Risposte:


16

Mentre mi raccomando contro rotolare il proprio motore fisico per altro che l'esperienza di farlo (basta rendersi conto che probabilmente dovrebbe buttare via quando hai finito - è davvero difficile ottenere tutte le edgecases e il limite numerico / problemi di stabilità risolto e il tuo tempo potrebbe essere molto meglio utilizzato contribuendo a un motore esistente), ecco alcune risorse:

Lezioni di sala da biliardo: il rilevamento rapido e accurato della collisione tra cerchi o sfere discute cerchio / cerchio e sfera / sfera di collisione.

I tutorial N sono meravigliosi per una comprensione di base del rilevamento e della risposta basati sul teorema degli assi di separazione.


9

Erin Catto tiene tutte le lezioni GDC sull'implementazione di Box2D online. Box2D ha anche un codice semplice da leggere, nella mia esperienza.


i pdf sono materiali davvero difficili. Ma quando leggo i file cpp e h, come hai detto, sono "comprensibili". Grazie.
Vishnu,

+1. Box2D è anche molto attento alla stabilità, una delle cose che è molto difficile quando si procede da soli.
magro

5

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:

  1. Rilevamento : viene rilevato che due corpi si intersecano.
  2. Risoluzione : la posizione di ciascun corpo viene modificata in modo che non si intersecino più.
  3. 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.




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.