Calcolo della rotazione 3d attorno all'asse casuale

2

Questo è in realtà un problema risolto, ma voglio capire perché il mio metodo originale non ha funzionato (sperando che qualcuno con più conoscenze possa spiegare).

(Tieni presente che non ho molta esperienza nella programmazione 3d, avendo giocato solo con le basi per un po '... e non ho molta esperienza matematica in quest'area).

Volevo animare un punto ruotando attorno a un altro punto su un asse casuale, ad esempio un angolo di 45 gradi lungo l'asse y (pensa a un elettrone attorno a un nucleo). So come ruotare usando la matrice di trasformazione lungo l'asse X, Y e Z, ma non un asse arbitrario (45 gradi).

Alla fine, dopo alcune ricerche, ho trovato un suggerimento: ruotare il punto di -45 gradi attorno alla Z in modo che sia allineato. Quindi ruotare di qualche incremento lungo l'asse Y, quindi ruotarlo di nuovo di +45 gradi per ogni segno di spunta. Anche se questo ha funzionato sicuramente, ho ritenuto che ci fosse più lavoro necessario (troppe chiamate di metodo, matematica, ecc.) E probabilmente sarebbe piuttosto lento in runtime con molti punti da trattare.

Ho pensato che forse era possibile combinare tutte le matrici di rotazione coinvolte in 1 matrice di rotazione e usarle come un'unica operazione.

Qualcosa come:

 [ cos(-45)    -sin(-45)         0]
 [ sin(-45)     cos(-45)         0]      rotate by -45 along Z 
 [    0            0             1]

moltiplicare per

 [ cos(2)          0       -sin(2)]
 [    0            1            0 ]      rotate by 2 degrees (my increment) along Y
 [ sin(2)          0        cos(2)]

quindi moltiplica il risultato per (in questo ordine)

 [ cos(45)      -sin(45)         0]
 [ sin(45)       cos(45)         0]      rotate by 45 along Z 
 [    0            0             1]

Ricevo 1 pasticcio di una matrice di numeri (dato che lavoravo con incognite e 2 angoli), ma sentivo che avrebbe dovuto funzionare. Non ha funzionato e ho trovato una soluzione su wiki usando un altro matirx, ma è un'altra cosa.

Non sono sicuro che forse ho fatto un errore nel moltiplicare, ma la mia domanda è: questo è in realtà un modo praticabile per risolvere il problema, prendere tutte le trasformazioni separate, combinarle moltiplicando, quindi usarle o meno ?

    
posta mitim 27.11.2012 - 10:58
fonte

3 risposte

5

Puoi davvero aggiungere ("sommare") le rotazioni per moltiplicazione.

Tuttavia prenderei in considerazione l'uso di Quaternioni. Sono molto più piacevoli con cui lavorare ed evitano problemi con le rotazioni di tipo Eulero (ad es. blocco gimbal ). Puoi collegare arbitrariamente gli assi di rotazione, piuttosto che preoccuparti delle rotazioni X, Y, Z. Le rotazioni del composto del Quaternione sono piacevoli - e se hai oggetti 3D interattivi che l'utente può girare ecc., Vorrai combinare le rotazioni.

Molti sul web su Quaternions, ad esempio:

risposta data 27.11.2012 - 11:15
fonte
2

È passato un po 'di tempo dall'ultima volta che ho fatto molta matematica a matrice, ma sono abbastanza sicuro che il tuo approccio sia valido.

Sembra che sia necessario invertire l'ordine delle trasformazioni quando si moltiplicano queste matrici. Quando combini le trasformazioni di matrici (di qualsiasi tipo) inizi sempre con l'ultima e lavori all'indietro.

    
risposta data 27.11.2012 - 11:09
fonte
0

Il problema che ottieni ruotando l'asse separatamente è che puoi sperimentare ciò che viene chiamato ' blocco del gimbal ', un indica dove le rotazioni sull'asse separato si sovrappongono in modo che i tuoi calcoli non producano l'effetto desiderato perché i calcoli separati interferiscono con il risultato finale a causa della sovrapposizione. La soluzione a questo è specificare l'asse in un vettore e la rotazione espressa sotto forma di un numero immaginario. Il modo per calcolare questo è da usare Quaternions . tutti i tipi di calcolo della rotazione produrranno alla fine una matrice 4x4, poiché questa è sempre la forma richiesta per esprimere la trasformazione finale. Ciò implica che puoi effettivamente sommare i calcoli tramite la moltiplicazione, ma come descritto in precedenza, le aggiunte possono interferire l'una con l'altra in determinati casi.

    
risposta data 27.11.2012 - 14:13
fonte

Leggi altre domande sui tag