Flash Sale! Up to 40% off on unlimited courses, tutorials and creative asset downloads Up to 40% off on unlimited assets SAVE NOW
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

Simulare panno Tearable e Ragdolls con Verlet semplice integrazione

by
Difficulty:IntermediateLength:LongLanguages:

Italian (Italiano) translation by Loris Pizii (you can also view the original English article)

Dinamica del corpo morbido è sulla simulazione realistici oggetti deformabili. Qui useremo per simulare una tenda di Panno tearable e una serie di bambole di pezza che si può interagire con e fling intorno allo schermo. Sarà veloce, stabile e abbastanza semplice da fare con la matematica livello della high school.

Nota: Anche se questo tutorial è scritto in elaborazione e compilato con Java, si dovrebbe essere in grado di utilizzare le stesse tecniche e concetti in qualsiasi ambiente di sviluppo del gioco.


Anteprima del risultato finale

In questa demo, è possibile visualizzare una tenda grande (mostrando la simulazione di tessuto) e una serie di piccoli omini (mostrando la simulazione di ragdoll):

Si può provare la demo, troppo. Fare clic e trascinare per interagire, premere 'R' per reimpostare e colpire 'G' per attivare o disattivare la gravità.


Passaggio 1: Un punto e il suo movimento

Gli elementi costitutivi del nostro gioco con essere il punto. Per evitare ambiguità, che chiameremo il PointMass. I dettagli sono nel nome: è un punto nello spazio, e rappresenta una quantità di massa.

Il modo più semplice per implementare fisica per questo punto è di "trasmettere" la sua velocità in qualche modo.


Passaggio 2: Timesteps

Non ci assumiamo che la nostra gioco girerà alla stessa velocità tutto il tempo. Si potrebbe correre a 15 fotogrammi al secondo per alcuni utenti, ma a 60 per gli altri. È meglio conto per frame rate di tutte le gamme, che possono essere fatto utilizzando un temporale.

In questo modo, se un telaio dovesse richiedere più tempo che deve trascorrere per una persona che per un altro, il gioco sarebbe ancora alla stessa velocità. Per un motore di fisica, tuttavia, questo è incredibilmente instabile.

Immaginate se il gioco si blocca per un secondo o due. Il motore sovracompensazione per quello e spostare il PointMass passato diversi muri e oggetti che altrimenti sarebbe rivelato una collisione con. Così, non solo ne risentirebbe rilevamento delle collisioni, ma anche il metodo di risoluzione di vincoli che useremo.

Come possiamo avere la stabilità della prima equazione, x = x velX, con la coerenza della seconda equazione, x = x velX * timeElapsed? Cosa succede se, forse, si potrebbe combinare i due?

Che è esattamente quello che faremo. Immaginate che la nostra timeElapsed era 30. Potremmo fare la stessa cosa come l'equazione di quest'ultimo, ma con una maggiore precisione e risoluzione, dal chiamante x = x (velX * 5) sei volte.

L'algoritmo qui utilizza un temporale fisso maggiore di uno. Trova il tempo trascorso, si scompone in "blocchi" di dimensioni fisse e spinge il restante importo di tempo sopra al fotogramma successivo. Si eseguita la simulazione poco a poco per ogni pezzo in che il nostro tempo trascorso è suddiviso.

Ho preso 16 per la dimensione temporale, per simulare la fisica come se fosse in esecuzione a circa 60 fotogrammi al secondo. Conversione da elapsedTime a fotogrammi al secondo può essere fatto con po ' di matematica: 1 secondo / elapsedTimeInSeconds.

1S / (16ms/1000s) = 62,5 fps, quindi un timestep 16ms equivale a 62,5 fotogrammi al secondo.


Passaggio 3: vincoli

I vincoli sono restrizioni e regole aggiunte alla simulazione, guida dove PointMasses può e non può andare.

Possono essere semplici come questo vincolo di contorno, per prevenire PointMasses muoversi fuori il bordo sinistro dello schermo:

Aggiunta il vincolo per il bordo destro dello schermo è fatto allo stesso modo:

Fare questo per l'asse y è una questione di cambiare ogni x a una y.

