Come combinare la rotazione su 2 assi in una matrice


8

Conosco già le matrici che devo usare per eseguire le rotazioni. Se devo ruotare in asse z e poi in asse x, lo farei in 2 passaggi. La mia domanda è: è possibile combinare entrambe le rotazioni in un'unica matrice? Apprezzerò il tuo feedback.

Risposte:


8

(Questa risposta è essenzialmente la stessa di Stefan, ma volevo aggiungere alcuni dettagli sui vettori di riga e colonna e su come determinare quale si sta utilizzando.)

Sì, questo è possibile, ma i dettagli dipendono dal fatto che tu rappresenti i tuoi vettori come righe o colonne.

Vettori di colonna

Se stai usando i vettori di colonna , normalmente li trasformerai moltiplicando a sinistra le tue matrici:

vector = mRotateZ * vector;
vector = mRotateX * vector;

Naturalmente, puoi anche farlo in un solo passaggio:

vector = mRotateX * mRotateZ * vector;

Ma la moltiplicazione matriciale è associativa, il che significa che non importa quale moltiplicazione venga eseguita per prima:

A * B * C = (A * B) * C = A * (B * C)

Quindi possiamo scrivere

Matrix mRotate = mRotateX * mRotateZ;
vector = mRotate * vector;

Ora abbiamo creato una singola matrice, che equivale a ruotare primaZ e seconda circa X. Questo generalizza banalmente per qualsiasi numero di trasformazioni. Si noti che le trasformazioni vengono applicate da destra a sinistra.

Vettori di riga

Se, d'altra parte, stai usando i vettori di riga , di solito moltiplicherai a destra le tue matrici:

vector = vector * mRotateZ;
vector = vector * mRotateX;

Ancora una volta, scrivendolo in un solo passaggio, otteniamo

vector = vector * mRotateZ * mRotateX;

che può essere riscritto come

Matrix mRotate = mRotateZ * mRotateX;
vector = vector * mRotate;

Si noti che in questo caso, le trasformazioni applicate da sinistra a destra.


1
Sarei molto attento a quel commento associativo facile da fraintendere
joojaa,

@joojaa Non so che cosa intendi esattamente, ma ho cercato di chiarire quel punto.
Martin Ender,

È difficile per un laico separare l'ordine in cui moltiplichi le cose e l'ordine in cui gli elementi sono in moltiplicazione.
joojaa,

quindi non comprendono la differenza tra assiocativo e commutativo. quindi se parli dell'ordine di moltiplicazione molti potrebbero pensare alla commutatività
joojaa,

6

Sì, basta moltiplicarli in ordine inverso:

Matrix myrotation = Matrix.CreateRotationX(xrot) * Matrix.CreateRotationZ(zrot);

MODIFICARE. La mia risposta si applica solo se si utilizzano vettori di colonna. Si prega di consultare la risposta dettagliata Martin Büttner.


Mi dispiace ma non ne ho idea. Cosa intendi esattamente con "ordine inverso"?
JORGE,

1
Moltiplica x per z anziché z per x;
Stefan Agartsson,

1
in realtà l'ordine è arbitrario si può modellare usando i vettori di riga e si possono modellare i vettori di colonna. Il calcolo restituisce lo stesso risultato in entrambi ma l'ordine di moltiplicazione cambia. Ma sì, questa è la risposta giusta.
joojaa,

Joojaa, grazie per averlo chiarito! La matrice di righe indica un ordine di moltiplicazione inverso, è corretto?
Stefan Agartsson,

3

Dalla matematica:

Esiste un omomorfismo 2: 1 dall'unità quaternioni a SO (3) (il gruppo di rotazione).

Ciò significa (essenzialmente) che:

  1. Ogni orientamento può essere rappresentato come un quaternione
  2. I quaternioni rappresentano una singola rotazione
  3. La moltiplicazione dei quaternioni produce un altro quaternione (chiusura) ed equivale a comporre le rotazioni.
  4. Pertanto qualsiasi numero di rotazioni può essere rappresentato come una singola rotazione!

Pensaci. A partire dallo spazio oggetti, è possibile ruotare l'oggetto in qualsiasi orientamento utilizzando una sola rotazione.


Vorrei sottolineare che il coinvolgimento dei quaternioni non era solo una matematica casuale. Contrariamente alle altre risposte, l' approccio preferito nella grafica è in realtà quello di rappresentare le rotazioni come quaternioni, poiché occupano meno spazio e sono più veloci da combinare.

Ci sono modi facilmente googleable per convertire tra matrici di rotazione e quaternioni, a seconda di quale preferisci. Il punto è che le rotazioni sono i quaternioni in senso matematico, quindi le loro combinazioni sono anche singole rotazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.