Vamos a continuar ahora explicando los principios del render ilustrando todo ello con un nuevo ejemplo. No es necesario que intentescomprender el fuente que describe esta singular escena. Se trata de una escena compleja y absurda, ya que solo se pretende explicar los fundamentos del funcionamiento del trazador de rayos. La hemos bautizado con el nombre de ‘Los siete errores’. Son errores que permiten detectar trucos que bien empleados pasarían inadvertidos ofreciendo imágenes bastante realistas.
Breve resumen de lo visto hasta ahora:
Recordamos que en artículos anteriores, mostramos el cómo se hizo un corto de animación (Gaviones) usando Povray, y luego empezamos a explicar algunas nociones básicas (Princpios básicos I). En este segundo artículos comentamos como se instala Povray en Linux con el sistema de paquetes Debian y ofrecimos un programa realizado en Python llamado ‘pov.py’ que le resultará muy cómodo para poder invocar el trazador varias veces.
Fundamentos del render.
En el capítulo anterior mencionamos de pasada la noción de trazado de rayos, y vamos a profundizar algo más ahora. El render es la técnica más completa para lograr una imagen sintética que represente una imagen 3D. Para ello se intenta emular de la manera más realista y menos costosa posible el comportamiento de la luz en la realidad y sus efectos visuales.
En nuestro artículo anterior mencionamos que el render calcula cantidad de rayos luminosos, maticemos esto un poco. Curiosamente en los trazadores de rayos la fuente de luz se comporta como sumidero de los rayos y la cámara será el punto del que salgan todos ellos. La razón de esto, es que si lo hiciéramos al revés la mayoría de los rayos solo supondrían cálculo inútil, ya que solo unos pocos alcanzarían a la cámara. Al hacerlo al revés partimos de cada uno de los puntos de la imagen que queremos obtener. Cada uno de los puntos de la futura imagen se corresponde con un punto de una hipotética película fotosensible de nuestra cámara virtual. De esta manera, procesamos cada uno de estos puntos secuencialmente. Esto se hace pixel a pixel, de izquierda a derecha de la pantalla y de arriba abajo. El orden no es casual. El formato de salida que usaba originalmente Povray era el TGA de 24 bits, y al igual que otros formatos de ficheros de imágenes, los pixels vienen codificados en el fichero por ese orden. Siguiendo este orden, se puede visualizar la imagen a medida que se construye. La velocidad de construcción de la imagen, puede comprobarse que depende de que estemos en una parte complicada o sencilla. Podemos observar que las zonas con muchos objetos en la imagen tardan más tiempo en procesarse que las que tienen uno solo, o ninguno. Desde cada uno de los impactos de esos rayos en los objetos, se calcula el efecto luminoso correspondiente comprobando la posición de la fuente de luz que podría ser más de una. La orientación de la superficie relativa a la fuente de luz y también las características de color, textura, y otras características definidas en el objeto. El resultado de este análisis se concreta el tres valores RGB que definen el color y luminosidad de ese punto de la imagen.
Tal y como acabamos de explicar, los rayos salen de un punto de la película fotosensible de nuestra cámara virtual, pero para calcular el color resultante, hay que ir comprobando uno a uno, si alguno de los objetos definidos en la escena va a interceptar al rayo. En caso afirmativo se continua analizando las características del objeto en la parte alcanzada por el rayo. Existe una técnica de optimización muy efectiva cuando se diseñan objetos complejos. Consiste en definir un objeto invisible y muy simple, de forma que todo el objeto complejo quede en su interior. Generalmente como objeto simple se utilizan esferas o cajas. La idea es que este objeto sirva para indicar al trazador que si un rayo no puede pasar por este objeto sencillo, tampoco lo hará por el objeto complejo situado en su interior. Esto puede llegar a eliminar mucho proceso de cálculo en el caso de objetos complejos. La primitiva se llama «bounced_by», y la he comentado ahora porque sirve para ilustrar como funciona el trazador.
Los siete errores.
Es interesante resaltar que las cosas en un trazador de rayos no son siempre lo que parecen. Para ilustrar lo comentado hasta ahora, vamos a usar la imagen de cabecera titulada ‘Los siete errores’ construida haciendo un uso intencionadamente torpe de varias técnicas, para así poner de manifiesto algunos trucos informáticos empleados por Povray.
Si nos fijamos atentamente veremos que hay algunos aspectos de esta imagen que no resultan creíbles.
- Hay un único foco de luz intensa situado en el centro de un anillo, pero pese a estar mirando casi directamente a ese punto, no se puede ver el foco de luz. (los focos de luz se consideran invisibles por ser infinítamente pequeños. Es decir, son focos reducidos a un punto).
- Hemos puesto un poco más atrás de este foco una bola blanca que proyecta una sombra en el cielo. Por ello descubrimos que en lugar de un cielo tenemos un decorado barato, porque la sombra nos indica la presencia de una bóveda celeste sólida.
- El mar tiene olas pero está construido con una delgadísima superficie totalmente plana y el efecto de oleaje es fruto de un artificio matemático. Para poderlo apreciar hemos cortado el mar y vemos que en la zona de corte, la orilla es totalmente recta. (sin ondulaciones).
- En un plano cercano tenemos tres cajas. Vemos que la del centro no produce sombra.
- Considerando en conjunto las tres cajas, se produce una situación extraña. Que clase de iluminación hay realmente. ¿Un foco directo provocando sombras duras? ¿Luz difusa indirecta provocando sombras suaves? Al parecer la luz ambiente es distinta para cada caja.
- La bola de cristal parece maciza en su parte izquierda pero también hemos recortado un trozo a la derecha usando una función que se usa para recortar formas huecas. El resultado es absurdo. Hemos introducido un objeto cilíndrico por ese lado para que se pueda apreciar mejor la ausencia del efecto de difracción en la parte seccionada de esa esfera.
- La séptima resulta de mirar la imagen en su conjunto. Esta imagen carece de efectos atmosféricos y hay un exceso de transparencia en el aire. El color del mar debería ser un poco más azulado grisáceo y difuminado en el horizonte.
En este momento no podemos explicar los detalles de las numerosas técnicas empleadas. Solo se trata de hacer ver que los trazadores de rayos utilizan técnicas que simplemente imitan los fenómenos naturales de forma no siempre fiel a la realidad porque existe un precio a pagar como tiempo de proceso. Algunas técnicas sirven solo como parches para disimular defectos producidos por otras técnicas. Lo que importa es que el resultado final sea bueno sin un excesivo trabajo de CPU. En este ejemplo se pone de manifiesto como una escena Povray puede resultar correcta desde el punto de vista lingüístico, pero absurda desde el punto de vista del resultado obtenido.
Se proporciona el fuente 7errores.pov, para que no se diga que me guardo el código para mí solo, pero no lo estudie en este momento ya que no hemos explicado nada sobre él. De momento vamos a explicar unos pocos elementos del lenguaje nada más. Hay que ir poco a poco.
La única tarea propuesta para hoy es usar nuevamente pov.py con el fuente de ‘7errores.pov’ y obtener la imagen. También le sujerimos que haga lo propio con el ejemplo ‘stones1.pov’ y con alguno más. Deberá tener instalados todos los paquetes de soft necesarios. Si necesita ayuda comente su dificultad en los comentarios.
El Lenguaje de Povray.
Una vez más insistimos en advertir que esta serie de artículos sobre Povray no podrá hacer otra cosa que tratar distintos temas de forma superficial. Estos artículos sobre principios básicos son una introducción. En posteriores artículos se proporcionará una base de conocimientos con un enfoque totalmente práctico que le permita dar los primeros pasos que siempre son los más difíciles.
El lenguaje de Povray es demasiado amplio para tratarlo a fondo. Quizás por eso resaltar en unas pocas lineas lo más destacable del mismo sea lo más acertado que podemos hacer en este momento.
No se pretende hacer un recorrido completo de la sintaxis. Existe un manual muy bueno para ello, y esto no es un segundo manual. Intentaremos ganar tiempo señalando únicamente lo más importante. Vamos a adelantar ahora algunas cuestiones referentes al lenguaje.
Comentarios:
Los comentarios son como en el lenguaje C++, es decir ‘//’ asume el resto de la línea como comentario, o también se puede se usar una declaración de principio de comentario con ‘/*’ y un final de comentario con ‘*/’ que pueden abarcar tantas líneas como sean necesarias.
Ejemplo:
// Este comentario termina con el final de linea
/* Este comentario termina con asterisco slash */
Los elementos del lenguaje que empiezan por ‘#’ se llaman directivas de lenguaje (Language Directives).
Las más usadas son ‘#declare’ e ‘#include’.
Declaraciones:
Las llamadas declaraciones tienen la forma: #declare IDENTIFICADOR = ELEMENTO
A modo de ejemplo, para declarar diversos tipos de elementos podríamos usar:
#declare Rows = 5
#declare Count = Count+1
#declare Here = <1,2,3>
#declare White = rgb <1,1,1>
#declare Cyan = color blue 1.0 green 1.0
#declare Font_Name = «ariel.ttf»
#declare Ring = torus {5,1}
#declare Checks = pigment { checker White, Cyan }
La sentencia ‘#declare’ permite almacenar una gran variedad de elementos. Desde un giro, una textura, un color, un objeto un valor numérico, etc. Tiene sentido para poder aumentar la legibilidad del fuente, y para facilitar la reutilización de elementos.
Ficheros include:
Otro elemento imprescindible del lenguaje son las referencias a ficheros include. Permiten incluir en el fuente otros segmentos de otros fuentes. Por defecto busca en el directorio actual. En caso contrario busca en Library_Path. Nosotros hemos definido en nuestro lanzador ‘pov.py’. Library_Path=’/usr/share/povray/include’ // Aquí los includes de Povray
Si tiene previsto crear sus propios ficheros includes comunes a varios proyectos debería añadir igualmente algo de este tipo:
Library_Path=${HOMEPOV}/include // Aquí los includes del usuario
Yo nunca lo he necesitado organizar una gran librería de includes. Me he apañado con los includes de Povray, y con los includes definidos en el directorio de cada proyecto. Dentro de la librería de includes de Povray existen una enorme cantidad de recursos útiles que conviene conocer para poder sacar todo el partido posible a Povray. Es una librería de recursos que podemos usar no solo para incluirlos tal cual, sino para obtener copias de ciertos de ellos y modificarlos a nuestro gusto antes de usarlos.
Algunos includes de Povray de uso corriente son:
#include «colors.inc»
#include «textures.inc»
#include «shapes.inc»
#include «finish.inc»
#include «glass.inc»
#include «metals.inc»
#include «stones.inc»
#include «woods.inc»
#include «atmos.inc»
Ejemplos de la librería Povray:
Si tenemos instalado el paquete con ejemplos podremos acceder a un catálogo de cientos de escenas en las cuales se ejemplifica el uso de algo en concreto. No vienen la imágenes porque ocuparían mucho espacio, pero basta renderizar el ejemplo deseado para visualizar luego la imagen. En Debian se instalará dicho paquete en ‘/usr/share/doc/povray/examples’. Si usa nuestro lanzador, podrá probar cualquier ejemplo en tres sencillos pasos. Por ejemplo vamos a probar el ejemplo stones1:
- Cree un directorio stones1 y sitúese en él.
- Copie ‘stones1.pov’ desde ‘/usr/share/doc/povray/examples/incdemo/stones/stones1.pov’
- Invoque a nuestro lanzador mediante el comando: ‘pov.py 8 8’
El ejemplo nos ofrece un muestrario de texturas pétreas muy útiles para ser usadas tal cuales o como punto de partida. Por ejemplo podríamos añadir un mayor efecto de turbulencia en la confección de una de ellas, o variar tonalidades. Tener a mano estas imágenes nos facilita por una parte poder elegir en cada momento el recurso óptimo para cada escena, y por otra nos permite mirar en el fuente como se usan. En su momento abordaremos el tema de las texturas. Solo deseaba dar a conocer la utilidad de la librería de includes de Povray y la utilidad de su librería de ejemplos que están enfocados a ilustrar aspectos concretos, como por ejemplo un tipo de texturas, tal y como acabamos de mostrar ahora, pero hay una gran variedad de recursos que no podemos enumerar en este momento porque nos extenderíamos demasiado.
Otras directivas del lenguaje:
Algunas otras directivas de lenguaje permiten implementar bucles y sentencias condicionales. En las primeras versiones de Povray no existían tales sentencias. Eso unido a que las descripciones de los elementos de la escena podían aparecer en cualquier orden suponía un cambio de mentalidad importante frente a un lenguaje de programación tradicional. El orden en que se declaran los elementos de una escena continua siendo indiferente, pero la facilidad de usar bucles pueden evitarnos tener que escribir muchas lineas parecidas, y las directivas condicionales nos permiten definir de distintas formas una misma escena en función de un valor, por ejemplo del valor de ‘clock’ muy utilizado en animaciones.
Existen muchas otras directivas de lenguaje (que empiezan por ‘#’) pero insistimos en que estas dos que acabamos de mencionar ‘#declare’ e ‘#include’ son con diferencia las más utilizadas.
Cuando tenga que declarar un identificador es conveniente usar alguna mayúscula. La razón es que las palabras reservadas del lenguaje.
(Ver el manual) solo utilizan minúsculas. Si en algún fuente localiza una palabra que tiene alguna mayúscula se trata de un identificador
declarado en alguna parte. Esta es una buena forma de averiguar si tiene que buscar en el manual o en los includes.
Como de costumbre invito a practicar y si alguien tiene alguna duda puede plantearla en los comentarios y muy gustosamente la resolveré.
LuisEC
tengo algunas dudas sobre el tema quisiera saber si tiene mas artículos en relación a povray
Antonio Castro
Este es un artículo muy antiguo y hace demasiados años que no trabajo con Povray. Ni siquiera estoy al tanto de las nuevas versiones que deben ser muy distintas de las que yo usé.