inmensia |
Ray Tracing: Plano, Triángulo y Cubo
Juan Mellado, 3 Noviembre, 2005 - 00:07
Intersección con un CuboUn cubo puede definirse mediante dos puntos P1 = (x1, y1, z1) y P2 = (x2, y2, z2), los correspondientes a las coordenadas de dos esquinas del cubo enfrentadas diagonalmente. Estas coordenadas definen seis planos, paralelos dos a dos, donde se encuentran las caras del cubo. Un rayo puede intersectar con un cubo en dos puntos de su superficie, cuando atraviesa dos de sus caras. O en un único punto, cuando su origen está en el interior del cubo o es tangente al mismo. O puede ser paralelo, o estar completamente incluido dentro de una de las caras, en cuyo caso no se considera que se produzca intersección alguna. ![]() Una forma de calcular las posibles intersecciones sería comprobar si se produce alguna intersección con cada uno de los planos del cubo, y ver a continuación si el punto de intersección encontrado está dentro de la cara de los planos intersectados. Sin embargo, para evitar todo este cálculo, se suele utilizar una definición simplificada del cubo basada en seis planos alineados dos a dos con los ejes de coordenadas. Esta disposición permite utilizar un algoritmo, propuesto por Kay y Kajiya, que minimiza el número y complejidad de los cálculos a realizar. Para aplicar este algoritmo es mejor considerar un cubo canónico centrado en el origen y radio la unidad, P1 = (-1, -1, -1) y P2 = (1, 1, 1), y el rayo transformado R'(t) = O' + D' * t, con punto origen O' = (ox', oy', oz') y vector dirección unitario D' = (dx', dy', dz'). El algoritmo comienza declarando e inicializando dos variables, con valores límites, que contendrán los valores de t para las posibles intersecciones: tnear = -INFINITE
tfar = INFINITE
A ccontinuación estudia los planos del cubo de dos en dos, considerando dos planos paralelos cada vez, y comparando los puntos de intersección de los planos y el rayo con los ejes. Veamos el caso para el eje X (igual sería para los otros ejes): SI dx' = 0 ENTONCES el rayo es paralelo a los planos estudiados:
SI ox' < x1 ó ox' > x2 ENTONCES el rayo no intersecta el cubo y se retorna FALSE
SI NO, el rayo no es paralelo, y se calculan dos posibles intersecciones, una por plano:
t1' = (x1 - ox') / dx'
t2' = (x2 - ox') / dx'
SI t1' > t2' ENTONCES se intercambian t1' y t2
SI t1' > tnear ENTONCES tnear = t1'
SI t2' < tfar ENTONCES tfar = t2'
SI tnear > tfar ENTONCES el rayo no intersecta el cubo y se retorna FALSE
SI tfar < 0 ENTONCES el cubo está por detrás del rayo y se retorna FALSE
Si el rayo supera todas las comprobaciones con las tres parejas de planos, entonces el algoritmo retorna TRUE, y tnear y tfar contienen los valores de t para los que se producen las intersecciones. Si el rayo tiene su origen dentro del cubo, el valor de tnear se corresponderá con una intersección que se encuentra por detrás del origen del rayo y deberá rechazarse. De la forma acostumbrada, los valores resultantes deberán corregirse para llevarlos de vuelta al espacio de coordenadas globales de la escena. Normal al Punto de Intersección con un CuboLa normal Ni' en el punto de intersección es un vector unitario perpendicular a la cara intersectada: Cara anterior: Ni' = (0, 0, -1)
Cara posterior: Ni' = (0, 0, 1)
Cara superior: Ni' = (0, 1, 0)
Cara inferior: Ni' = (0, -1, 0)
Cara izquierda: Ni' = (-1, 0, 0)
Cara derecha: Ni' = (1, 0, 0)
De igual forma que en casos anteriores, la normal se corregirá para devolverla al espacio global de coordenadas de la escena, y si el rayo incide en alguna cara interior se tomará con el signo cambiado. ¿No encontró lo que buscaba?Utilice el buscador para encontrar más páginas en esta web o en toda Internet.Más páginas en esta web sobre RayTracing |