Cosa rappresenta una matrice?


19

Ho iniziato a studiare OpenGL di recente e ho problemi a visualizzare cosa sono le matrici e il loro ruolo nella computer grafica. Dato il modello di una matrice 4x4 come questa:

inserisci qui la descrizione dell'immagine

Suppongo che ogni matrice come questa sia la coordinata di un vertice nello spazio mondiale. E molti di loro messi insieme e ombreggiati danno un oggetto?

Ma perché c'è un Xx, un Xye un Xz? Ho letto che è un asse diverso (in alto, a sinistra, in avanti), ma non riesco ancora a capire il significato.

Risposte:


19

Le matrici in computer grafica sono le trasformazioni date a ciascuna coordinata nel modello. Ogni matrice è una combinazione di più trasformazioni da applicare a una coordinata (un punto nello spazio 3).

La creazione di una trasformazione si basa su uno dei tre tipi di trasformazione: Traduci, Ruota e Ridimensiona.

Una matrice di traduzione è simile a:

Una matrice di traduzione

E una matrice di scala: Matrice di scala

Le matrici di rotazione sembrano:

inserisci qui la descrizione dell'immagine

Per combinare una di queste matrici è sufficiente moltiplicarle insieme. Per applicare la trasformazione a un vertice basta moltiplicare per il vertice (come mostrato nel diagramma di traduzione).


4
Quindi le matrici non rappresentano punti. Sono imbarazzato ora
Sad CRUD Developer

Molte volte vengono applicati a un oggetto o al viewport nel suo insieme (ecco come si ottengono le viste ortogonali e prospettiche)
Alex Shepard

3
@BDillan: No, ma possono sicuramente contenere punti. L'ultima colonna in una matrice ModelView (GL / column-major), ad esempio, definisce come l'origine viene tradotta. O, per dirla in altro modo, definisce dove si trova l'occhio nello spazio del mondo e può letteralmente essere usato come un punto da solo.
Andon M. Coleman,

le tue coordinate a 3 tuple. perché la matrice non è 3 volte 3? Supponiamo di essere in grado di combinare i tre tipi di trasformazione in una singola matrice e avere ancora abbastanza spazio, cosa sta facendo, nell'angolo in basso a destra, sembra che sia sempre 1?
n611x007,

La quarta riga / colonna è specifica per le traduzioni. Una delle caratteristiche più belle della matematica della matrice è che posso combinare tutte le traduzioni e le rotazioni che voglio realizzare in una singola matrice. Ciò significa che gruppi di trasformazioni molto, molto complessi (teoricamente infiniti) possono essere compressi fino a 1 matrice. Sì, quest'ultima cella rimane 1, ma ci consente di fare il resto della matematica.
Alex Shepard,

10

Nella computer grafica, usiamo le matrici per codificare le trasformazioni .

Le matrici che contengono solo trasformazioni di traduzione, rotazione o ridimensionamento hanno un'interpretazione comunemente sfruttata: il 3x3 in alto a sinistra della matrice contiene solo i dati di rotazione o ridimensionamento, la riga inferiore o la colonna di destra contiene i dati di traduzione. Questa non è una generalità, ma vale abbastanza spesso per il sottoinsieme di trasformazioni rappresentate nella computer grafica che le persone ne fanno uso.

Allo stesso modo, esiste una relazione tra i valori della matrice e il corrispondente riquadro delle coordinate rappresentato dalla matrice (che non è sempre "spazio del mondo", dovrei notare). Le colonne (o righe) 3x3 in alto a sinistra rappresentano gli assi X, Y e Z del riquadro delle coordinate.

Il fatto che le righe rappresentino o meno gli assi o la colonna dipende dal fatto che si stia utilizzando la convenzione di moltiplicazione come row vector * matrixo matrix * column vector. Quando si esegue la moltiplicazione di matrici, le dimensioni interne delle due matrici devono concordare, e quindi se si rappresentano vettori come matrici di righe o matrici di colonne influisce su tale scelta (OpenGL e la matematica tradizionale tendono a preferire i vettori di colonna).

Consiglio di prendere un buon libro sull'algebra lineare, o almeno dare un'occhiata alle FAQ su Matrix e Quaternion e su questo post sui layout di matrice in DirectX e OpenGL .


ho tonnellate di "buoni" libri sull'algebra lineare, alcuni dei quali ho persino letto e capito. la cosa è che non aiuta un po ', non che io non li abbia né che l'ho capito. Ho la sensazione che il tuo ultimo consiglio stia rispondendo all'assunto sbagliato.
n611x007,

