En aquest tema, explorarem les tècniques de projecció i les diferents vistes utilitzades en la representació de gràfics en 3D. Les projeccions són fonamentals per convertir objectes 3D en imatges 2D que es poden visualitzar en una pantalla. Aprendrem sobre els diferents tipus de projeccions i com s'utilitzen per crear vistes realistes i útils dels objectes 3D.
Objectius d'Aprenentatge
Al final d'aquest tema, hauràs de ser capaç de:
- Entendre els conceptes bàsics de projecció en 3D.
- Diferenciar entre projeccions paral·leles i projeccions en perspectiva.
- Implementar matrius de projecció per a diferents tipus de projeccions.
- Aplicar tècniques de projecció per generar vistes de models 3D.
- Conceptes Bàsics de Projecció
Definició
La projecció és el procés de transformar punts d'un espai tridimensional (3D) a un espai bidimensional (2D). Aquest procés és essencial per visualitzar objectes 3D en pantalles 2D, com les de l'ordinador.
Tipus de Projeccions
Hi ha dos tipus principals de projeccions:
- Projecció Paral·lela
- Projecció en Perspectiva
- Projecció Paral·lela
Característiques
- Les línies projectades són paral·leles entre si.
- No hi ha efecte de profunditat; els objectes no es fan més petits amb la distància.
Tipus de Projecció Paral·lela
- Projecció Ortogonal: Les línies de projecció són perpendiculars al pla de projecció.
- Projecció Obliqua: Les línies de projecció no són perpendiculars al pla de projecció.
Matriu de Projecció Ortogonal
La matriu de projecció ortogonal pot ser representada com:
\[ P_{ortho} = \begin{pmatrix}
1 & 0 & 0 & 0
0 & 1 & 0 & 0
0 & 0 & 0 & 0
0 & 0 & 0 & 1
\end{pmatrix} \]
Exemple de Codi
import numpy as np def ortho_projection_matrix(): return np.array([ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1] ]) # Aplicar la matriu de projecció ortogonal a un punt 3D point_3d = np.array([2, 3, 5, 1]) projection_matrix = ortho_projection_matrix() projected_point = projection_matrix @ point_3d print("Punt projectat:", projected_point)
- Projecció en Perspectiva
Característiques
- Les línies projectades convergeixen en un punt de fuga.
- Els objectes es fan més petits amb la distància, creant un efecte de profunditat.
Matriu de Projecció en Perspectiva
La matriu de projecció en perspectiva pot ser representada com:
\[ P_{persp} = \begin{pmatrix}
1 & 0 & 0 & 0
0 & 1 & 0 & 0
0 & 0 & 1 & -\frac{1}{d}
0 & 0 & 0 & 1
\end{pmatrix} \]
on \( d \) és la distància del punt de fuga al pla de projecció.
Exemple de Codi
def perspective_projection_matrix(d): return np.array([ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -1/d], [0, 0, 0, 1] ]) # Aplicar la matriu de projecció en perspectiva a un punt 3D d = 5 # Distància del punt de fuga point_3d = np.array([2, 3, 5, 1]) projection_matrix = perspective_projection_matrix(d) projected_point = projection_matrix @ point_3d # Normalitzar el punt projectat projected_point /= projected_point[3] print("Punt projectat:", projected_point)
- Comparació de Projeccions
Característica | Projecció Paral·lela | Projecció en Perspectiva |
---|---|---|
Efecte de profunditat | No | Sí |
Línies de projecció | Paral·leles | Convergeixen |
Aplicació principal | Dibuixos tècnics | Gràfics realistes |
Complexitat de càlcul | Baixa | Alta |
- Exercicis Pràctics
Exercici 1: Projecció Ortogonal
Implementa una funció que prengui una llista de punts 3D i els projecti utilitzant una matriu de projecció ortogonal.
Exercici 2: Projecció en Perspectiva
Implementa una funció que prengui una llista de punts 3D i els projecti utilitzant una matriu de projecció en perspectiva amb una distància de punt de fuga especificada.
Solucions
Solució Exercici 1
def ortho_projection(points): projection_matrix = ortho_projection_matrix() return [projection_matrix @ point for point in points] points_3d = [np.array([2, 3, 5, 1]), np.array([1, 2, 3, 1])] projected_points = ortho_projection(points_3d) print("Punts projectats (ortogonal):", projected_points)
Solució Exercici 2
def perspective_projection(points, d): projection_matrix = perspective_projection_matrix(d) projected_points = [projection_matrix @ point for point in points] return [point / point[3] for point in projected_points] points_3d = [np.array([2, 3, 5, 1]), np.array([1, 2, 3, 1])] d = 5 projected_points = perspective_projection(points_3d, d) print("Punts projectats (perspectiva):", projected_points)
Resum
En aquest tema, hem après sobre les projeccions paral·leles i en perspectiva, les seves característiques i com implementar-les utilitzant matrius de projecció. Hem vist exemples pràctics de codi per aplicar aquestes projeccions a punts 3D i hem comparat les dues tècniques. Amb aquests coneixements, estàs preparat per generar vistes de models 3D utilitzant diferents tècniques de projecció.
Matemàtiques 3D
Mòdul 1: Fonaments d'Àlgebra Lineal
- Vectors i Espais Vectorials
- Matrius i Determinants
- Sistemes d'Equacions Lineals
- Autovalors i Autovectors
Mòdul 2: Transformacions Lineals
- Definició i Propietats
- Matrius de Transformació
- Rotacions, Translacions i Escalats
- Composició de Transformacions