Home Manuale Progetto

Camera Projection and 3D object rendering

1. Rappresentazione di Oggetti 3D e Trasformazioni

Coordinate Omogenee:

Per rappresentare punti nello spazio proiettivo usiamo le coordinate omogenee. Questo ci permette di rappresentare traslazioni, rotazioni e proiezioni prospettiche tramite moltiplicazioni di matrici.

coordinate omogenee

Matrici di Trasformazione 3D (4x4):

Le trasformazioni (traslazione, rotazione, scaling) sono rappresentate da matrici 4x4 che operano su coordinate omogenee.

Forma Generale:

$$ \begin{bmatrix} x' \\ y' \\ z' \\ w' \end{bmatrix} = \begin{bmatrix} a_{00} & a_{01} & a_{02} & a_{03} \\ a_{10} & a_{11} & a_{12} & a_{13} \\ a_{20} & a_{21} & a_{22} & a_{23} \\ a_{30} & a_{31} & a_{32} & a_{33} \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ w \end{bmatrix} $$
traslazione e rotazione

Rotazione attorno agli assi di un angolo alfa:

traslazione e rotazione

2. Il Modello di Camera: Parametri Intrinseci ed Estrinseci

Il modello di camera descrive matematicamente il processo di proiezione di punti 3D dalla scena al piano immagine 2D. Si compone di due parti principali: parametri intrinseci ed estrinseci.

Sistemi di Coordinate:

Parametri Estrinseci: Definiscono la *posizione* e l'*orientamento* della camera rispetto al sistema di coordinate del mondo.

Trasformazione da Coordinate del Mondo a Coordinate della Camera:

$$ P_c = R P_w + t $$

Dove Pw = [Xw, Yw, Zw]T è un punto in coordinate del mondo, e Pc = [Xc, Yc, Zc]T è lo stesso punto in coordinate della camera.

Rappresentazione in Coordinate Omogenee:

Possiamo combinare rotazione e traslazione in un'unica matrice 4x4 (matrice di trasformazione *estrinseca*):

$$ \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix} = \begin{bmatrix} R & | & t \\ \hline 0 & & 1 \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} $$

Parametri Intrinseci: Definiscono le caratteristiche *interne* della camera, come la lunghezza focale e la posizione del punto principale.

Matrice dei Parametri Intrinseci (K):

$$ K = \begin{bmatrix} f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} $$

Matrice di Proiezione Completa (P):

Combina parametri intrinseci ed estrinseci in un'unica matrice 3x4 (o 4x4 in forma omogenea):

$$ P = K [ R | t ] $$

Equazione di Proiezione:

$$ \begin{bmatrix} u' \\ v' \\ w' \end{bmatrix} = P \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} $$

Dove pi = (u', v', w') sono le coordinate omogenee dell'immagine, e le coordinate pixel finali sono u = u'/w' e v = v'/w'. Questa divisione per w' è fondamentale per l'effetto prospettico.

3. Il Modello di Camera Pinhole

Il modello di camera pinhole (foro stenopeico) è una semplificazione del modello generale, ed è il modello *fondamentale* utilizzato in computer grafica (e implementato da `THREE.PerspectiveCamera`).

Assunzioni:

Questo modello, pur essendo un'idealizzazione, è una buona approssimazione per molte camere reali, *specialmente* quando la profondità di campo è ampia e la distorsione della lente è minima.

Semplificazioni:

Nel modello pinhole, la matrice dei parametri intrinseci K si semplifica:

$$ K = \begin{bmatrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1 \end{bmatrix} $$

Dove f = fx = fy è una singola lunghezza focale (in pixel). Questo perché, nel modello pinhole ideale, non c'è distorsione e gli assi u e v del piano immagine sono ortogonali e hanno la stessa scala.

Matrice di Proiezione Pinhole (con camera allineata agli assi):

Se la camera è allineata con gli assi del mondo (R = matrice identità) e traslata di un vettore t, la matrice di proiezione P si semplifica a:

$$ P = \begin{bmatrix} f & 0 & c_x & -f*t_x \\ 0 & f & c_y & -f*t_y \\ 0 & 0 & 1 & -t_z \end{bmatrix} $$

Spesso, per ulteriore semplicità, si assume che la camera sia all'origine (t = [0, 0, 0]). In questo caso, la matrice diventa:

$$ P = \begin{bmatrix} f & 0 & c_x & 0 \\ 0 & f & c_y & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} $$
Pinhole Camera Model

4. Proiezione Ortografica

La proiezione ortografica è un tipo di proiezione *parallela*. Non c'è un centro di proiezione singolo; tutti i raggi di proiezione sono paralleli tra loro e perpendicolari al piano immagine. Questo significa che le dimensioni degli oggetti *non* cambiano con la distanza dalla camera.

Matrice di Proiezione Ortografica:

$$ \begin{bmatrix} \frac{2}{right - left} & 0 & 0 & -\frac{right + left}{right - left} \\ 0 & \frac{2}{top - bottom} & 0 & -\frac{top + bottom}{top - bottom} \\ 0 & 0 & \frac{-2}{far - near} & -\frac{far + near}{far - near} \\ 0 & 0 & 0 & 1 \end{bmatrix} $$

Dove left, right, top, bottom, near e far definiscono i limiti del *volume di visualizzazione ortografico* (un parallelepipedo rettangolo). Tutto ciò che si trova al di fuori di questo volume viene scartato (clipping).

Proiezione:

pi = P * Pw

5. Rilevanza per Three.js

Three.js utilizza internamente questi concetti:

  • THREE.PerspectiveCamera: Implementa il modello di camera pinhole. I parametri fov, aspect, near e far definiscono la matrice di proiezione prospettica.
  • THREE.OrthographicCamera: Implementa la proiezione ortografica. I parametri left, right, top, bottom, near e far definiscono il volume di visualizzazione.
  • camera.position, camera.rotation: Controllano i parametri estrinseci (posizione e orientamento della camera). Three.js utilizza internamente matrici 4x4 per rappresentare queste trasformazioni.
  • Object3D.position, Object3D.rotation, Object3D.scale: Permettono di applicare trasformazioni (traslazione, rotazione, scaling) agli oggetti 3D. Three.js gestisce internamente la moltiplicazione delle matrici.