9

Cos'è una matrice?

Una matrice con mcolonne e nrighe rappresenta una funzione che consuma un vettore * con melementi (o coordinate) e produce un vettore con nelementi.

Da ciò si può osservare che se e solo se una matrice è quadrata, la dimensionalità del vettore non cambierà. Per esempio. si ottiene un vettore 3D dalla trasformazione di un vettore 3D, un 2D da un 2D, ecc.

* : In fisica, i vettori sono generalmente usati per indicare forze o altre "influenze" che "si muovono" in cose come la velocità o l'accelerazione. Ma non c'è nulla che ti impedisca di utilizzare un vettore per rappresentare un punto o un qualsiasi array arbitrario di numeri (alcune librerie e linguaggi di programmazione usano persino "vector" per indicare "array 1D"). Per l'uso con le matrici, qualsiasi cosa può essere gli elementi del tuo vettore (anche stringhe o colori), purché tu abbia un modo di aggiungerli, sottrarli e moltiplicarli per qualunque sia la tua matrice. Da qui il nome del vettore , che significa "vettore" - porta o contiene valori per te.

Cosa significa moltiplicare per una matrice?

Quindi se una matrice è una funzione, che tipo di funzione ? Cosa fa la funzione? La ricetta per questo è definita dagli elementi della matrice. Chiamiamo input u, output v, la matrice M(la moltiplicazione M*u=vè quindi la stessa di f(u)=v) e u(i)diamo il ith elemento di u(il 2o elemento è coordinata y, per esempio). Per la matrice, M(i,j)significa riga i, colonna j.

La costruzione dell'elemento v(1), la prima nel risultato, è descritta dalla prima riga della matrice. u(1)volte M(1,1), più u(2)volte M(1,2), ... più u(i)volte M(1,i). Una matrice è un po 'come un linguaggio di programmazione molto semplice, che è utile solo per le funzioni di programmazione che si muovono mescolando attorno agli input, aggiungendoli a se stessi, ecc. **

È utile immaginare che stai lavorando su un elemento di output alla volta, quindi stai utilizzando solo una riga della matrice alla volta. Scrivi in uorizzontale. Scrivi la riga con Msotto di essa. Moltiplichi ogni coppia sopra / sotto e scrivi i prodotti di seguito, quindi aggiungi i prodotti. Ripetere l'operazione per ogni riga per ottenere ogni elemento di v. (Ora si vede il motivo per cui una mda nmatrice deve operare su un mvettore e produrre un nvettore.)

Un altro modo di pensare a questo - diciamo che stiamo facendo una trasformazione da 3D a 3D, quindi una matrice 3x3 (o trasformazione 3D come vengono spesso chiamate perché si può far finta che questa "funzione" sia "spostare" punti 3D, anche se in realtà è cambiando solo i numeri). Diciamo che la prima fila è [1 2 0]. Ciò significa che per ottenere x di risultato, ottenere 1 di input x, 2 di input y e 0 di input z. Quindi è davvero una ricetta.

** : Se una matrice è un linguaggio di programmazione, non è nemmeno completo Turing.

Cosa significa moltiplicare due matrici?

Se sono entrambi matrici di dimensioni adeguate, quindi A*Bsignifica "una funzione che applica prima Bpoi A". Puoi vedere perché esistono i vincoli sulle dimensioni per la moltiplicazione, perché size determina le dimensioni di input e output e una matrice consuma l'output dell'altra. Perché la moltiplicazione significa combinare le funzioni? È più facile notare che deve essere. If A*uè lo stesso di f(u)ed B*uè lo stesso di g(u)allora f(g(u))è lo stesso di quello f(B*u)che è lo stesso di A*(B*u).

Allo stesso modo, applicazioni ripetute della stessa funzione possono essere mostrate come potenze, poiché A*A*Asignifica applicare la funzione che Arappresenta tre volte.

Come sono utili le matrici?

A che serve fare una trasformazione new_x = 1*x+2*y+0*z(se la prima riga è [1 2 0])? Questo non è molto ovvio, ma prendiamo un'altra matrice 2D per spiegarlo. La matrice è:

[ 0 1
  1 0 ]

