Perché usiamo le matrici 4x4 per trasformare le cose in 3D?


36

Per tradurre un vettore di 10 unità nella direzione X, perché dobbiamo usare una matrice?

inserisci qui la descrizione dell'immagine

Possiamo solo aggiungere 10 al tappetino [0] [0] e abbiamo ottenuto lo stesso risultato.

Risposte:


28

Sì, puoi aggiungere un vettore in caso di traduzione. Il motivo per utilizzare una matrice si riduce ad avere un modo uniforme per gestire diverse trasformazioni combinate.

Ad esempio, la rotazione viene generalmente eseguita utilizzando una matrice (controlla il commento di @MickLH per altri modi di gestire le rotazioni), quindi per gestire le trasformazioni multiple (rotazione / traslazione / ridimensionamento / proiezione ... ecc.) In modo uniforme, devi codificarli in una matrice.

Bene, più tecnicamente parlando; una trasformazione sta mappando un punto / vettore su un altro punto / vettore.

p` = T(p); 

dove p` è il punto trasformato e T (p) è la funzione di trasformazione.

Dato che non utilizziamo una matrice, dobbiamo farlo per combinare più trasformazioni:

p1 = T (p);

p final = M (p1);

Non solo una matrice può combinare più tipi di trasformazioni in un'unica matrice (ad es. Affine, lineare, proiettiva).

L'uso di una matrice ci dà l'opportunità di combinare catene di trasformazioni e quindi moltiplicarle in batch. Questo ci fa risparmiare un sacco di cicli di solito dalla GPU (grazie a @ChristianRau per averlo sottolineato).

T final = T * R * P; // traduci ruota progetto

p final = T final * p;

È anche bene sottolineare che le GPU e persino alcune CPU sono ottimizzate per le operazioni vettoriali; Le CPU che utilizzano SIMD e GPU sono processori paralleli guidati dai dati in base alla progettazione, quindi l'utilizzo delle matrici si adatta perfettamente all'accelerazione hardware (in realtà, le GPU sono state progettate per adattarsi alle operazioni matrice / vettoriale).


sì, so che la matrice è utile per la rotazione. ma ogni tutorial mi guida usando la matrice per fare un calcolo così semplice: D
ngoaho91

1
Dire che la rotazione "solo" può essere fatta con una matrice non è corretto, anche dalla parte superiore della mia testa i Quaternioni e la Trigonometria funzionerebbero bene
MickLH

17
E ancora di più, una volta che hai rotazione e traduzione sia come matrici 4x4, puoi semplicemente moltiplicarle e avere la trasformazione combinata in una singola matrice senza la necessità di trasformare ogni vertice di migliaia di trasformazioni diverse usando costrutti diversi. Il fatto che una matrice 4x4 sia eccessiva per una singola traduzione o una singola rotazione è sovraponderato dal fatto che di solito non si trasforma semplicemente un vertice con una singola traduzione o una singola rotazione.
Chris dice di reintegrare Monica il

1
@ concept3d Sì, lo so, la risposta è buona. Tuttavia, il vantaggio ancora maggiore ottenuto dal modo uniforme di utilizzare una matrice non è solo l'uniformità, ma la rappresentazione di un'intera catena di trasformazioni in un'unica operazione. Sebbene ciò potesse essere implicito, l'ho trovato poco chiaro e abbastanza importante da menzionarlo esplicitamente. Ma la risposta era comunque buona, non era una critica.
Chris dice di reintegrare Monica il

1
Sì, il trig calcola la matrice rotazionale, ma la matematica vettoriale in realtà "ruota" i punti usando il set di dati infuso dal trig. Quando ho detto la trigonometria, intendevo usarla direttamente, non attraverso una matrice, per generare alcune cose semplici.
MickLH,

6

Se tutto ciò che hai intenzione di fare è muoverti lungo un singolo asse e non applicare mai alcuna trasformazione, ciò che stai suggerendo va bene.

