Página principal
Artículos y trucos
Catálogo de productos
Ejemplos y descargas
Mis libros
Cursos de formación
Investigación y desarrollo
Libros recomendados
Mis páginas favoritas
Acerca del autor
 
En colaboración con Amazon
 
Intuitive Sight

XSight Ray Tracer: Galería

Todo un clásico del ray tracing: piezas de ajedrez en XSight RT. El cuerpo de las piezas utiliza conos hiperbólicos; técnicamente hablando, se trata de hiperboloides truncados de una hoja.

La escena utiliza tres trucos para suavizar la imagen. El primero, naturalmente, es el focal sampling que, por cierto, ha mejorado mucho su velocidad en las últimas versiones de XSight RT. Las dos fuentes de luz utilizadas son luces esféricas, que utilizan muestreo aleatorio para elegir el punto de origen de cada rayo de luz. De esta manera, como comprobará, se suavizan los bordes de las sombras. Finalmente, la luz ambiental utiliza una técnica llamada ambient occlusion. Es vez de asignar un valor constante a la iluminación ambiental, se vincula su intensidad al número de objetos que rodean al punto donde se evalúa la iluminación. En esta escena en particular, la oclusión ambiental utiliza 25 muestras por punto, y cada luz esférica lanza 16 muestras por cada prueba. Para simular la distancia focal, por cada píxel de la imagen se lanzan 25 rayos. A pesar de la carga computacional requerida, la escena se genera en minuto y medio, en un Athlon 64X2 +5600, para una resolución de 800 por 600.

¿Cómo debería evolucionar XSight RT? De entrada, hay unas cuantas técnicas tradicionales en ray tracing que XSight RT no soporta. Quizás la más importante sea la refracción de la luz: no existe transparencia ahora mismo. También falta añadir la posibilidad de perturbar los vectores normales. Esta técnica permite simular rugosidades y otros efectos relacionados con la textura. También es necesario dividir el actual concepto de "material" para trabajar con "pigmentos" y "texturas" combinables, y de paso, aumentar el escaso repertorio de pigmentos y texturas disponibles.

Estos cambios son pequeños, muy sencillos y a la vez, espectaculares. El siguiente paso sería más complicado: me gustaría añadir técnicas de "iluminación global". Por ejemplo, podría añadirse algo parecido al "mapa de fotones", para simular determinados efectos luminosos, y permitir efectos atmosféricos, como la simulación de niebla.

Hay una tercera línea de adiciones: aprovechar las posibilidades de .NET para extender eficientemente las capacidades del motor. En muchos sistemas, esto se puede hacer definiendo funciones que luego se evalúan mediante un intérprete. En .NET, esto no es necesario: aunque la compilación crea código IL, este se traduce a eficiente código nativo para ser ejecutado. En estos momentos, el motor puede extenderse creando DLLs para .NET con cualquier lenguaje compatible y registrando los ensamblados. Pero de lo que se trata es de permitir estas ampliaciones utilizando el mismo lenguaje de descripción de escenas, que inevitablemente tendrá que ampliarse.

Finalmente, quiero simplificar la producción de animaciones. Una de las ideas es permitir la definición de rutas para la cámara dentro de la propia definición de escenas. Esto podría ampliarse luego a todos los objetos de la escena. Sería bueno poder añadir títulos dentro de la propia escena, integrando los textos con la escena. La propia aplicación se podría ocupar de generar la animación, para no obligar a usar más herramientas para una tarea tan sencilla como ésta.

Una aplicación "práctica". Naturalmente, la ración de pastel no es una de las primitivas básicas, pero es fácil crear una macro para automatizar el proceso. En este caso, para rizar el rizo, primero aplastamos una esfera y luego la intersectamos con un cilindro achatado: esta es la tarta "completa". Los trozos se consiguen intersectando la tarta con un par de planos verticales rotados. En vez de una guinda, tenemos una esfera "perlada" en el centro de la tarta. El fondo tiene truco: se utiliza la clase BitmapBackground para generar un gradiente de colores: la particularidad de estos fondos es que no se reflejan en los elementos de la escena, con lo que se facilita mucho el diseño y elección de colores.