O [0 1; 1 0]usando la comoda notazione Matlab. Cosa fa questa matrice? Trasforma un vettore 2D in questo modo: Per la x del risultato, prendi 1 della y dell'input. Per la y del risultato, prendi 1 della x dell'input. Abbiamo appena scambiato le coordinate xey dell'input: questa matrice riflette i punti sulla linea x = y. È utile! Per estensione, vedrai che tutte le matrici con 1 lungo la linea SW - NE riflettono. Puoi anche capire perché le matrici di identità ti restituiscono l'input (per x di output, prendi x di input; per y di output, prendi y di input ...).

Ora vedi perché i simboli sono ad es. Xx, Yx- significano quanto di ingresso X, Yecc va in uscita x.

In quale altro modo le matrici sono utili?

Quale altra trasformazione puoi fare? Puoi ridimensionare prendendo una matrice identità, ma con un numero diverso da 1 lungo la diagonale. Ad esempio, [2.5 0; 0 22.5]moltiplicherai ogni coordinata dell'input per 2,5 e se applichi questa matrice a ogni punto di un'immagine, l'immagine sarà 2,5 grande. Se inserisci solo 2,5 in una riga ( [2.5 0; 0 1]), verrà moltiplicata solo la coordinata x, quindi allungherai solo lungo x.

Altre matrici possono fornire altre trasformazioni, come "inclinazione", che hanno vari gradi di utilità. Personalmente, il disallineamento è il mio meno preferito perché la matrice sembra così semplice ma la trasformazione stessa raramente fa nulla tranne che manipolare un'immagine. Una utile è la "rotazione": come si fa a ruotare un punto? Prova a calcolare la posizione del punto (x, y)dopo aver ruotato di thetagradi in senso antiorario rispetto all'origine. Scoprirai che le nuove coordinate xey escono entrambe moltiplicando le vecchie xey per alcuni seni e coseni di theta. Dovresti essere in grado di scrivere facilmente una matrice di rotazione usando seni e coseni che corrispondono a questa funzione.

Con matrici non quadrate, è anche possibile modificare la dimensionalità di un input. Trasformare un input 2D in 3D non è molto utile, poiché è difficile "fabbricare" qualcosa da inserire nella nuova coordinata, ma 3D in 2D è molto utile. Tra le altre cose, questo è il modo in cui il tuo computer sa proiettare *** una scena 3D in un'immagine 2D per disegnare sul tuo monitor.

Dato che i vettori possono contenere cose diverse, potresti persino descrivere una matrice che crittografa una stringa n-caratteri alla volta, mescolandoli o "moltiplicandoli" (dovresti trovare una funzione di moltiplicazione / addizione).

*** : Quando progetti , prendi un oggetto 3D come una scultura, accendi una luce su di esso e vedi che tipo di ombra 2D scende su un muro.

Quali sono i limiti delle matrici?

Puoi svolgere ogni funzione con le matrici? No. Pensando graficamente, è difficile immaginare qualcosa che una matrice non potrebbe fare (ma esiste: un effetto "vortice" non può essere fatto, per esempio). Tuttavia, ecco un semplice esempio: diciamo che la funzione fè tale che f(u)ti restituisce u ogni elemento al quadrato . Vedrai che non puoi scrivere una matrice per questo: con le matrici c'è solo la possibilità di descrivere ricette che moltiplicano le coordinate per un numero costante, non è possibile esprimere altre funzioni fantasiose come il potere.

**** : Questo è anche il motivo per cui si chiama algebra lineare - la funzione di potenza non è lineare , non traccia una linea retta quando viene tracciata.

Sulla strana riga aggiuntiva in matrici 4D

Ora, perché la matrice nel tuo esempio 4 per 4? Questo non significa spazio a 4 dimensioni? Non abbiamo computer 4D, quindi perché? Questo è in realtà un trucco interessante con matrici che si riferisce al punto precedente sulle operazioni lineari.

