Ray Tracing: Plano, Triángulo y Cubo

Juan Mellado, 3 Noviembre, 2005 - 00:07

Este artículo presenta el cálculo de intersecciones, y obtención de normales, de un rayo con un plano, un triángulo y un cubo.

Estos tres objetos se estudian a un mismo tiempo porque todos se basan en el primero de ellos, es decir, el plano. Un triángulo es una región finita dentro de un plano infinito, y un cubo es un conjunto de seis planos enfrentados dos a dos.

Intersección con un Plano

Un plano se define por un vector normalizado perpendicular a la superficie del mismo N = (nx, ny, nz), y la distancia d que le separa del origen de coordenadas, de forma que los puntos (x, y, z) sobre su superficie son aquellos que verifican la siguiente ecuación:

nx * x + ny * y + nz * z + d = 0

En este caso particular no ha lugar hablar de expresión canónica. Las optimizaciones vendrían si se consideraran planos paralelos a cada uno de los ejes, en los que una de las coordenadas de la normal es 1 y las otras dos 0, pero son casos particulares, no soluciones generales. Es más, para el cálculo de la intersección del rayo con el plano se considerará el rayo sin transformar, esto es, expresado en las coordenadas globales de la escena.

Un rayo puede intersectar con un plano en un único punto de su superficie, ya sea en su cara anterior o posterior. O puede ser paralelo, o estar completamente incluido dentro del mismo, en cuyo caso no se considera que se produzca intersección alguna.

Intersecciones entre un rayo y un plano

El punto de intersección entre un plano cualquiera y un rayo R(t) = O + D * t, con su origen O = (ox, oy, oz) y vector dirección normalizado D = (dx, dy, dz), es aquel punto (x, y, z) sobre la superficie del plano que verifica la ecuación del rayo:

nx * (ox + dx * t) + ny * (oy + dy * t) + nz * (oz + dz * t) + d = 0

Resolviendo por t:

nx * ox + nx * dx * t + ny * oy + ny * dy * t + nz * oz + nz * dz * t + d = 0
(nx * dx + ny * dy + nz * dz) * t + nx * ox + ny * oy + nz * oz + d = 0
t = - (nx * ox + ny * oy + nz * oz + d) / (nx * dx + ny * dy + nz * dz)

El punto de intersección I sería simplemente el resultado de evaluar el t calculado en la ecuación del rayo:

I = R(t)

Notar que el denominador de la ecuación de cálculo de t es el producto escalar del vector normal al plano y el vector dirección del rayo:

nx * dx + ny * dy + nz * dz = N · D

El producto escalar de dos vectores es cero si los vectores son perpendiculares, por lo que si el denominador de la expresión de t vale cero, querrá decir que el rayo es paralelo al plano, o está contenido completamente en el mismo, y no existe intersección.

Por otra parte, el signo del producto escalar indica si los dos vectores apuntan hacia un mismo lado, signo positivo, o hacia lados contrarios, signo negativo. Por lo que el signo será negativo si el rayo incide en la cara anterior del plano (apunta en dirección contraria a la normal), y positivo si incide sobre la cara posterior (apunta en la misma dirección que la normal).

Normal al Punto de Intersección con un Plano

Si el rayo incide en la cara anterior se tomará la normal en el punto de intersección como la normal al plano:

Ni = N

Si el rayo incide en la cara posterior se tomará la normal al plano con el signo cambiado:

Ni = -N