2010-07-16 33 views
8

Sto provando a sperimentare con motori di fisica 2D in C++. Finora, sembra il più popolare è Box2D. Sfortunatamente, Box2D è un motore di fisica del corpo rigido e non mi aiuterà veramente con quello che voglio provare.Motori fisici 2D non rigidi in C++

Voglio essere in grado di definire una forma che ha un numero di vertici uniti da molle, in modo tale che quando questa forma si scontra con forme rigide o altre non rigide, la sua forma sarà flessibile.

Ora ho cercato di pensare a modi di fare questo in Box2D utilizzando solo corpi rigidi, ma ci sembra sempre di essere difetti:

  1. Utilizzare rettangoli o segmenti di linea per i bordi esterni della forma flessibile . Questi si scontreranno con altre forme. Sfortunatamente, non sono elastici, quindi l'effetto desiderato non sarebbe visto.
  2. Ogni vertice della forma potrebbe essere un corpo con la sua piccola forma circolare. Questi corpi possono quindi essere uniti tra loro da molle. Ciò funzionerebbe benissimo in termini di deformazione della forma, ma immaginate se la forma fosse atterrato su una punta rigida e il picco appena passato tra i vertici. Quindi la forma si sarebbe bloccata sul picco.

Quindi qual è il modo migliore per eseguire questo tipo di fisica in C++? Preferibilmente senza dover scrivere un intero motore fisico. Forse mi manca solo una funzionalità di Box2D. Forse non è la scelta giusta. Allora qual è la scelta giusta?

risposta

3

Ci sono diversi pacchetti/motori là fuori che supportano corpi deformabili/morbidi. Se vuoi qualcosa di gratuito puoi, ad esempio, controllare Phyz, SOFA o Bullet.

C'è un elenco dettagliato su wikipedia. La maggior parte di questi sono basati su 3D ma è possibile adattarli a un modello 2D impostando la scena come un piano.

Felice codifica!

0

Non so davvero quale sia il modo migliore, ma here, vicino alla fine della pagina è il codice per "molle".

1

Se si sta cercando solo la deformazione, suggerirei di utilizzare un modello di poligono (trimesh) in cui raccogliere i callback delle collisioni sul corpo rigido che rappresenta quella forma. Sul punto di collisione, determinerei la quantità di deformazione causata da uno o più vertici.

Per l'indeformabilità, suggerire che ogni punto temporale debba scorrere i punti deformati e cercare di spingerli verso l'esterno. Immagino che la query possa essere fatta attraverso query di sfere molto piccole nel tuo mondo di collisioni. Ciò richiederebbe anche di mantenere una posizione "massima" non deformata.

Questo metodo sarebbe abbastanza semplice da implementare anche se non sarebbe un "corpo morbido" che potrebbe essere quello che stai cercando. http://chriscavanagh.wordpress.com/2008/06/24/silverlight-soft-body-physics/ sembra un'implementazione che fornisce il codice sorgente che potresti voler esaminare.