Il vero potere di usare una matrice è che puoi concatenare facilmente una serie di operazioni complesse insieme e applicare la stessa serie di operazioni a più oggetti.

La maggior parte dei casi non è così semplice e se si ruota prima l'oggetto, e si desidera trasformare lungo i suoi assi locali anziché gli assi del mondo, scoprirai che non puoi semplicemente aggiungere 10 a uno dei numeri e farlo funzionare correttamente .


5

Per rispondere in modo succinto alla domanda "perché", è perché una matrice 4x4 può descrivere contemporaneamente le operazioni di rotazione, traduzione e ridimensionamento. Essere in grado di descrivere uno di questi in modo coerente semplifica molte cose.

Diversi tipi di trasformazioni possono essere rappresentati più semplicemente con diverse operazioni matematiche. Come notate, la traduzione può essere fatta semplicemente aggiungendo. Ridimensionamento uniforme moltiplicando per uno scalare. Ma una matrice 4x4 opportunamente realizzata può fare qualsiasi cosa. Quindi l'utilizzo di 4x4 rende il codice e le interfacce molto più semplici. Paghi una certa complessità nella comprensione di questi 4x4, ma poi molte cose diventano più facili e veloci grazie a questo.


2
Questa avrebbe dovuto essere la risposta selezionata.
Ingegnere,

4

la ragione per usare una matrice 4x4 è che l'operazione è una trasformazione lineare . questo è un esempio di coordinate omogenee . La stessa cosa viene fatta nel caso 2d (usando una matrice 3x3). La ragione per usare coordinate omogenee è che tutte e 3 le trasformazioni geometriche possono essere fatte usando una sola operazione; altrimenti bisognerebbe fare una moltiplicazione di matrice 3x3 e un'aggiunta di matrice 3x3 (per la traduzione). questo link da cegprakash è utile.


2
Dovresti elaborare. Una spiegazione sintetica è meglio del semplice collegamento a Wikipedia.
Seth Battin,

3

Le traduzioni non possono essere rappresentate da matrici 3D

Un semplice argomento è che la traduzione può prendere il vettore di origine:

0
0
0

lontano dall'origine, dire a x = 1:

1
0
0

Ma ciò richiederebbe una matrice tale che:

| a b c |   |0|   |1|
| d e f | * |0| = |0|
| g h i |   |0|   |0|

Ma questo è impossibile.

Un altro argomento è il teorema di decomposizione del valore singolare , secondo il quale ogni matrice può essere composta con due operazioni di rotazione e di ridimensionamento. Nessuna traduzione lì.

Perché le matrici possono essere utilizzate?

Molti oggetti modellati (ad es. Un telaio di un'auto) o parte di oggetti modellati (ad es. Una gomma di un'auto, una ruota motrice) sono solidi: le distanze tra i vertici non cambiano mai.

Le uniche trasformazioni che vogliamo fare su di esse sono rotazioni e traduzioni.

La moltiplicazione di matrici può codificare sia rotazioni che traduzioni.

Le matrici di rotazione hanno formule esplicite, ad esempio: una matrice di rotazione 2D per l'angolo aè di forma:

cos(a) -sin(a)
sin(a)  cos(a)

Esistono formule analoghe per il 3D , ma nota che le rotazioni 3D accettano 3 parametri anziché solo 1 .

Le traduzioni sono meno banali e verranno discusse in seguito. Sono la ragione per cui abbiamo bisogno di matrici 4D.

Perché è bello usare le matrici?

Perché la composizione di più matrici può essere pre-calcolata per moltiplicazione di matrici .

Ad esempio, se abbiamo intenzione di tradurre un migliaio di vettori vdel telaio della nostra auto con matrice Te quindi ruotare con matrice R, anziché fare:

v2 = T * v

e poi:

v3 = R * v2

per ogni vettore, possiamo pre-calcolare:

RT = R * T

