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:

  1. Entendre els conceptes bàsics de projecció en 3D.
  2. Diferenciar entre projeccions paral·leles i projeccions en perspectiva.
  3. Implementar matrius de projecció per a diferents tipus de projeccions.
  4. Aplicar tècniques de projecció per generar vistes de models 3D.

  1. 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:

  1. Projecció Paral·lela
  2. Projecció en Perspectiva

  1. 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

  1. Projecció Ortogonal: Les línies de projecció són perpendiculars al pla de projecció.
  2. 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)

  1. 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)

  1. Comparació de Projeccions

Característica Projecció Paral·lela Projecció en Perspectiva
Efecte de profunditat No
Línies de projecció Paral·leles Convergeixen
Aplicació principal Dibuixos tècnics Gràfics realistes
Complexitat de càlcul Baixa Alta

  1. 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ó.

© Copyright 2024. Tots els drets reservats