Una sencilla extensión de XSight permite generar una imagen con fondo transparente, pasándola a un fichero PNG. De esta manera, si genera el gráfico en XSight RT, puede incorporarlo luego sobre el fondo que prefiera sin que haya problemas con los bordes.

Esta imagen muestra el uso de motion blur, o desenfoque causado por el movimiento. El lenguaje de escena tiene ahora un nuevo tipo de expresiones: las expresiones de rango, que permiten interpolar entre una lista de valores utilizando un reloj virtual. La simulación del motion blur se consigue generando distintas tomas de una escena que contiene objetos en movimientos. Las imágenes se combinan automáticamente, utilizando un filtro trapezoidal. La ampliación de la imagen de la izquierda muestra el efecto en forma bastante exagerada, y ha sido generada a partir de 20 muestras. La imagen también contiene una leve capa de niebla (otra novedad) y una nueva definición de cielo que simula el efecto de la perspectiva sobre una capa de nubes relativamente bajas.

El esqueleto formado por tres rosquillas metálicas ya aparece en otro ejemplo de esta galería. La novedad es el terreno formado por un mosaico de conos reflectantes. Si pulsa sobre la imagen, podrá ver mejor el detalle formado por los reflejos entre conos, que le da un aspecto hasta cierto punto "orgánico" al terreno. Para la imagen se usó una lente con difusión focal y dos luces direccionales.

Se trata de una prueba de duplicación y macros, realizada con el nuevo editor de escenas, que incorpora el editor de código desarrollado para Freya. Se usa una macro para definir las esferas de mármol. Con la primitiva translate se crean capas de esferas, y con las capas se define una macro para crear pirámides. La luz proviene de una esfera, que dispara veinte rayos para cada muestra, y la cámara utiliza difuminación focal enviando treinta y seis rayos por píxel. XSight RT combina los dos algoritmos de muestreo (luz y foco), para no tener que tomar 720 muestras por píxel, sino sólo 36. Para lograr un efecto más "artístico", debería haber destrozado al menos una pirámide, y dejar algunas esferas sueltas y rodando por el escenario.

Novedad: la implementación de los repetidores de instancias ha mejorado mucho. Esta escena, ahora, sólo necesita la tercera parte del tiempo para ser generada.

Tres planos perpendiculares que actúan como espejos. Hay cinco esferas altamente reflectantes. Los planos son de plástico, pero las esferas son de metal. El metal filtra el color de los reflejos, y la intensidad del rayo reflejado cambia según el ángulo de incidencia. ¿Ha intentando peinarse frente a un cristal? Es complicado, porque la reflexión es menor cuando el ángulo se aproxima a la normal. Es parecido a lo que pasa con el metal.

... y aquí tiene una versión heavy de la misma escena, con reflexión difusa y oclusión ambiental.

Un cono de "mármol" flotando con un cielo azul de fondo. El cono se repite cinco veces con un objeto repeater, que ahorra memoria si se compara con la repetición real del objeto. Observe cómo la superficie de cada cono tiene un dibujo diferente: XSight RT utiliza pigmentos sólidos, que definen un color para cada punto del espacio. El cielo con nubes es simulado casi directamente con la función de ruido de Perlin, pero al traducirse el valor de retorno de ésta en un color interpolado, el valor se eleva al cubo, para favorecer un área mayor de azul.

Esta imagen muestra el uso de spotlights, o luces direccionales. La luz sólo se emite en las direcciones delimitadas por un cono infinito. En realidad, hay dos conos concéntricos. El cono interior delimita la zona de iluminación total. A medida que un rayo se va acercando al cono exterior, su intensidad se debilita. En este ejemplo, la transición es lineal.

De un cubo se elimina el espacio correspondiente a un cilindro, y se atraviesa con otro cilindro más delgado. La escena se encierra entre dos planos paralelos reflectantes. El reflejo en el cilindro se produce gracias a una luz disimulada dentro del cubo. Una luz nunca produce una imagen directa; sólamente se sabe que hay una luz por los cambios que provoca en la escena.

Otro ejemplo de diferencia. Esta vez, de un cubo se ha extraído una esquina, con la ayuda de una esfera. La figura se apoya sobre un plano y se ilumina mediante un foco de luz direccional. Los objetos convexos tienen la ventaja computacional de que un rayo sólo puede intersectar sus superficies en un máximo de dos puntos. Las diferencias, sin embargo, generan objetos no convexos en muchos casos.