e poi fai solo una moltiplicazione per ogni vertice:

v3 = RT * v

Ancora meglio: se vogliamo quindi posizionare i vertici di pneumatico e ruota motrice rispetto all'auto, moltiplichiamo semplicemente la matrice precedente RTper la matrice relativa all'auto stessa.

Ciò porta naturalmente a mantenere una pila di matrici:

  • calcolare la matrice del telaio
  • moltiplicare per matrice pneumatici (push)
  • rimuovi matrice pneumatici (pop)
  • moltiplicare per la matrice della ruota motrice (push)
  • ...

Come l'aggiunta di una dimensione risolve il problema

Consideriamo il caso da 1D a 2D che è più facile da visualizzare.

Una matrice in 1D è solo un numero e, come abbiamo visto in 3D, non può fare una traduzione, solo un ridimensionamento.

Ma se aggiungiamo la dimensione extra come:

| 1 dx | * |x|  = | x + dx |
| 0  1 |   |1|    |      1 |

e poi dimentichiamo la nuova dimensione extra, otteniamo:

x + dx

come volevamo.

Questa trasformazione 2D è così importante che ha un nome: trasformazione di taglio .

È bello visualizzare questa trasformazione:

Fonte immagine .

Nota come ogni linea orizzontale (fissa y) è appena tradotta.

Ci è capitato di prendere la linea y = 1come nostra nuova linea 1D e tradurla con una matrice 2D.

Le cose sono analoghe in 3D, con matrici di taglio 4D della forma:

| 1 0 0 dx |   | x |   | x + dx |
| 0 1 0 dy | * | y | = | y + dy |
| 0 0 1 dz |   | z |   | z + dz |
| 0 0 0  1 |   | 1 |   |      1 |

E le nostre vecchie rotazioni / ridimensionamenti 3D sono ora di forma:

| a b c 0 |
| d e f 0 |
| g h i 0 |
| 0 0 0 1 |

Vale la pena guardare anche questo video tutorial di Jamie King .

Spazio affine

Lo spazio affine è lo spazio generato da tutte le nostre trasformazioni lineari 3D (moltiplicazioni di matrice) insieme al taglio 4D (traduzioni 3D).

Se moltiplichiamo una matrice di taglio e una trasformazione lineare 3D, otteniamo sempre qualcosa della forma:

| a b c dx |
| d e f dy |
| g h i dz |
| 0 0 0  1 |

Questa è la trasformazione affine più generale possibile, che fa rotazione / ridimensionamento 3D e traduzione.

Una proprietà importante è che se moltiplichiamo 2 matrici affine:

| a b c dx |   | a2 b2 c2 dx2 |
| d e f dy | * | d2 e2 f2 dy2 |
| g h i dz |   | g2 h2 i2 dz2 |
| 0 0 0  1 |   |  0  0  0   1 |

otteniamo sempre un'altra matrice affine di forma:

| a3 b3 c3 (dx + dx2) |
| d3 e3 f3 (dy + dy2) |
| g3 h3 i3 (dz + dz2) |
|  0  0  0          1 |

I matematici chiamano questa chiusura di proprietà ed è necessario per definire uno spazio.

Per noi significa che possiamo continuare a fare moltiplicazioni di matrice per calcolare felicemente le trasformazioni finali, motivo per cui in primo luogo utilizzare le matrici usate, senza mai ottenere trasformazioni lineari 4D più generali che non sono affini.

Proiezione di frustum

Ma aspetta, c'è un'altra trasformazione importante che facciamo continuamente: glFrustumche rende un oggetto 2 volte più grande, appare 2 volte più piccolo.

Per prima cosa prendi un po 'di intuizione sul glOrthovs glFrustumsu: https://stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924

glOrthopuò essere fatto solo con traduzioni + ridimensionamento, ma come possiamo implementare glFrustumcon le matrici?