Avere il giusto tipo di vincoli può provocare interazioni molto belle e accattivante. I vincoli possono diventare estremamente complessi. Provate a immaginare che simula un cesto vibra dei grani con nessuno dei grani che si intersecano, o a 100-giunto robotico del braccio, o anche qualcosa di semplice come una pila di scatole. Il processo tipico coinvolge trovando punti di collisioni, trovare il tempo esatto di collisione e quindi trovare la giusta forza o impulso da applicare a ciascun organismo per prevenire tale collisione.

Comprendere la quantità di complessità che può avere una serie di vincoli può essere difficile, e quindi risolvere tali vincoli, in tempo reale è ancora più difficile. Quello che stiamo facendo è semplificare vincolo risolvendo in modo significativo.


Passaggio 4: Verlet integrazione

Un matematico e un programmatore chiamato Thomas Jakobsen esplorato alcuni modi di simulazione fisica dei caratteri per i giochi. Egli propose che la precisione è non quasi importante quanto la credibilità e le prestazioni. Il cuore del suo algoritmo intero era un metodo utilizzato dal anni ' 60 di dinamica molecolare di modello, chiamato Verlet integrazione. Si potrebbe avere familiarità con il gioco Hitman: Codename 47. Era uno dei primi giochi ad utilizzare fisica ragdoll e utilizza gli algoritmi sviluppati Jakobsen.

Integrazione di Verlet è il metodo che useremo per trasmettere la posizione del nostro PointMass. Quello che abbiamo fatto prima, x = x velX, è un metodo chiamato integrazione di Euler (che ho usato anche in codifica terreno Pixel distruttibili).

La differenza principale tra Euler e integrazione Verlet è come viene implementata la velocità. Utilizzando Euler, una velocità viene memorizzata con l'oggetto e viene aggiunto alla posizione dell'oggetto ogni fotogramma. Tuttavia, utilizzando Verlet, applica inerzia utilizzando la posizione precedente e attuale. Prendere la differenza nelle due posizioni e aggiungerlo alla posizione più recente per applica l'inerzia.

Abbiamo aggiunto accelerazione in là per gravità. Diverso da quello, accX e accY non sara ' necessario per risolvere le collisioni. Utilizzando l'integrazione di Verlet, dobbiamo non più fanno ogni sorta di impulso o forzare risolvendo per collisioni. Cambiando la posizione da sola sarà sufficiente avere una simulazione realistica, stabile e veloce. Che cosa Jakobsen sviluppato è un sostituto lineare per qualcosa che altrimenti è non lineare.


Passaggio 5: Link vincoli

I vantaggi dell'integrazione Verlet possono essere meglio dimostrati attraverso l'esempio. In un motore di tessuto, avremo non solo PointMasses, ma anche dei legami tra di loro. Nostri "link" sarà un vincolo di distanza tra due PointMasses. Idealmente, vogliamo due PointMasses con questo vincolo di essere sempre a una certa distanza.

Ogni volta che risolviamo questo vincolo, Verlet integrazione dovrebbe tenere questi pointmasses in movimento. Ad esempio, se un'estremità doveva essere spostati rapidamente verso il basso, l'altra estremità deve seguire come una frusta inerzia.

Avremo bisogno solo un collegamento per ogni coppia di PointMasses collegati tra loro. Tutti i dati di cui avrai bisogno nel link è il PointMasses e le distanze che riposa. Facoltativamente è possibile avere rigidità, per più di un vincolo di primavera. Nella nostra demo abbiamo anche una "sensibilità di lacrima," che è la distanza alla quale verrà ottenere rimosso il link.

Ti spiego solo restingDistance qui, ma la distanza di lacrima e rigidità sono entrambi implementati nella demo e il codice sorgente.

È possibile utilizzare algebra lineare per risolvere per il vincolo. Trovare le distanze tra i due, determinare quanto lontano lungo il restingDistance sono, poi tradurli basato su che e le loro differenze.

Nella demo, ci conto per massa e rigidezza pure. Ci sono alcuni problemi nella risoluzione di questo vincolo. Quando ci sono più di due o tre PointMasses legata alla vicenda, risolvere alcuni di questi vincoli può violare altri vincoli precedentemente risolti.

