2010-10-20 27 views
8

Date le seguenti definizioni per le matrici di rotazione x, y, z, come posso rappresentarlo come una matrice completa? Basta moltiplicare x, y, & matrici?Come rappresentare una rotazione della matrice 4x4?

X rotazione:

[1 0 0 0] 
[0 cos(-X Angle) -sin(-X Angle) 0] 
[0 sin(-X Angle) cos(-X Angle) 0] 
[0 0 0 1] 

Rotazione Y:

[cos(-Y Angle) 0 sin(-Y Angle) 0] 
[0 1 0 0] 
[-sin(-Y Angle) 0 cos(-Y Angle) 0] 
[0 0 0 1] 

Z di rotazione:

[cos(-Z Angle) -sin(-Z Angle) 0 0] 
[sin(-Z Angle) cos(-Z Angle) 0 0] 
[0 0 1 0] 
[0 0 0 1] 

Edit: Ho una classe rotazione separata che contiene un x, y , valore float z, che successivamente convertirò in una matrice per combinarlo con altri traduzioni/scale/rotazioni.

A giudicare dalle risposte qui, posso supporre che se faccio qualcosa di simile:

rotazione rotazione; rotation.SetX (45); rotation.SetY (90); rotation.SetZ (180);

Quindi è davvero molto importante in quale ordine vengono applicate le rotazioni? O è sicuro assumere che quando si utilizza la classe di rotazione, si accetta che vengano applicati nell'ordine x, y, z?

+0

Questa risposta è [qui] (http://stackoverflow.com/questions/5188876/rotation-matrix-given-angle-and-point-in-x-y-z/5188904#5188904). – Glenn

risposta

6

Sì, moltiplicando le tre matrici a turno le comporrà.

EDIT:

L'ordine in cui si applica la moltiplicazione di matrici determina l'ordine delle rotazioni saranno applicate al punto.

P × (X × Y × Z)  Rotations in X, Y, then Z will be performed 
P × (Y × X × Z)  Rotations in Y, X, then Z will be performed 
P × (Z × X × Y)  Rotations in Z, X, then Y will be performed 
+1

Nota che potrebbe essere o meno la rotazione che stai aspettando (ricorda che in 3D, le rotazioni NON permutano). – user168715

+0

Ma nota che l'ordine della composizione è importante - la moltiplicazione della matrice non è commutativa, e neanche le rotazioni sono circa diversi assi. – walkytalky

+0

Prima di tutto, decidi quale ordine applicare le rotazioni (diciamo X poi Y poi Z). Quindi, dipende anche dalla tua convenzione se i tuoi punti sono vettori di riga o vettori di colonne. Per i vettori di riga, hai '((r * X) * Y) * Z = r * (XYZ)' - rispetto ai vettori di colonna, hai 'Z * (Y * (X * c)) = (ZYX) * c'. – comingstorm

2

in realtà è molto importante che ordine si applica vostre rotazioni in.

L'ordine che si desidera dipende da ciò che si desidera le rotazioni da fare. Ad esempio, se stai modellando un aeroplano, potresti voler eseguire prima il rotolo (ruotare lungo l'asse lungo del corpo), poi il passo (ruotare lungo l'altro asse orizzontale), quindi il titolo (ruotare lungo l'asse verticale).). Ciò sarebbe dovuto al fatto che, se si eseguiva per prima l'intestazione, l'aereo non sarebbe più allineato lungo gli altri assi. Oltre a questo, devi occuparti delle tue convenzioni: quale di questi assi corrisponde a X, Y e Z?

Generalmente, si desidera solo scegliere un ordine di rotazione specifico per applicazioni specifiche. Non ha molto senso definire un oggetto generico "XYZrotation"; tipicamente, si avranno trasformazioni generiche (cioè matrici che possono essere qualsiasi concatenazione di rotazioni, traduzioni, ecc.) e vari modi per ottenerle (ad esempio, rotX, rotY, translate, scale ...), oltre alla possibilità di applicare loro in un ordine particolare (facendo moltiplicazione di matrice).

Se si desidera qualcosa che può rappresentare solo rotazioni e nient'altro, è possibile considerare i quaternioni (come suggerisce anand). Tuttavia, è ancora necessario decidere in quale ordine eseguire le rotazioni, e, ancora, non ha realmente senso cablare un ordine richiesto per quello.

Problemi correlati