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.