2013-06-15 2 views
5

Ho implementato un caricatore MD5 con software skinning. La posa di legatura in md5 è la posizione finale, assoluta e le rotazioni, è sufficiente eseguire calcoli per i pesi che dipendono dalle articolazioni.OpenGL: Animazione ossea, Perché ho bisogno di un'inversione della posa Bind quando si lavora con la GPU?

Ho provato a implementare la skin GPU ma sono bloccato in un punto. Dal momento che queste coordinate sono definitive, perché non posso convertire i miei vettori 3d e quaternioni in una matrice e caricarla sullo shader? Come ho letto qui: http://3dgep.com/?p=1356, ho bisogno di moltiplicare il mio scheletro con l'inverso della posa di legame. Ma non capisco questa parte perché ho sempre pensato che l'unica cosa che devo fare è caricare le matrici finali sulla GPU e calcolare il resto (somma di pesi ecc. Ecc.)

Mi puoi spiegare comportamento del legame inverso?

risposta

5

Onestamente, l'articolo è un po 'troppo da elaborare completamente. Sembra che le matrici di posa a legame inverso siano utilizzate per trasformare i vertici nei sistemi di coordinate locali delle ossa.

Ciò è necessario, poiché le trasformazioni delle ossa sono locali (relative alle loro articolazioni principali). Quindi, per animare un vertice, devi trasformarlo in un sistema di coordinate locale di un osso, calcolare le trasformazioni locali dell'osso e trasformarlo nel sistema del mondo.

+0

In quel momento, penso di aver capito l'idea dietro. Abbiamo già caricato i vertici del bind pose, tutto ciò che ho bisogno di trasformarli e secondo lo scheletro corrente. Poiché tutti i miei vertici sono già nello spazio del mondo, ho bisogno di convertire le matrici assolute del nuovo scheletro nello spazio comune perché ho bisogno dell'offset, quindi moltiplicare il risultato con i miei vertici, infine moltiplicare con la matrice modelview. – deniz

10

Come l'autore originale di questo articolo, cercherò di spiegare che cosa moltiplicazione per il bind inversa posa fa:

Il "legare inversa posa" fondamentalmente "annulla" ogni trasformazione che è già stata applicata al modello nella sua posa legante.

Considerare in questo modo: Se si applica la matrice di identità a ogni giunto nel modello, ciò che si otterrà sarà il modello nella posizione di collegamento (si può provare inviando una cornice di scheletro piena di matrici di identità. quale risultato è la posa vincolante, quindi lo stai facendo bene).

Se si applicano le matrici di posa di rilegatura (non convertite) a ogni giunto nel modello, ciò che si otterrà sarà lo spaghetto perché si applicherà la posa di rilegatura due volte!

Quindi, per risolvere il modello di spaghetti, è sufficiente moltiplicare le trasformazioni congiunte risultanti dalla posa di rilegatura inversa per "annullare" la trasformazione che è già stata applicata al modello.

Spero che questo chiarisca un po '...

+1

+1, visualizzare il mio modello come spaghetti mi ha fatto ridere. –