Ray Tracing: Barrido del Plano de Proyección

Juan Mellado, 14 Octubre, 2005 - 18:46

Tamaño y Posición de un Pixel

El último parámetro de entrada al sistema es la resolución (tamaño) en pixels que se quiere que tenga la imagen resultante, width x height. Con la resolución se determina el número de pixels totales y el tamaño de cada pixel individual en la ventana de proyección.

El tamaño horizontal de un pixel en la ventana de proyección se calcula diviendo el tamaño horizontal de la ventana de proyección por el ancho en pixels de la imagen deseada:

hpixel = hsize / width

Y de forma análoga se obtiene el tamaño vertical de un pixel:

vpixel = vsize / height

Como parámetro de entrada, la resolución puede tomar un valor por defecto, por ejemplo 100x100, o se puede obligar a introducirla obligatoriamente. En cualquier caso, tanto la resolución vertical como la horizontal deben ser mayores que cero. Sin fueran cero no se podría realizar la división para obtener el tamaño de un pixel, sería como decir que los pixels no tienen dimensiones.

Origen de la Ventana de Proyección

De entre todos los pixels interesa destacar la posición del que se encuentra en la esquina superior izquierda de la ventana de proyección, porque será el primero en visitarse. Su ubicación se obtiene partiendo del centro de la ventana y desplazándose hacia la izquierda y hacia arriba una distancia equivalente a la mitad de la resolución deseada:

ORIGIN = CENTER - ( ( (width - 1) / 2) * hpixel * HORZ) + ( ( (height - 1) / 2) * vpixel * VERT)

Y este mismo criterio se puede aplicar al resto de pixels con el objetivo de obtener una expresión más genérica que obtenga el centro de cualquier pixel (i, j) dentro de la ventana de proyección:

PIXEL (i, j) = ORIGIN + (i * hpixel * HORZ) - (j * vpixel * VERT)

Notar que en esta última expresión la dirección de avance vertical está invertida, debido a que se parte de ORIGIN, y que la numeración vertical habitual de los pixels crece de arriba hacia abajo. El pixel (0, 0) está localizado en la esquina superior izquierda y el pixel (width - 1, height - 1) en la esquina inferior derecha.

Generación de Rayos

Una vez definido completamente el sistema, se puede proceder al barrido de la ventana de proyección con rayos, mediante dos bucles que recorran los pixels de izquierda a derecha y de arriba hacia abajo, generando para cada pixel (i, j) un rayo que parta de la posición del observador y atraviese el centro del pixel:

FOR j = 0 TO height - 1

FOR i = 0 TO width - 1

RAY (i, j, t) = EYE + ( (PIXEL(i, j) - EYE) / |PIXEL (i, j) - EYE| ) * t

NEXT i

NEXT j

Definidos de esta forma, los rayos no son más que vectores con un origen, el punto EYE, y una dirección, la que une el origen con el centro del pixel.

El parámetro t de la ecuación del rayo nos permite movernos sobre la línea recta imaginaria que define el mismo. Un valor cero nos sitúa en el origen, un valor negativo por detrás de este y uno positivo por delante. Este parámetro t será además el que se utilice para el cálculo de intersecciones con los objetos de la escena. Tema del siguiente artículo de esta serie.

Resumen

Parámetros de Entrada:

EYE: Posición del Observador
LOOKAT: Punto concreto al que mira el Observador
UP: Dirección para determinar el Plano Vertical del Observador
dis: Distancia del Observador al Plano de Proyección
hfov: Ángulo del Campo de Visión Horizontal
vfov: Ángulo del Campo de Visión Vertical
width: Resolución Horizontal en pixels de la Imagen deseada
height: Resolución Vertical en pixels de la Imagen deseada

Valores Calculados:

VIEW: Dirección en la que mira el Observador
CENTER: Posición del centro de la Ventana de Proyección
HORZ: Vector de desplazamiento Horizontal sobre la Ventana de Proyección
VERT: Vector de desplazamiento Vertical sobre la Ventana de Proyección
hsize: Tamaño Horizontal de la Ventana de Proyección
vsize: Tamaño Vertical de la Ventana de Proyección
hpixel: Tamaño Horizontal de un pixel en la Ventana de Proyección
vpixel: Tamaño Vertical de un pixel en la Ventana de Proyección
ORIGIN: Posición del centro del pixel de la esquina superior izquierda de la Ventana de Proyección
PIXEL(i, j): Posición del centro del pixel (i, j) en la Ventana de Proyección
RAY(i, j, t): Ecuación del rayo que parte del Observador y atraviesa el centro del pixel (i, j)

Proceso:

1. Cálculo de la Dirección en la que mira el Observador:

VIEW = (LOOKAT - EYE) / |LOOKAT - EYE|

2. Obtención del Sistema de Referencia sobre el Plano de Proyección:

CENTER = EYE + (dis * VIEW)
HORZ = (UP x VIEW) / |UP x VIEW|
VERT = (VIEW x HORZ) / |VIEW x HORZ|

3. Cálculo del Tamaño de la Ventana de Proyección:

hsize = 2 * dis * TAN(hfov / 2)
vsize = 2 * dis * TAN(vfov / 2)

4. Cálculo del Tamaño de los pixels en la Ventana de Proyección:

hpixel = hsize / width
vpixel = vsize / height

5. Obtención del centro del pixel de la esquina superior izquierda de la Ventana de Proyección:

ORIGIN = CENTER - ( ( (width - 1) / 2) * hpixel * HORZ) + ( ( (height - 1) / 2) * vpixel * VERT)

6. FOR j = 0 TO height - 1

7. FOR i = 0 TO width - 1

8. Generación del rayo que atraviesa el centro del pixel (i, j):

PIXEL(i, j) = ORIGIN + (i * hpixel * HORZ) - (j * vpixel * VERT)
RAY(i, j, t) = EYE + ( (PIXEL(i, j) - EYE) / |PIXEL(i, j) - EYE| ) * t

NEXT i

NEXT j

¿No encontró lo que buscaba?

Utilice el buscador para encontrar más páginas en esta web o en toda Internet.
 
Web www.inmensia.com

Más páginas en esta web sobre RayTracing