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.
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
questo non ha funzionato. Vorrei poter trovare un tutorial su come farlo, ma o non è possibile o sto cercando la cosa sbagliata. – HappyEngineer