È possibile trasformare una matrice di rotazione 3d (4x4) nelle sue parti componenti (rotazione, scala, ecc.)?


11

Per essere più concreti, sto lavorando su un'app iOS e ho una CATransform3Dstruttura (fondamentalmente un array di trasformazioni 4x4).

È possibile dedurre tutte le diverse "operazioni" che questa matrice implica? Cose come quanta rotazione, scala, ecc. Implica?

Risposte:


10

È possibile scomporre la matrice M=TRS in trasformazioni di base: traslazione, ridimensionamento e rotazione. Data questa matrice:

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

È possibile scomporre la traduzione mediante ispezione utilizzando l'ultima colonna .t=(a03,a13,a23)

Per il ridimensionamento, sappiamo che le prime tre colonne della matrice corrispondono alle basi (assi). Possiamo ottenere la scala dalla lunghezza / norma di questi vettori, cioè da quanto sono state ridimensionate le basi. Quindi la scala è dove:s=(s0,s1,s2)

s0=(a00,a10,a20)s1=(a01,a11,a21)s2=(a02,a12,a22)

Ora hai la scala, puoi sbarazzartene usando la sotto-matrice che corrisponde a moltiplicando la matrice con l'inverso della scala per getR S S - 1 R3×3RSS1R

(RS)S1=[a00a01a02a10a11a12a20a21a22][s0000s1000s2]1=[a00a01a02a10a11a12a20a21a22][1/s00001/s10001/s2]

Pertanto ( ):(RS)S1=RI=R

R=[a00/s0a01/s1a02/s2a10/s0a11/s1a12/s2a20/s0a21/s1a22/s2]

Questa è la matrice di rotazione finale. Puoi scomporlo ulteriormente in molti modi. È molto lungo ma puoi cercare di decomporre una matrice di rotazione .


Questo metodo fornisce solo valori equivalenti sotto forma di traslazione, ridimensionamento e rotazione (la matrice originale potrebbe essere il risultato di altri tipi di trasformazioni). Potrebbe avere problemi con la precisione in virgola mobile con gli angoli di rotazione se si utilizzavano ulteriormente gli angoli decomposti, gli errori di arrotondamento potrebbero accumularsi nei calcoli. Non dovresti usarlo a meno che tu non abbia costruito tu stesso la matrice.

Se sei tu quello che ha costruito la matrice e hai voluto la decomposizione per poter modificare e visualizzare la traduzione, la scala e la rotazione individualmente e indipendentemente , probabilmente il modo più pulito per archiviare i componenti di , e in una classe di trasformazione individualmente come vettori (forse quaternione per la rotazione). Solo quando è necessaria la matrice di trasformazione, costruire una matrice da questi componenti (è possibile memorizzare nella cache la matrice fino a quando non viene modificato un componente).s r T R StsrTRS


2
Potete chiarire quali sono i problemi con la precisione in virgola mobile? In questo metodo non vedo nulla che possa causare problemi di precisione, a meno che la scala non sia davvero estrema. Inoltre, vale la pena notare che questo metodo potrebbe fallire se la matrice fosse composta da una sequenza di matrici che include sia scale che rotazioni non uniformi. La matrice si rivelerà non essere una rotazione in quel caso, ma includerà un taglio. R
Nathan Reed,

2
Tutti i numeri in virgola mobile hanno un errore intrinseco (limitato). Ogni volta che si eseguono operazioni, in particolare l'addizione o la sottrazione, si aggiunge l'errore, aumentando l'entità dei limiti. Nell'algoritmo di decomposizione sono nascoste molte operazioni di addizione (sia nella moltiplicazione della matrice che nel calcolo della magnitudine della scala) e una radice quadrata (nella scala). Un'ulteriore decomposizione introdurrà ulteriori errori.
Timbo,

1
@Timbo Non c'è nessuna moltiplicazione della matrice completa qui, ma solo moltiplicando le colonne della matrice per le scale inverse. E una magnitudine vettoriale implica l'aggiunta di tutte le quantità positive, quindi non c'è cancellazione catastrofica lì; non produce molti errori relativi, AFAICT. Comunque, l'autore ha chiarito che stanno parlando di scomporre ulteriormente la matrice di rotazione in angoli di Eulero o simili, il che ha più senso.
Nathan Reed,

Grazie - ottima risposta. Seguito: per ripristinare la matrice originale, suppongo che dobbiamo seguire un certo ordine di operazioni, a partire dalla matrice dell'identità. Questo ordine sarebbe TRS?
elsurudo,
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.