Supporre che:

  • il nostro occhio è all'origine, guardando a -z
  • lo schermo (vicino al piano) è a z = -1un quadrato di lunghezza 2
  • il piano più lontano del frustum è a z = -2

Se solo permettessimo 4 vettori più generali di tipo:

(x, y, z, w)

con w != 0, e inoltre identifichiamo ogni (x, y, z, w)con (x/w, y/w, z/w, 1), quindi una trasformazione del frustum con la matrice sarebbe:

| 1 0  0 0 |   | x |   |  x |               | x / -z |
| 0 1  0 0 | * | y | = |  y | identified to | y / -z |
| 0 0  1 0 |   | z |   |  z |               |     -1 |
| 0 0 -1 0 |   | w |   | -z |               |      0 |

Se buttiamo via ze walla fine, otteniamo:

  • x_proj = x / -z
  • y_proj = y / -z

che è esattamente quello che volevamo! Possiamo verificarlo per alcuni valori, ad esempio:

  • se z == -1, esattamente sull'aereo su cui stiamo proiettando, x_proj == xey_proj == y .
  • if z == -2, then x_proj = x/2: gli oggetti hanno la metà.

Nota come la glFrustumtrasformazione non sia di forma affine: non può essere implementata solo con rotazioni e traduzioni.

Il "trucco" matematico di aggiungere we dividere per esso si chiama coordinate omogenee

Vedi anche: domanda Stack Overflow correlata: https://stackoverflow.com/questions/2465116/understanding-opengl-matrices


@Downvoters, ti prego di spiegare in modo che io possa imparare e migliorare.
Ciro Santilli 25 改造 中心 法轮功 六四 事件

Personalmente penso che questo sia solo lungo e sconclusionato, la parte che affronta la domanda originale non è nulla di nuovo (che non è ben coperto da altre risposte) e il resto è irrilevante, il che rende davvero difficile guadare.
Josh

@JoshPetrie grazie per il feedback! Penso che coloro che non capiscono già avrebbero maggiori probabilità di capire dalla mia risposta, in quanto è più esemplificato e visivo. Se trovi errori o punti specifici che sono completamente irrilevanti, indicali in modo che io possa migliorare. Saluti.
Ciro Santilli 25 改造 中心 法轮功 六四 事件

Come ho detto, penso che la maggior parte della risposta sia irrilevante. La domanda si pone "perché usare le matrici 4x4, perché non possiamo semplicemente aggiungere?" La risposta è ben coperta da una spiegazione del tipo "sì, puoi aggiungere, ma una matrice ti consente anche di tradurre / ruotare / ridimensionare, ma a causa di come funziona la matematica della matrice un 3x3 non può codificare il traduttore, ma un 4x4 si può ". Se lo copri in questo muro di testo, è molto difficile da trovare. Il resto è un primer sulla matematica matriciale che non è stato chiesto, e mentre probabilmente andrebbe bene come risposta a un'altra domanda, non penso che sia adatto a questa domanda.
Josh

1
Ho apprezzato l'attenzione ai dettagli. Per rispondere alla preoccupazione dell'utente precedente, la risposta dovrebbe essere riorganizzata per iniziare da "Le traduzioni non possono essere rappresentate da matrici 3D". Ciò risponde alla domanda immediata posta e l'OP può continuare con ulteriori dettagli ben scritti ed entusiasti forniti; quei dettagli più fini sono ciò che mi interessa qui, quindi potrei essere di parte, ma questo non è certamente "sconclusionato".
dskinner,

1

Guarda questo video per comprendere i concetti di modello, vista e proiezione.

Le matrici 4x4 non vengono utilizzate solo per la traduzione di un oggetto 3D. Ma anche per vari altri scopi.

Vedi questo per capire come i vertici nel mondo sono rappresentati come matrici 4D e come vengono trasformati.


1
Questo in realtà non risponde alla domanda OP.
concept3d

Modificato. Suona bene?
cegprakash,
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.