TRASFORMAZIONI DI COORDINATE

Coordinate omogenee

Usate dentro al sistema grafico invece delle coordinate cartesiane.

Le quadruple di coordinate omogenee con w=0, cioe' della forma (x,y,z,0) identificano punti all'infinito nella direzione del vettore (x,y,z).

Vantaggi dell'uso di coordinate omogenee:

Trasformazioni di modellazione

Traslazioni, rotazioni, scalature per posizionare un oggetto all'interno della scena.

Sono trasformazioni rigide (mantengono le proporzioni fra le parti dell'oggetto).

Poiche' i nostri oggetti (primitive geometriche) sono descritti in termini di vertici, basta applicare la trasformazione ai vertici.

Traslazione

Traslare un oggetto = traslare solidalmente tutti i suoi punti.
Traslare un punto = spostarlo di una certa distanza in una certa direzione.

Parametro = vettore di traslazione (tx,ty,tz).

Se P = (x,y,z) e' un punto, il punto traslato e' P' = (x+tx,y+ty,z+tz) = (x,y,z) + (tx,ty,tz).

In coordinate omogenee e forma matriciale (provare per credere):

[x']    [1 0 0 tx] [x]
[y']  = [0 1 0 ty] [y]
[z']    [0 0 1 tz] [z]
[1]     [0 0 0 1 ] [1]
Nota: la traslazione inversa corrisponde al vettore di traslazione inverso (-tx,-ty,-tz).

Scalatura

Scalare un oggetto = scegliere un punto C che rimane fermo e riposizionare ciascun punto dell'oggetto ricalcolando le sue distanze da C (nella direzione di ciascun asse coordinato) in base ad una nuova unita' di misura.

Adesso vediamo scalatura con punto fermo l'origine.

Parametri = fattori di scala (sx,sy,sz), uno per ogni asse del sistema di riferimento.

Se P = (x,y,z) e' un punto, il punto scalato e' P' = (sx*x,sy*y,sz*z).

In coordinate omogenee e forma matriciale (provare per credere):

[x']    [sx 0  0  0] [x]
[y']  = [0  sy 0  0] [y]
[z']    [0  0  sz 0] [z]
[1]     [0  0  0  1] [1]
La scalatura tenendo fermo un punto generico C diverso dall'origine si ottiene come combinazione di trasformazioni (ved. dopo).

Nota: se i fattori di scala sono negativi, ottengo una riflessione speculare.

Rotazione

Ruotare un oggetto = scegliere un asse di rotazione (una retta r) ed un verso di rotazione, e muovere ciascun punto dell'oggetto solidalmente dello stesso angolo attorno ad r nel verso assegnato.

Nota: anziche' una retta ed un verso di rotazione, posso dare una retta orientata (il verso di rotazione e' quello che appare antiorario guardando nella direzione opposta a quella della retta).

Adesso vediamo rotazione attorno ad uno degli assi coordinati, per esempio l'asse z.

Parametri: angolo di rotazione alfa (alfa > 0 per senso antiorario, alfa < 0 per senso orario).

Se P = (x,y,z) e' un punto, il punto ruotato e' P' = (x',y',z') dove:


In coordinate omogenee e forma matriciale (provare per credere):

[x']    [cos(alfa)  -sin(alfa)  0 0] [x]
[y']  = [sin(alfa)   cos(alfa)  0 0] [y]
[z']    [0           0          1 0] [z]
[1]     [0           0          0 1] [1]
Nota: e' uguale alla matrice identita' eccetto per le prime due righe e colonne (quelle corrispondenti alle coordinate x ed y).

Analogamente le matrici di rotazione per rotazione attorno all'asse x ed y sono uguali all'identita' tranne per le righe e colonne corrispondenti alle coordinate yz e xz.

La matrice di rotazione per rotazione attorno ad una retta generica passante per l'origine ha forma piu' complicata, che non vediamo.

La rotazione attorno ad una retta non passante per l'origine si ottiene come combinazione di trasformazioni (ved. dopo).

Composizione di trasformazioni

Un sistema grafico (es:OpenGL) fornisce istruzioni per definire: Tutte le altre trasformazioni rigide si ottengono per composizione di queste.

Composizione = eseguire le trasformazioni in sequenza.

Sequenza di trasformazioni = moltiplicazione in sequenza delle rispettive matrici.

L'ordine da sinistra a destra in cui scrivo le matrici nella moltiplicazione e' opposto all'ordine in cui applico le trasformazioni.

Se P e' un punto, ed M1, M2 sono due matrici di trasformazione, la moltiplicazione M1 M2 P applica a P prima M2 e poi M1.

Scalatura tenendo fermo un punto generico

Sia C=(x0,y0,z0) il punto che deve restare fermo.

Rotazione attorno ad un asse passante per un punto generico

Si fa in modo analogo.

Proprieta' della composizione di trasformazioni

Come la moltiplicazione di matrici, in generale non e' commutativa.


La composizione di trasformazioni dello stesso tipo e' commutativa (traslazioni con traslazioni, scalature con fermo lo stesso punto, rotazioni attorno allo stesso asse).

Trasformazioni di vista

Suppongo di sapere, espresse in coordinate del mondo:

Primo modo: lo faccio a mano

Costruisco la trasformazione che posiziona la scena davanti alla telecamera, ovvero che porta la scena da coordinate del mondo a coordinate dell'occhio. Questa trasformazione e' una combinazione di traslazioni e rotazioni.

Dato un punto P espresso in coordinate di vista, voglio trovare le coordinate di P espresse in coordinate dell'occhio.

  1. Traslazione che porta V nell'origine: vettore di traslazione (-vx,-vy,-vz).
    Esempio: se la mia scena e' centrata nell'origine di WC e voglio vederla da V = (10,0,0) la traslo indietro di 10 unita' lungo l'asse x.
  2. Rotazione che porta gli assi x,y,z dell'occhio a coincidere con gli assi x,y,z di WC. Matrice di rotazione:
    [ix iy iz 0]      versore asse x
    [jx jy jz 0]      versore asse y
    [kx ky kz 0]      versore asse z
    [0  0  0  1]
    

    Secondo modo: lo faccio fare al sistema

    Il sistema (es: OpenGL) fornisce una funzione che permette di specificare una trasformazione di vista dando: Manca un asse (asse x) del sistema dell'occhio: il sistema lo calcola automaticamente come il prodotto vettoriale dei due assi noti.

    Quando conviene usare l'uno o l'altro modo

    In generale e' difficile costruire a mano la rotazione. Puo' essere facile in casi particolari. Esempio: Esempio:

    Nel programma Simple3D.java il punto di vista puo' orbitare attorno alla scena in base a due angoli (latitudine, longitudine) controllati dall'utente. La scena in coordinate del mondo e' centrata nell'origine. La trasformazione di vista consiste in: rotazione attorno all'asse z (di angolo longitudine), rotazione attorno all'asse x (di angolo latitudine), traslazione per portare il punto di vista ad una certa distanza dalla scena.
    In questo caso usare il secondo modo sarebbe piu' complicato perche' dovrei calcolare a mano la posizione del punto di vista in coordinate del mondo con funzioni trigonometriche.
    Nota: il programma richiede anche il file BasicGL.java (usato negli esercizi di laboratorio). Le rotazioni si ottengono muovendo il mouse con il testo premuto all'interno della finestra grafica.

    Trasformazioni di proiezione

    Vediamo solo le seconde due (sono quelle disponibili in OpenGL).

    Proiezione ortografica

    In un sistema grafico definita fornendo un volume di vista che e' un parallelepipedo retto con facce allineate con le direzioni dei piani coordinati del sistema di riferimento dell'occhio.

    Tale parallelepipedo e' descritto dalle sue coordinate xyz minime e massime.

    Il parallelepipedo viene traslato e scalato per coincidere con il cubo NPC.

    Proiezione prospettica

    In un sistema grafico definita fornendo, in coordinate dell'occhio, un volume di vista che e' un tronco di piramide le cui facce laterali convergono nel punto di vista (= origine), e le cui basi sono parallele al piano xy dell'occhio. L'intervallo delle x e delle y sulla base maggiore del tronco di piramide si desumono a partire dalle informazioni di cui sopra.

    Il tronco di piramide viene deformato (dilatando la parte vicina, restringendo la parte lontana) per coincidere con il cubo NPC. Non e' una trasformazione rigida!

    Come si deformano gli oggetti

    Vediamo come si deformano le coordinate x,y in una trasformazione prospettica.

    O = punto di vista (origine), P = (x,y,z) = punto nel volume di vista.

    Nella trasformazione, il punto P riceve le stesse coordinate x ed y di tutti i punti giacenti sulla retta congiungente OP, in particolare le stesse coordinate del punto P' = (x',y',near) intersezione di OP con la base minore della piramide.

    Vediamo per esempio la coordinata y. In figura la sezione con piano di taglio il piano x=0:

    Il rapporto fra y' ed y dice quanto la y di P viene compressa/dilatata.

    Sfruttando la similitudine fra i triangoli OHP e OH'P' otteniamo y' = y * near/z

    Piu' P e' vicino al punto di vista (z minore) e piu' la y viene dilatata.

    Analogamente la x si ottiene x' = x * near/z

    Poi viene eseguita la normalizzazione per ridurre l'intervallo dei valori delle coordinate fra -1 ed 1.