Una sola esfera se repite quince veces en cada dirección, resultando en 3.375 esferas virtuales que sólo consumen la memoria de una. Aunque las esferas están uniformemente espaciadas, la ubicación y orientación de la cámara provoca estos efectos ópticos basados en la perspectiva.

Esta es la intersección de tres cilindros, orientados según los ejes espaciales. Observe el reflejo de la fuente de luz en el objeto. En realidad, sería muy costoso calcular matemáticamente este reflejo, porque tiene su origen en la reflexión especular difusa: un rayo incidente no se refleja exactamente en un ángulo igual al de incidencia. El truco que simula la reflexión difusa se debe a Phong, uno de los primeros investigadores de la generación de imágenes por ordenador.

De un cubo de mármol se elimina el espacio correspondiente a una esfera de diámetro ligeramente mayor a la longitud de las aristas del cubo. Una luz direccional alumbra desde arriba el interior del cubo, dejando las caras externas en penumbra. Cuando se añade un nuevo tipo de objeto geométrico, es necesario comprobar tanto la imagen directa como las sombras. En XSight RT, el algoritmo de intersección de rayos de sombras es en muchas ocasiones, independiente de la intersección de los otros tipos de rayos, para lograr algunas mejoras en el tiempo de ejecución.

Un ejercicio clásico de macros y transformaciones, que a la vez muestra uno de los usos más frecuentes de los toros (o rosquillas). El objeto básico es un toro que se rota en las tres direcciones para componer una esfera hueca. Seis de estas esferas se trasladan, dos para cada eje, para definir una esfera de más alto nivel. Se repite el truco de los planos paralelos. Al usarse toros como anillos, y tener estos un diámetro interior pequeño, es importante usar un número suficientemente grande de rayos para evitar bordes rasgados.

Una de las primeras pruebas de intersecciones. Se intersectan tres cubos idénticos, aunque rotados respecto al eje Y. El resultado es un prisma dodecagonal. El ejemplo sirvió para poner a punto el cálculo de normales en intersecciones.

Sobre una esfera enorme se coloca un cilindro. Sobre el cilindro descansa un cono, y cuatro esferas pequeñas orientadas según los cuatro puntos cardinales. Esta escena se diseñó con doble propósito: comprobar el uso de escalas diferentes en el pigmento convencionalmente llamado "mármol" y, más importante, verificar el cálculo de las normales para cilindros y conos.

Una esfera de metal descansa sobre un plano de metal reflectante. La escena se ilumina con una luz difusa, y la imagen se toma con una lente con difuminación focal. La técnica de ruleta rusa evita tener que lanzar un número excesivo de rayos. Al ser el plano de metal amarillo, como el amarillo es el complementario del azul, casi no refleja el cielo, de color azul oscuro.

Esta escena, otro de los "clásicos" del género, se utilizó para poner a prueba y optimizar el cálculo de reflexiones y la dependencia de la reflexión respecto al ángulo de incidencia en metales y superficies esmaltadas. Debido a su complejidad, es también una buena prueba para las técnicas de partición espacial.

Un acercamiento extremo, utilizando la misma escena anterior. Es interesante crear animaciones a partir de escenas, ya sea moviendo la cámera o moviendo objetos. Una de las extensiones que estoy considerando es la posibilidad de especificar un camino para la cámara, para automatizar la creación de animaciones, sin necesidad de tener un modelo más completo que permita mover objetos. Así también podría simularse algunos efectos relacionados con el motion blur, o desenfoque debido al movimiento.

Esta imagen es la usada, de momento, en el diálogo de información de XSight RT. Las esferas más lejanas aparecen visiblemente borrosas, como parte del efecto de la lente utilizada. Observe los reflejos que se producen entre las esferas.

Otra prueba del efecto foco y de las sombras proyectadas por cilindros. El fondo de la escena es un gradiente que va del azul al negro. Probablemente añada un efecto de fondo que permita utilizar un mapa de bits arbitrario, sin que este mapa se refleje en los objetos de la escena. Esto no correspondería a un efecto físico, pero sería útil para generar determinado tipo de imágenes.