En este tema, exploraremos los conceptos fundamentales de la iluminación y el sombreado en gráficos 3D. Estos conceptos son cruciales para crear imágenes realistas y comprensibles en aplicaciones de gráficos por computadora.

Conceptos Clave

  1. Modelo de Iluminación: Describe cómo la luz interactúa con las superficies.
  2. Tipos de Luz: Diferentes fuentes de luz y sus características.
  3. Sombreado: Métodos para calcular la apariencia de una superficie bajo una fuente de luz.
  4. Modelos de Sombreado: Técnicas para aplicar el sombreado en gráficos 3D.

Modelo de Iluminación

El modelo de iluminación más comúnmente utilizado en gráficos 3D es el Modelo de Iluminación de Phong. Este modelo considera tres componentes principales:

  1. Luz Ambiente: Luz difusa que ilumina todos los objetos de manera uniforme.
  2. Luz Difusa: Luz que se dispersa en todas las direcciones cuando golpea una superficie.
  3. Luz Especular: Luz que se refleja en una dirección específica, creando puntos brillantes.

Fórmula del Modelo de Iluminación de Phong

\[ I = I_a + I_d + I_s \]

Donde:

  • \( I \) es la intensidad total de la luz.
  • \( I_a \) es la intensidad de la luz ambiente.
  • \( I_d \) es la intensidad de la luz difusa.
  • \( I_s \) es la intensidad de la luz especular.

Tipos de Luz

  1. Luz Puntual: Emite luz desde un punto en todas las direcciones.
  2. Luz Direccional: Emite luz en una dirección específica, como el sol.
  3. Luz Focal: Emite luz en un cono, como una linterna.

Ejemplo de Luz Puntual

class LuzPuntual:
    def __init__(self, posicion, intensidad):
        self.posicion = posicion
        self.intensidad = intensidad

# Crear una luz puntual en la posición (10, 10, 10) con una intensidad de 1.0
luz = LuzPuntual((10, 10, 10), 1.0)

Sombreado

El sombreado determina cómo se calcula la luz en cada punto de una superficie. Los métodos más comunes son:

  1. Sombreado Plano: Calcula la iluminación una vez por polígono.
  2. Sombreado de Gouraud: Interpola la iluminación entre los vértices de un polígono.
  3. Sombreado de Phong: Interpola las normales entre los vértices y calcula la iluminación en cada píxel.

Ejemplo de Sombreado de Gouraud

class Vertice:
    def __init__(self, posicion, normal):
        self.posicion = posicion
        self.normal = normal

# Crear vértices con posiciones y normales
v1 = Vertice((1, 1, 1), (0, 0, 1))
v2 = Vertice((2, 1, 1), (0, 0, 1))
v3 = Vertice((1, 2, 1), (0, 0, 1))

# Interpolar la iluminación entre los vértices
def interpolar_iluminacion(v1, v2, v3):
    # Código para interpolar la iluminación
    pass

Modelos de Sombreado

  1. Sombreado Plano: Simple y rápido, pero puede producir bordes duros.
  2. Sombreado de Gouraud: Suaviza los bordes, pero puede perder detalles especulares.
  3. Sombreado de Phong: Más realista, pero computacionalmente más costoso.

Comparación de Modelos de Sombreado

Modelo de Sombreado Ventajas Desventajas
Plano Rápido y simple Bordes duros
Gouraud Suaviza bordes Pierde detalles especulares
Phong Más realista Más costoso

Ejercicio Práctico

Ejercicio 1: Implementar Sombreado de Phong

Implementa una función que calcule la iluminación usando el modelo de Phong.

def calcular_iluminacion_phong(posicion, normal, luz):
    # Luz ambiente
    I_a = 0.1
    
    # Luz difusa
    L = normalizar(restar(luz.posicion, posicion))
    N = normalizar(normal)
    I_d = max(dot(N, L), 0)
    
    # Luz especular
    V = normalizar(restar(camera_posicion, posicion))
    R = reflejar(L, N)
    I_s = pow(max(dot(V, R), 0), shininess)
    
    # Intensidad total
    I = I_a + I_d + I_s
    return I

# Funciones auxiliares
def normalizar(v):
    norm = sqrt(sum([x**2 for x in v]))
    return [x / norm for x in v]

def restar(v1, v2):
    return [v1[i] - v2[i] for i in range(len(v1))]

def dot(v1, v2):
    return sum([v1[i] * v2[i] for i in range(v1)])

def reflejar(L, N):
    return [2 * dot(N, L) * N[i] - L[i] for i in range(len(L))]

# Parámetros
posicion = (1, 1, 1)
normal = (0, 0, 1)
luz = LuzPuntual((10, 10, 10), 1.0)
camera_posicion = (0, 0, 10)
shininess = 32

# Calcular iluminación
intensidad = calcular_iluminacion_phong(posicion, normal, luz)
print("Intensidad de la luz:", intensidad)

Solución

La función calcular_iluminacion_phong calcula la iluminación en un punto dado usando el modelo de Phong. Utiliza la luz ambiente, difusa y especular para determinar la intensidad total de la luz.

Conclusión

En esta sección, hemos cubierto los conceptos fundamentales de la iluminación y el sombreado en gráficos 3D. Hemos aprendido sobre el modelo de iluminación de Phong, los tipos de luz, y los métodos de sombreado. Estos conceptos son esenciales para crear imágenes realistas en aplicaciones de gráficos por computadora.

En el siguiente módulo, aplicaremos estos conceptos para representar objetos 3D y explorar técnicas avanzadas de modelado y renderizado.

© Copyright 2024. Todos los derechos reservados