Primitive di movimento: traslazione e rotazione

L'autore della striscia Epic Fail, Cristiano Corsani, ci svela le basi per l'animazione 3D al computer.

Avatar di Tom's Hardware

a cura di Tom's Hardware

Primitive di movimento: traslazione e rotazione

Occupiamoci adesso delle primitive di movimento: traslare un punto significa spostarlo nello spazio dalla sua posizione originale in una nuova posizione. Matematicamente si traduce nella somma algebrica delle coordinate del punto x, y e z con altrettanti valori Tx, Ty e Tz. Noi però vediamola in modo leggermente diverso. Così:

Fig. 2 - La matrice di traslazione di un punto

É un prodotto tra matrici: la matrice che rappresenta il punto e la matrice di traslazione T. Sarebbe stato più naturale metterlo nella forma [ x y z ] + [ Tx Ty Tz ]. Invece no, ci piace di più così. L'introduzione del valore "1" dunque serve a trasformare - passatemi il termine - la traslazione da somma di matrici a prodotto di matrici. Perché? Lo scopriremo a breve.

Un'altra importantissima primitiva di movimento è la rotazione. Immaginiamo di voler ruotare un punto di un certo angolo "a" rispetto all'asse z:

Fig. 3 - La matrice di rotazione di un punto rispetto a z

Un altro prodotto tra matrici: la matrice del punto e la matrice di rotazione. Dunque si prefigura questa situazione: muovere un punto nello spazio si traduce nel prodotto tra la matrice che rappresenta il punto [ x y z 1 ] e una matrice di movimento. Abbiamo già osservato com'è fatta una matrice di traslazione e una matrice di rotazione rispetto all'asse z. Esistono altre due matrici di rotazione, una per ciascun asse rimasto (asse delle x e asse delle y), simili a quella della Fig 3, tralasciamo la loro forma, non ci interessa come sono fatte. Se volessimo ruotare invece il punto di un angolo "a" non più rispetto a uno degli assi di riferimento, ma rispetto a una retta r qualsiasi nello spazio è sufficiente scegliere un punto Q qualsiasi su questa retta e spostare il riferimento (gli assi cartesiani) in modo che l'origine sia nel punto Q e l'asse z coincida con la retta r.

Fig. 4 - Rotazione di un punto rispetto a una retta

Per arrivare a questo risultato basta operare in sequenza: una traslazione verso Q (matrice T), una rotazione rispetto all'asse x (matrice Mx) e una rotazione rispetto all'asse y (matrice My). A quel punto siamo nella condizione di una semplice rotazione rispetto all'asse z (matrice Mz). Abbiamo scomposto il movimento in una serie di movimenti base noti. Dunque il nuovo punto sarà in posizione: 

[ x' y' z' 1 ] = ( [ x y z 1 ] T Mx My ) Mz

ma abbiamo completamente rivoluzionato il sistema di riferimento. Nessun problema: basta rimetterlo a posto. É facile calcolare le matrici inverse di "movimento" (ad esempio l'inversa della traslazione T, T-1 , è semplicemente la T con i valori Tx, Ty e Tz negati.). Dunque basta aggiungere  una sequenza di movimenti "inversi", così:

[x" y" z" 1] = ([x y z 1] T Mx My) Mz (My-1 Mx-1 T-1) = [x y z 1] R

La matrice di rotazione R dunque è semplicemente un prodotto di matrici, facilmente (e velocemente) calcolabile da un hardware/firmware specializzato (CPU, GPU, ...). Proprio ciò che ci serve no? Il nostro spazio immaginario può essere dunque "modellato" e "manipolato" nella memoria di un calcolatore in maniera, direi quasi, primitiva con le matrici. Bingo!