Come dovrei gestire piccoli oggetti in un motore fisico?


13

Sto realizzando un motore fisico 3D per lanciare dadi. Fino ad ora un dado era 1x1x1m e la gravità era 9,82 m / s ^ 2. Questo ovviamente non sembra realistico in quanto i dadi risponderanno a tutto in un modo che sembra un po 'lento.

Per risolvere questo problema, ho provato a cambiare tutte le dimensioni per fare in modo che un dado si trovasse a circa 0,02 m lungo un lato. Questo a sua volta ha fatto sì che le mie masse inverse e le matrici di inerzia inversa ottengano valori molto grandi che portano all'instabilità numerica.

Qual è il percorso migliore per gestirlo? Posso mantenere la scala in modo che un dado sia 1x1x1 e cambiare solo la massa o la dimensione delle forze che agiscono? O dovrei modificare qualcos'altro?

Immagino che lo stesso problema potrebbe sorgere se facessi un gioco con corpi fisici molto grandi come astronavi o qualcosa del genere, quindi spero che qualcuno abbia mai incontrato qualcosa di simile prima.


Non sono un esperto qui, ma, senza alcun codice, come possiamo sapere qual è il problema? Probabilmente mi sbaglio, però, poiché Box2D ha gli stessi problemi.
jcora,

1
(Vedendo tutti i voti positivi, ci deve essere un modo convenzionale di codificare queste cose e la gente sembra sapere qual è il tuo problema. Immagino di aver sbagliato.)
jcora

1
Sì, ho pensato che ci potesse essere un modo convenzionale per gestirlo. A mio avviso, questo non è un problema di codice ma piuttosto un problema di precisione numerica. Quello che sto cercando non è uno snippet di codice per risolvere il mio problema, ma piuttosto una spiegazione di un approccio al problema.
Mikael Högström,

Vuoi dire precisione in virgola mobile?
jcora,

In un certo senso sì. L'inverso della matrice di inerzia che utilizzo nella gestione delle collisioni ottiene valori molto grandi. In realtà non è mal condizionato poiché gli elementi pivot ottengono grandi valori e non ci sono molte aggiunte in corso, ma in qualche modo deve esserci un problema con la precisione numerica poiché la simulazione gira rapidamente fuori controllo.
Mikael Högström,

Risposte:


1

Potresti

  • aumentare la costante di gravità? I giochi usano spesso 2 * 9,81 m / s ^ 2. Non riesco a ricordare dove l'ho letto, ma i giochi usano di solito unità insensate. Qualunque sia la costante costante (rendi il gioco divertente). L'uso di una costante realistica fa sembrare la fisica lenta e fluttuante.
  • eseguire la simulazione a una velocità maggiore. Se stai utilizzando un timestep fisso, questo aumenterà il tasso di animazione.
  • usare galleggianti di precisione più elevata?

Il secondo punto non farà altro che rendere la simulazione più fluida, o forse addirittura romperla se la simulazione viene eseguita troppo velocemente (non sono sicuro che si tratti di un problema realistico, ma se il mondo avanza prima che sia trascorso un millisecondo, il tempo la differenza sarebbe sempre 0 e nulla funzionerebbe). Potrebbe anche non voler sprecare memoria su float di precisione più elevata.
jcora,

1
I giochi usano spesso la doppia gravità? Dice chi?
GameDev-er

Non riesco a cambiare la velocità o la precisione, ma proverò a cambiare la gravità.
Mikael Högström,

La modifica della costante di gravità rende i dadi generalmente più veloci, dando l'impressione che tutto sia in scala minore. Ciò rende il comportamento più nervoso anche se anche con microcollisioni per gestire l'accelerazione tra i frame. Immagino che dovrò modificarlo :)
Mikael Högström il

4

Nel caso in cui tu abbia problemi con piccoli valori numerici, ti suggerisco di ridimensionare semplicemente tutto. Potresti anche non usare unità di misura "reali", ma solo alcune unità "generiche" che hanno senso solo all'interno del motore.

La prima opzione, ridimensionando, richiederebbe l'uso di millimetri o centimetri come unità di misura di base. Le dimensioni del tuo cubo non subirebbero quindi una perdita di precisione.

La seconda soluzione è sostanzialmente la stessa cosa, ma non dovresti pensare alle unità reali.

Inoltre, perché non cambi semplicemente la massa del cubo?


Poiché gli unici generatori di forza che ho sono la variazione della massa basata sulla gravità / accelerometro non cambia il comportamento. Il tuo suggerimento potrebbe essere usato al contrario (forse è quello che volevi dire) dando ai piccoli oggetti una massa più grande, avvicinando le loro masse inverse a una e riducendo così l'instabilità numerica. Questo dà gli stessi problemi del solo aumentare la costante di gravità.
Mikael Högström,


0

Ho pensato di condividere la mia soluzione finale al problema. Aumentare la costante di gravità come suggerito ha effettivamente fatto muovere i dadi più velocemente dando così l'impressione di una scala corretta. Ciò, tuttavia, ha aumentato i problemi di microbouncing. Ho aggiunto microcollisioni che hanno mitigato il problema anche se non lo hanno risolto perfettamente. Nota che questo diventa un problema solo per gli oggetti "piccoli", se hai il problema inverso e vuoi simulare oggetti molto grandi (astronavi o qualcosa del genere), allora non avrai alcun problema di microbouncing e puoi farcela quella soluzione.

Così ho trovato il livello di gravità più alto che potessi avere senza troppo "microbouncing". Quindi ho usato un semplice rilevamento delle vibrazioni sul telefono che ha risposto a grandi cambiamenti rispetto alle letture dell'accelerometro e ha applicato gli impulsi a tutti gli oggetti quando tali vibrazioni sono state rilevate. Non è perfetto, ma poiché imposta i dadi in rapido movimento quando il telefono viene scosso, darà l'impressione di dadi "piccoli". È un po 'un trucco ma dovrà farlo :) Ecco una clip del motore in azione.

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.