◩ Grafica e immagini

Trasformazioni 3D: matrici, coordinate omogenee e proiezione

Come un punto 3D arriva sullo schermo: traslazione, rotazione e scala con matrici 4×4, coordinate omogenee, matrici model, view e projection.

Ogni volta che un oggetto si muove in una scena 3D, che la telecamera ruota o che un modello viene disegnato sullo schermo, il computer esegue la stessa operazione su migliaia o milioni di vertici: una moltiplicazione per una matrice. È il linguaggio comune di tutti i software 3D, dai programmi di modellazione ai motori di gioco.

Le tre trasformazioni di base

  • Traslazione: sposta un punto aggiungendo un vettore (dx, dy, dz).
  • Scala: moltiplica le coordinate per dei fattori (sx, sy, sz). Fattori diversi tra loro deformano l'oggetto; un fattore negativo lo specchia.
  • Rotazione: ruota il punto attorno a un asse di un certo angolo.

Rotazione e scala si possono esprimere con una matrice 3 × 3. La traslazione no, perché non è una trasformazione lineare: sposta anche l'origine. Per trattare tutte e tre allo stesso modo si usa un accorgimento elegante.

Le coordinate omogenee

Si aggiunge una quarta coordinata, w. Un punto (x, y, z) diventa (x, y, z, 1). Con una matrice 4 × 4 la traslazione diventa una semplice moltiplicazione:

| 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    |

Le direzioni (come le normali o la direzione di una luce) si scrivono invece con w = 0: in questo modo la traslazione non le influenza, come è giusto che sia. Una direzione resta tale anche se l'oggetto si sposta.

Il vantaggio decisivo è che più trasformazioni si possono combinare in un'unica matrice moltiplicandole tra loro. Invece di applicare a ogni vertice scala, poi rotazione, poi traslazione, si calcola una sola matrice e la si applica una volta sola.

L'ordine conta

Il prodotto tra matrici non è commutativo: A × B è in generale diverso da B × A. In pratica significa che ruotare e poi spostare dà un risultato diverso da spostare e poi ruotare.

  • Se un oggetto viene prima ruotato attorno all'origine e poi spostato, gira su se stesso e poi si sposta.
  • Se viene prima spostato e poi ruotato, ruota attorno all'origine del mondo, descrivendo un'orbita.

L'ordine abituale per posizionare un oggetto è: scala, poi rotazione, poi traslazione. Con la convenzione dei vettori colonna, la matrice combinata si scrive al contrario: M = T × R × S, e si applica al vertice da destra verso sinistra.

Gli spazi di coordinate

Un vertice attraversa una serie di sistemi di riferimento prima di diventare un pixel:

Spazio Descrizione Matrice che porta al successivo
Oggetto (locale) coordinate come definite dal modellatore Model
Mondo posizione nella scena View
Vista (camera) coordinate rispetto alla telecamera Projection
Clip coordinate omogenee prima della divisione divisione per w
Dispositivo normalizzato cubo standard, valori tra −1 e 1 (o 0 e 1 per la profondità, a seconda dell'API) trasformazione di viewport
Schermo pixel —

Le prime tre matrici vengono spesso combinate nella matrice MVP (Model-View-Projection), calcolata una volta per oggetto e passata alla scheda video.

La matrice View è, in sostanza, l'inversa della posizione e dell'orientamento della telecamera: invece di muovere la telecamera nel mondo, si muove il mondo in senso opposto in modo che la telecamera stia ferma nell'origine, guardando lungo un asse.

La proiezione prospettica

Nella realtà gli oggetti lontani appaiono più piccoli. Matematicamente, questo corrisponde a dividere x e y per la distanza dalla telecamera. La matrice di proiezione prospettica prepara questa divisione copiando la profondità nella coordinata w. Dopo la moltiplicazione, la scheda video divide x, y e z per w: è la divisione prospettica.

I parametri della proiezione sono:

  • campo visivo (field of view): l'ampiezza dell'inquadratura, come la focale di un obiettivo;
  • rapporto d'aspetto: larghezza diviso altezza dello schermo;
  • piano vicino e piano lontano: le distanze minima e massima visibili.

La scelta dei piani vicino e lontano influisce sulla precisione della profondità. Con un piano vicino troppo prossimo alla telecamera, la precisione si concentra tutta lì e gli oggetti lontani mostrano z-fighting, superfici che tremolano perché la scheda non riesce a stabilire quale sia davanti.

La proiezione ortografica, invece, non divide per la distanza: oggetti uguali appaiono uguali a qualunque profondità. Si usa nei disegni tecnici, nelle viste CAD e in molti giochi con visuale isometrica.

Rotazioni e quaternioni

Descrivere le rotazioni con tre angoli (angoli di Eulero) è intuitivo ma ha un difetto noto, il gimbal lock: in certe configurazioni due assi si allineano e si perde un grado di libertà. Per animazioni e interpolazioni fluide si usano i quaternioni, oggetti matematici a quattro componenti che rappresentano una rotazione senza questo problema e si interpolano in modo regolare. Al momento di disegnare, vengono convertiti in matrice.

In sintesi

  • Traslazione, rotazione e scala si rappresentano con matrici 4 × 4 grazie alle coordinate omogenee.
  • Punti hanno w = 1, direzioni w = 0: la traslazione non influenza le direzioni.
  • Il prodotto tra matrici non è commutativo: l'ordine abituale è scala, rotazione, traslazione.
  • Un vertice passa per gli spazi oggetto, mondo, vista, clip e schermo; la matrice MVP li riassume.
  • La proiezione prospettica si completa con la divisione per w; i quaternioni evitano il gimbal lock.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche