2013-02-26 15 views
5

In un'applicazione Android voglio disegnare una gamba in esecuzione. Per produrre la parte superiore della gamba che faccio qualcosa di simile:Come ottengo una matrice in cui tradurre, quindi ruotare, quindi tradurre poi ruotare una seconda volta?

// legCX,legCY is the location on screen about which the leg rotates. 
Matrix m = new Matrix(); 
m.postTranslate(-legCX,-legCY); 
m.postRotate(legRot); 
m.postTranslate(legCX,legCY); 

ho quindi impostare la matrice alla tela e disegnare la gamba.

Come si disegna la seconda parte della gamba sotto il ginocchio? Ruota ad una velocità diversa rispetto alla gamba sopra di esso e ha un punto centrale che si muove con la gamba sopra di essa. Ho provato quanto segue, ma si scopre che il risultato finale è la rotazione attorno ad un singolo punto che non segue la gamba sopra.

Matrix m = new Matrix(); 
m.postTranslate(-legCX,-legCY); 
m.postRotate(legRot); 
m.postTranslate(0,-legLength); 
m.postRotate(footRot); 
m.postTranslate(0,legLength); 
m.postTranslate(legCX,legCY); 

ho il sospetto che probabilmente è necessario fare due rotazioni in due diversi oggetti Matrix e poi combinarli in qualche modo, ma non riesco a capire come esattamente fare.

MODIFICA: Questo tipo di matrice sembra essere chiamato "matrice di trasformazione". La combinazione di più operazioni si chiama composizione delle trasformazioni. Tuttavia, nessuna delle pagine su questo argomento menziona come eseguire una serie di traduzioni e rotazioni.

Sicuramente, se è possibile utilizzare una matrice per eseguire la rotazione su un punto, deve essere possibile eseguire più operazioni matrice in qualche modo per consentire la rotazione di un punto e quindi una rotazione aggiuntiva attorno a un punto diverso.

Ho provato a guardare le pagine sull'animazione scheletrica, ma non riesco a fare capo né coda di quello di cui stanno parlando.

+0

Sembra che tu abbia dimenticato di annullare 'legRot'. Ad eccezione della rotazione più interna, tutte le altre operazioni dovrebbero essere perfettamente bilanciate.È possibile ottenere ciò aggiungendo la rotazione inversa nella posizione appropriata o combinando le prime tre operazioni in una singola matrice e applicando prima quella matrice e la sua inversa. Se questo risolve il tuo problema, trasformerò questo commento in una risposta. – MvG

+0

questo non ha funzionato. Vorrei poter trovare un tutorial su come farlo, ma o non è possibile o sto cercando la cosa sbagliata. – HappyEngineer

risposta

6

Se ho capito che il problema è corretto, hai un caso di rotazione relativa. Puoi provare a cercare il doppio pendolo, vedi la fig.

double pendulum

Uso matrice di rotazione le nuove coordinate del punto p1 ruotato attorno al punto p0 possono essere trovati come

Le nuove coordinate del punto p2 ruotato attorno al punto p1 sarà

Infine, le nuove coordinate del punto p2 ruotati attorno al punto p0 sarà

Ordine della politica matrici moltiplicazione così il segno degli angoli.

+0

Capisco la risposta su gamedev. Non sono sicuro che la soluzione finale che ho ottenuto corrisponda alla matematica attuale che stai facendo qui. Non sembra, ma non sono del tutto sicuro di cosa potrebbe fare l'oggetto Matrix. http://gamedev.stackexchange.com/questions/50171/what-matrix-operations-do-i-forma-to-translate-then-rotate-then-translate-then – HappyEngineer

2

Ho paura che questo non sia più un linguaggio agonistico - In realtà sto facendo qualcosa di simile in questo momento in Android, ma sto imparando entrambi Android e Matrix Matematica! Sembri sapere come usare le matrici in Android, quindi immagino che questo non sarà un problema.

Quindi, diciamo che abbiamo due mesh (in cui una mesh è la cosa che è possibile disegnare indipendentemente dallo schermo): UpperLeg e LowerLeg.

  • Per UpperLeg si sta andando ad avere il punto in cui la rotazione della maglia (RotationPoint) (nel mondo reale Credo che questo sarebbe stato l'anca) e si sta andando ad avere il punto in cui il LowerLeg attribuisce al it (AttachmentPoint) (nel mondo reale immagino che questo sarebbe il ginocchio).
  • Per LowerLeg si avrà il punto in cui ruota la mesh (RotationPoint) (nel mondo reale immagino che questo sarebbe il ginocchio).

UpperLeg.AttachmentPoint = LowerLeg.RotationPoint (in questo modo la gamba non cadrà).

Facciamo Ora immaginate che hai due importi di rotazione (uno per UpperLeg e uno per LowerLeg): UpperLeg.Rotation e LowerLeg.Rotation.

(dei quali forma oggetto di rotazione - se non avete sentito parlare di Quaternions, si dovrebbe guardare - mi stupisce che un tizio dal 1846 si avvicinò con questi - si tratta fondamentalmente racchiudono il concetto di rotazione, può essere trasformata in matrici di rotazione, possono essere combinati (per moltiplicazione) e non soffrono di blocco del giunto cardanico).

Primo up voi ruotare UpperLeg da:

  1. spostando la maglia UpperLeg in modo che UpperLeg.RotationPoint è l'origine
  2. rotante da UpperLeg.Rotation
  3. Spostare la maglia UpperLeg in modo che sia dove deve essere nel mondo reale. Vedo che lo stai facendo.

Quindi per il LowerLeg sarebbe:

  1. spostando la rete in modo che LowerLegLowerLeg.RotationPoint è l'origine
  2. rotante da (UpperLeg.Rotation combinata con LowerLeg.Rotation)
  3. Spostare la maglia LowerLeg da lo stesso importo che la mesh UpperLeg è stata spostata nel passaggio 3
  4. Spostamento di LowerLeg mesh per il vettore che è (il vettore da UpperLeg.RotationPoint a UpperLeg.AttachmentPoint) ruotato da UpperLeg.Rotation.

I passaggi precedenti possono essere combinati e ottimizzati.

In sostanza sto dicendo:
Ruota LowerLeg come deve essere ruotata, quindi spingerlo dove deve andare - dove deve andare sarà determinato da dove UpperLeg è andato, oltre a come si arriva a dove LowerLeg è allegato a UpperLeg.

Questo è il mio primo post qui, quindi, se ho infranto qualche regola cardinale, per favore fatemi sapere cosa sono.

Problemi correlati