Thomas Jakobsen ha rilevato questo problema pure. In un primo momento, uno potrebbe creare un sistema di equazioni e risolvere per tutti i vincoli in una volta. Questo aumenterebbe in complessità rapidamente però e sarebbe difficile aggiungere più di anche solo un paio di link nel sistema.

Jakobsen ha sviluppato un metodo che potrebbe sembrare sciocco e ingenuo in un primo momento. Ha creato un metodo chiamato "relax", dove invece di risolvere una volta per il vincolo, risolviamo per esso parecchie volte. Ogni volta ribadiamo e risolvere per i collegamenti, il set di collegamenti più avvicina a tutti essere risolto.

Passaggio 6: Portare insieme

Per ricapitolare, ecco come funziona il nostro motore in pseudocodice. Per un esempio più specifico, controlla il codice sorgente di demo.


Passaggio 7: Aggiungere un tessuto

Ora possiamo costruire il tessuto stesso. Creare i link dovrebbe essere abbastanza semplice: collegamento a sinistra quando il PointMass non è la prima sulla sua riga e collegare quando non è il primo nella sua colonna.

La demo utilizza un elenco unidimensionale per memorizzare PointMasses e trova i punti a cui collegarsi utilizzando x y * larghezza.

Si potrebbe notare nel codice che abbiamo anche "pin PM." Se non vogliamo che la nostra tenda a cadere, possiamo chiudere la prima fila di PointMasses alle loro posizioni di partenza. Per programmare un vincolo perno, aggiungere alcune variabili per tenere traccia della posizione del perno e quindi spostare il PointMass in quella posizione dopo ogni vincolo risolvere.


Passaggio 8: Aggiungere alcuni Ragdolls

Ragdolls sono stati dietro suo uso di integrazione Verlet le intenzioni originali di Jakobsen. Prima inizieremo con le teste. Creeremo un vincolo di cerchio che interagirà solo con il contorno.

Successivamente possiamo creare il corpo. Ho aggiunto di ogni parte del corpo per soddisfare un po ' esattamente le proporzioni di massa e la lunghezza di un normale corpo umano. Scopri Body.pde nei file di origine per tutti i dettagli. Facendo questo ci condurrà ad un'altra questione: il corpo sarà facilmente contorcere in forme imbarazzante e aspetto molto realistico.

Ci sono un certo numero di modi per risolvere questo problema. Nella demo, utilizziamo link invisibile e molto unstiff dai piedi alla spalla ed al bacino alla testa per naturalmente spingere il corpo in posizione di riposo meno imbarazzante.

È anche possibile creare vincoli di falso-angolo utilizzando i collegamenti. Consente di dire che abbiamo tre PointMasses, con due collegati a uno nel mezzo. È possibile trovare una lunghezza tra le estremità al fine di soddisfare qualsiasi angolazione prescelta. Per trovare tale lunghezza, è possibile utilizzare la legge dei coseni.

Modificare il collegamento in modo che questo vincolo si applica solo quando la distanza è inferiore alla distanza di riposa, o, se ha più di. Ciò manterrà l'angolo al centro da sempre di essere troppo vicino o troppo lontano, a seconda di che cosa avete bisogno.


Passaggio 9: Altre dimensioni!

Una delle grandi cose con avendo un motore fisico completamente lineare è il fatto che può essere qualsiasi dimensione che desideri. Tutto fatto a x è stato fatto anche per un valore di y, e thereforce può essere exended a tre o addirittura quattro dimensioni (non sono sicuro di come si renderebbe che, però!)

Ad esempio, qui è un vincolo di collegamento per la simulazione in 3D:


Conclusione

Grazie per la lettura! Gran parte della simulazione si basa pesantemente al largo fisica di carattere superiore articolo di Thomas Jakobsen dal GDC 2001. Fatto del mio meglio per la maggior parte della roba complicata della striscia e semplificare al punto che molti programmatori capirà. Se avete bisogno di aiuto, o per qualsiasi commento, non esitate a postare qui sotto.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.