Per quanto riguarda quali funzioni non possono essere eseguite con le matrici: qual è la matrice per spostare un punto 2D di 2 unità a destra (che produce il punto (x+2, y)? Ancora una volta, restiamo bloccati. C'è un modo per moltiplicare l'input, ma non c'è modo di aggiungere una costante. Per il lavoro in 2D, il trucco è far finta di non essere nello spazio 2D, ma nello spazio 3D, tranne che l'altezza (coordinata z o terzo elemento) di tutto è sempre 1 (è un po 'come è un universo 2D solo una "piastra" che giace piatta sul pavimento di un universo 3D - in quel caso la terza coordinata è sempre 0). Quindi puoi usare quest'ultima magica coordinata come costante, perché sai che è sempre 1 per ogni input.

Allo stesso modo, per spostare i punti 3D, sono necessarie coordinate 4D. Questo è anche il motivo per cui tutte le matrici di trasformazione 3D che vedrai avranno [0 0 0 1]come ultima riga: non devi mai modificare la quarta dimensione o il risultato sarà troppo complicato per essere rappresentato in 3D!


quindi come si fa una matrice per l'aggiunta? supponiamo che una riga sia Xx Yx Zx Tx... e l'ultima riga sia effettivamente 0t 0t 0t 1tsostituita da Xt Yt Zt Tt. Fare (x+2, y)da (x, y)te potrebbe andare 1x 0y 0z 2tche ti darebbe da 1*x + 0*y + 0*z + 2*1allora, t=1giusto? Che praticamente equivale a x + 2. Oh caro ora puoi rovinare il tuo rendering con divertenti valori T, vero? -grin- (lettura lunga, valore ancora migliore, grazie)
n611x007

2

Quella è una matrice 4x4 di colonna maggiore e, dal suo aspetto, una matrice di vista.

Le prime 3 colonne definiscono la direzione dei vettori di base (in alto, a sinistra, in avanti, come li hai chiamati) e l'ultima colonna definisce la traduzione del punto dell'occhio. Mettili insieme e puoi descrivere l'orientamento della tua fotocamera, e ancora più importante puoi usare questa matrice per trasformare i punti in uno spazio di coordinate noto come "spazio dell'occhio", "spazio della vista" o "spazio della fotocamera".

Questi sono tutti sinonimi per lo stesso spazio di coordinate. Sfortunatamente devi imparare tutti i sinonimi quando hai a che fare con la computer grafica perché libri e persone diversi li chiameranno con nomi diversi. La maggior parte degli spazi di coordinate ha più nomi.

A proposito, le tre colonne nella matrice della vista sono generalmente ortogonali, ovvero formano angoli retti l'uno rispetto all'altro. Questo non è necessario, ma è una proprietà molto comune quando si costruisce una fotocamera tradizionale.


1

TL; versione DR:

I primi tre elementi [x y z]in ciascuna riga rappresentano un vettore a base singola di un sistema coordinato trasformato. L'ultimo elemento wè un componente di traduzione.

La versione lunga

Se volessi una matrice che, quando applicata a un vertice, ruotasse il vertice sull'origine di, diciamo, di 45 gradi, riempiresti la matrice con tre vettori che rappresentano gli assi trasformati:

  • Un punto isulla xasse [1 0 0], ma ruotata di 45 gradi. Questo è semplicemente [i_x i_y i_z], dove i_xe i_ysono le gambe di un triangolo con un 45 gradi interni angolo rispetto all'asse X: [cos(45) sin(45) 0].
  • Un punto jsull'asse y [0 1 0], ma ruotato di 45 gradi rispetto a quell'asse. Disegnalo su un pezzo di carta e vedrai che, ruotando in senso antiorario, i componenti diventano [-sin(45) cos(45) 0].
  • Un punto ksulla zasse. In questo esempio, znon è interessato poiché stiamo ruotando sul piano xy (allineato allo schermo)

Quindi, abbiamo tre nuovi vettori: i, j, k. Il modo più semplice per visualizzarlo è semplicemente prendendo gli assi X e Y e ruotando l'intera disposizione trasversale.

Come li inseriamo in una matrice?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

O

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

Se moltiplichi un vertice per quella matrice, otterrai

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

per v = [1 0 0], e Θ = 90°, questo diventav1 = [0 1 0]

Per la traduzione, aggiungiamo una quarta riga e colonna e inseriamo i componenti della traduzione nell'ultima colonna. Aggiungiamo un quarto componente al vertice wche di solito è 1. In questo modo, quando moltiplichiamo il vertice per la matrice, il componente w fa sì che l'ultima colonna venga aggiunta al vertice di input, quindi il vertice viene spostato o tradotto. Le chiamiamo "coordinate omogenee". (Per i nostri scopi, "omogeneo" significa solo che c'è un quarto componente win ogni vettore e usiamo una matrice 4x4 invece di una 3x3. Spesso vedrai shader che usano matrici 4x3 per evitare di inviare la quarta riga per lo più inutile alla GPU, che consuma memoria e larghezza di banda preziose. La quarta riga è necessaria per la proiezione prospettica, ma non molto altro.)

Spero che sia di aiuto.


2
Quel momento in cui ti rendi conto di aver appena risposto a una domanda già risposta di tre anni fa ...
3Dave il

: P Guarda sempre la data della domanda prima di rispondere ...
HolyBlackCat
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.