En esta sección, exploraremos los conceptos de proyecciones y vistas en gráficos 3D. Estos conceptos son fundamentales para la representación visual de objetos tridimensionales en una pantalla bidimensional. Aprenderemos sobre los diferentes tipos de proyecciones, cómo se calculan y cómo afectan la visualización de los objetos.

  1. Introducción a las Proyecciones

Las proyecciones son métodos para representar objetos tridimensionales en dos dimensiones. Existen dos tipos principales de proyecciones:

  1. Proyección Ortográfica
  2. Proyección en Perspectiva

1.1 Proyección Ortográfica

La proyección ortográfica es una técnica en la que los rayos proyectantes son perpendiculares al plano de proyección. Esto significa que no hay distorsión debido a la perspectiva, y las dimensiones de los objetos se mantienen constantes sin importar su distancia del plano de proyección.

Características:

  • No hay distorsión por perspectiva.
  • Las dimensiones de los objetos son constantes.
  • Útil para planos técnicos y dibujos de ingeniería.

Ejemplo de Matriz de Proyección Ortográfica:

import numpy as np

def ortho_projection_matrix(left, right, bottom, top, near, far):
    return np.array([
        [2 / (right - left), 0, 0, -(right + left) / (right - left)],
        [0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom)],
        [0, 0, -2 / (far - near), -(far + near) / (far - near)],
        [0, 0, 0, 1]
    ])

# Ejemplo de uso
left, right, bottom, top, near, far = -1, 1, -1, 1, -1, 1
ortho_matrix = ortho_projection_matrix(left, right, bottom, top, near, far)
print(ortho_matrix)

1.2 Proyección en Perspectiva

La proyección en perspectiva simula cómo el ojo humano ve el mundo. Los objetos más lejanos se ven más pequeños que los objetos cercanos, creando una sensación de profundidad.

Características:

  • Los objetos más lejanos se ven más pequeños.
  • Crea una sensación de profundidad.
  • Útil para simulaciones realistas y videojuegos.

Ejemplo de Matriz de Proyección en Perspectiva:

import numpy as np

def perspective_projection_matrix(fov, aspect, near, far):
    f = 1 / np.tan(fov / 2)
    return np.array([
        [f / aspect, 0, 0, 0],
        [0, f, 0, 0],
        [0, 0, (far + near) / (near - far), (2 * far * near) / (near - far)],
        [0, 0, -1, 0]
    ])

# Ejemplo de uso
fov = np.radians(90)
aspect = 16 / 9
near, far = 0.1, 100
perspective_matrix = perspective_projection_matrix(fov, aspect, near, far)
print(perspective_matrix)

  1. Tipos de Vistas

Las vistas determinan desde qué ángulo y posición se observa el objeto en el espacio 3D. Las vistas comunes incluyen:

  1. Vista Frontal
  2. Vista Superior
  3. Vista Lateral
  4. Vista en Perspectiva

2.1 Vista Frontal

La vista frontal muestra el objeto desde el frente, alineado con el eje Z.

2.2 Vista Superior

La vista superior muestra el objeto desde arriba, alineado con el eje Y.

2.3 Vista Lateral

La vista lateral muestra el objeto desde un lado, alineado con el eje X.

2.4 Vista en Perspectiva

La vista en perspectiva muestra el objeto desde un punto de vista arbitrario, simulando la visión humana.

  1. Ejercicios Prácticos

Ejercicio 1: Crear una Matriz de Proyección Ortográfica

Instrucciones:

  1. Define una función ortho_projection_matrix que tome los parámetros left, right, bottom, top, near, y far.
  2. Calcula y retorna la matriz de proyección ortográfica.

Solución:

def ortho_projection_matrix(left, right, bottom, top, near, far):
    return np.array([
        [2 / (right - left), 0, 0, -(right + left) / (right - left)],
        [0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom)],
        [0, 0, -2 / (far - near), -(far + near) / (far - near)],
        [0, 0, 0, 1]
    ])

# Prueba la función
left, right, bottom, top, near, far = -2, 2, -2, 2, -2, 2
print(ortho_projection_matrix(left, right, bottom, top, near, far))

Ejercicio 2: Crear una Matriz de Proyección en Perspectiva

Instrucciones:

  1. Define una función perspective_projection_matrix que tome los parámetros fov, aspect, near, y far.
  2. Calcula y retorna la matriz de proyección en perspectiva.

Solución:

def perspective_projection_matrix(fov, aspect, near, far):
    f = 1 / np.tan(fov / 2)
    return np.array([
        [f / aspect, 0, 0, 0],
        [0, f, 0, 0],
        [0, 0, (far + near) / (near - far), (2 * far * near) / (near - far)],
        [0, 0, -1, 0]
    ])

# Prueba la función
fov = np.radians(60)
aspect = 4 / 3
near, far = 0.1, 100
print(perspective_projection_matrix(fov, aspect, near, far))

  1. Conclusión

En esta sección, hemos aprendido sobre las proyecciones ortográficas y en perspectiva, así como los diferentes tipos de vistas en gráficos 3D. Hemos visto cómo se calculan las matrices de proyección y cómo afectan la visualización de los objetos. Estos conceptos son fundamentales para la representación y manipulación de gráficos en tres dimensiones.

En la siguiente sección, exploraremos el modelado de superficies, donde aplicaremos estos conceptos para crear y manipular objetos 3D más complejos.

© Copyright 2024. Todos los derechos reservados