Você está na página 1de 152

Persistence of Vision Ray-Tracer (POV-Ray)

Documentacin del usuario 3.0


Versin (incompleta) en Castellano
1 de diciembre de 1997

En esta versin han colaborado: Roberto Selva Ricardo Pereyra Santiago Ordax Solivellas Ignacio Fernndez Pablo Costas http://www.arrakis.es/pcostas/povray/

1. INTRODUCCIN ................................................................................................ 9
1.1. Notacin ......................................................................................................................................................9

2. DESCRIPCIN DEL PROGRAMA ................................................................... 11


2.1. Qu es el trazado de rayos? ...................................................................................................................11 2.2. Qu es pov-ray? ......................................................................................................................................11 2.3. Qu versin de pov-ray debo usar? ......................................................................................................12 2.3.1. IBM-Pc y compatibles ........................................................................................................................13 2.3.1.1. MS-Dos........................................................................................................................................13 2.3.1.2. Windows......................................................................................................................................13 2.3.1.3. Linux ...........................................................................................................................................14 2.3.2. Apple Macintosh.................................................................................................................................15 2.3.3. Commodore Amiga.............................................................................................................................16 2.3.4. SunOS .................................................................................................................................................17 2.3.5. Unix genrico......................................................................................................................................17 2.3.6. Todas las versiones .............................................................................................................................18 2.3.7. Compilando POV-Ray ........................................................................................................................18 2.3.7.1. Estructura de directorios..............................................................................................................19 2.3.7.2. Configurando el fuente de POV-Ray...........................................................................................20 2.3.7.3. Conclusin...................................................................................................................................20 2.4. Donde encontrar POV-Ray .....................................................................................................................21 2.4.1. Foro de POV-Ray en Compuserve......................................................................................................21 2.4.2. Internet ................................................................................................................................................21 2.4.3. Area de grficos para PC en Amrica On-Line ..................................................................................21 2.4.4. BBS The Graphics Alternative en El Cerrito, CA ..............................................................................22 2.4.5. PCGNet...............................................................................................................................................22 2.4.6. Libros y cd-roms relacionados con POV-Ray ....................................................................................23

3. COMIENZO RPIDO ........................................................................................ 25


3.1. Instalando POV-Ray ................................................................................................................................25 3.2. Utilizacin bsica......................................................................................................................................26

4. TUTORIAL PARA PRINCIPIANTES................................................................. 29

4.1. Tu primera imagen...................................................................................................................................29 4.1.1. El sistema de coordenadas de POV-Ray.............................................................................................29 4.1.2. Aadiendo archivos de inclusin estndar..........................................................................................30 4.1.3. Aadiendo la cmara...........................................................................................................................31 4.1.4. Describiendo un objeto. ......................................................................................................................31 4.1.5. Aadiendo la textura al objeto. ...........................................................................................................32 4.1.6. Definiendo una fuente de luz. .............................................................................................................32 4.2. Usando la cmara .....................................................................................................................................33 4.2.1. Usando el desenfoque .........................................................................................................................33 4.3. Formas simples .........................................................................................................................................35 4.3.1. Caja .....................................................................................................................................................35 4.3.2. Cono....................................................................................................................................................35 4.3.3. Cilindro ...............................................................................................................................................35 4.3.4. Plano ...................................................................................................................................................36 4.3.5. Inclusin de objetos estndar ..............................................................................................................36 4.4. Formas avanzadas ....................................................................................................................................37 4.4.1. Parche bicbico...................................................................................................................................37 4.4.2. Burbuja................................................................................................................................................37 4.4.2.1. Tipos de componentes y otras caractersticas nuevas. .................................................................39 4.4.2.2. Construcciones complejas con burbujas e intensidad negativa. ..................................................40 4.4.3. Campo de alturas.................................................................................................................................42 4.4.4. Objeto torneado (lathe) .......................................................................................................................44 4.4.4.1. Entendiendo el concepto de splines.............................................................................................45 4.4.5. Malla de tringulos .............................................................................................................................49 4.4.6. Polgono ..............................................................................................................................................50 4.4.7. Prisma .................................................................................................................................................53 4.4.7.1. Nuevos trucos para las curvas spline...........................................................................................54 4.4.7.2. Transiciones suaves .....................................................................................................................55 4.4.7.3. Mltiples subformas ....................................................................................................................56 4.4.7.4. Barrido cnico y el efecto de estrechamiento..............................................................................57 4.4.8. Elipsoide supercudrico ......................................................................................................................59 4.4.9. Superficie de revolucin .....................................................................................................................63 4.4.10. Texto .................................................................................................................................................64 4.4.11. Toro...................................................................................................................................................67 4.5. Objetos CSG (Geometra Slida Constructiva).....................................................................................72

4.5.1. Qu es CSG? .....................................................................................................................................72 4.5.2. Unin ..................................................................................................................................................72 4.5.3. Interseccin .........................................................................................................................................74 4.5.4. Diferencia............................................................................................................................................74 4.5.5. Fusin..................................................................................................................................................75 4.5.6. Observaciones sobre los objetos CSG ................................................................................................76 4.5.6.1. Coincidencia de superficies .........................................................................................................76 4.6. Las fuentes de luz. ....................................................................................................................................76 4.6.1. La fuente de luz ambiente. .................................................................................................................77 4.6.2. La fuente de luz puntual......................................................................................................................77 4.6.3. La fuente de luz cnica (focos). ..........................................................................................................78 4.6.4. La fuente de luz cilndrica...................................................................................................................79 4.6.5. La fuente de luz extendida. .................................................................................................................79 4.6.6. Asignando un objeto a una fuente de luz. ...........................................................................................81 4.6.7. Fuentes de luz especiales. ...................................................................................................................82 4.6.7.1. Empleando luces sin sombra. ......................................................................................................82 4.6.7.2. Usando atenuacin de la luz. .......................................................................................................82 4.6.7.3. Las fuentes de luz y la atmsfera.................................................................................................83 4.7. Opciones de textura simples ....................................................................................................................83 4.7.1. Acabado de superficies. ......................................................................................................................84 4.7.2. Aadiendo abolladuras........................................................................................................................84 4.7.3. Creando patrones de colores. ..............................................................................................................84 4.7.4. Texturas predefinidas..........................................................................................................................85 4.8. Opciones avanzadas de texturas .............................................................................................................85 4.8.1. Patrones de pigmentacin y de normal ...............................................................................................86 4.8.2. Pigmentos............................................................................................................................................86 4.8.2.1. Usando pigmentos con lista de colores........................................................................................86 4.8.2.2. Usando pigmentos y patrones......................................................................................................87 4.8.2.3. Usando modificadores de patrones..............................................................................................87 4.8.2.4. Usando pigmentos transparentes y texturas superpuestas ...........................................................88 4.8.2.5. Usando mapas de pigmentos .......................................................................................................89 4.8.3. Normales .............................................................................................................................................90 4.8.3.1. Usando modificadores de normal bsicos ...................................................................................91 4.8.3.2. Combinando normales .................................................................................................................91 4.8.4. Acabados.............................................................................................................................................93 4.8.4.1. Usando ambient ...........................................................................................................................93

4.8.4.2. Usando los reflejos de superficie.................................................................................................94 4.8.4.3. Usando reflection y metallic........................................................................................................95 4.8.4.4. Usando refraction ........................................................................................................................96 4.8.4.5. Aadiendo la atenuacin luminosa..............................................................................................96 4.8.4.6. Usando custicas simuladas.........................................................................................................97 4.8.4.7. Usando la iridiscencia................................................................................................................100 4.8.5. Halos .................................................................................................................................................101 4.8.5.1. Qu son los halos? ...................................................................................................................101 4.8.5.2. El halo emisor............................................................................................................................102 4.8.5.3. El halo brillante .........................................................................................................................110 4.8.5.4. El halo atenuante .......................................................................................................................111 4.8.5.5. El halo de polvo.........................................................................................................................114 4.8.5.6. Dificultades de los halos............................................................................................................120 4.9. Trabajar con texturas especiales...........................................................................................................122 4.9.1. Trabajar con mapas de pigmentos.....................................................................................................122 4.9.2. Trabajar con mapas de normales.......................................................................................................123 4.9.3. Trabajar con mapas de textura ..........................................................................................................124 4.9.4. Trabajar con listas de texturas...........................................................................................................125 4.9.5. Y las baldosas?................................................................................................................................126 4.9.6. Funcin promedio .............................................................................................................................126 4.9.7. Trabajar con texturas superpuestas ...................................................................................................126 4.9.7.1. Declarar texturas superpuestas ..................................................................................................128 4.9.7.2. Otro ejemplo de texturas superpuestas ......................................................................................128 4.9.8. Cuando todo falla: mapas de materiales............................................................................................131 4.9.9. Limitaciones de las texturas especiales.............................................................................................133 4.10. Usando los efectos atmosfricos ..........................................................................................................134 4.10.1. Background.....................................................................................................................................134 4.10.2. La esfera celeste..............................................................................................................................135 4.10.2.1. Creando el cielo con un gradiente de colores ..........................................................................135 4.10.2.2. Aadiendo el sol ......................................................................................................................137 4.10.2.3. Aadiendo algunas nubes ........................................................................................................138 4.10.3. La niebla .........................................................................................................................................139 4.10.3.1. La niebla constante ..................................................................................................................139 4.10.3.2. Especificando un mnimo de translucidez ...............................................................................140 4.10.3.3. Creando niebla filtrante ...........................................................................................................141 4.10.3.4. Aadiendo algo de turbulencia a la niebla...............................................................................142

4.10.3.5. Usando la niebla de superficie.................................................................................................143 4.10.3.6. Usando mltiples capas de niebla............................................................................................144 4.10.3.7. La niebla y los objetos vacos..................................................................................................145 4.10.4. La atmsfera....................................................................................................................................145 4.10.4.1. Empezando con una habitacin vaca......................................................................................145 4.10.4.2. Aadiendo polvo a la habitacin .............................................................................................147 4.10.4.3. Eligiendo una buena tasa de muestreo.....................................................................................148 4.10.4.4. Usando una atmsfera coloreada .............................................................................................149 4.10.4.5. Consejos usando la atmsfera..................................................................................................150

PERSISTENCE OF VISION RAYTRACER

1. Introduccin
Este documento detalla el uso del Trazador de Rayos Persistence of Vision, (POV-Ray). Se compone de cuatro partes: la gua de instalacin, el tutorial, la gua de referencia y los apndices. La primera parte (ver secciones "Descripcin del Programa" y "Comienzo Rpido") cuenta como obtener y como instalar POV-Ray. Tambin da una breve introduccin al trazado de rayos. El tutorial explica paso a paso como usar las diferentes caractersticas de POV-Ray (ver seccin "Tutorial para Principiantes"). La referencia da una completa descripcin de todas las caractersticas de POV-Ray explicando todas las opciones disponibles (activadas por parmetros de la lnea de comandos o por sentencias en archivos INI) y del lenguaje de descripcin de escena (ver seccin "Referencia de POVRay", seccin "Opciones de POV-Ray" y seccin "Lenguaje de descripcin de escena"). Los apndices incluyen trucos y pistas, lecturas sugeridas, direcciones de contacto e informacin legal. POV-Ray est basado en DKBTrace 2.12, de David K. Buck y Aaron A. Collins.

1.1. Notacin
A lo largo de este documento se seguir la siguiente notacin para denotar palabras clave del lenguaje de descripcin de escena, parmetros de la lnea de comandos, palabras clave de archivos INI y nombres de archivos.
nombre nombre nombre
NOMBRE

palabra clave del lenguaje de descripcin de escena opcin de la lnea de comando palabra clave de archivo INI nombre de archivo direccin de Internet, grupo de noticias Usenet

nombre

En la versin ASCII del documento no hay diferencias entre las notaciones.

PERSISTENCE OF VISION RAYTRACER

11

2. Descripcin del programa


El trazador de rayos Persistence of Vision Raytracer crea imgenes tridimensionales fotorrealistas usando una tcnica llamada trazado de rayos. Lee un archivo de texto conteniendo informacin que describe objetos e iluminacin en una escena y genera una imagen de esa escena desde el punto de vista de una cmara, tambin descrita en el archivo de escena. El trazado de rayos no es de ninguna manera un proceso rpido, pero produce imgenes de muy alta calidad con reflexiones realistas, sombreado, perspectiva y otros efectos.

2.1. Qu es el trazado de rayos?


El trazado de rayos es una tcnica que calcula una imagen de una escena disparando rayos a la escena. La escena est construida por formas, fuentes de luz, una cmara, materiales, efectos especiales, etc. Para cada pixel en la imagen final se disparan uno o ms rayos en la escena y se comprueba la interseccin con cada uno de los objetos de la escena. Los rayos se originan en el observador, representado por la cmara, y pasan a travs de la ventana de visin (que representa la imagen final). Cada vez que el rayo golpea a un objeto, se calcula el color de la superficie en ese punto. Para ello se determina la cantidad de luz que proviene de cada fuente luminosa para ver si el objeto permanece en la sombra o no. Si la superficie es reflectora o traslcida se trazan nuevos rayos para determinar la contribucin de la luz reflejada o refractada en el color final de la superficie. Los efectos especiales como la luz difusa (radiosidad), efectos atmosfricos y luces extendidas hacen necesario el trazado de muchos rayos adicionales por cada pixel de la escena.

2.2. Qu es pov-ray?
El Trazador de Rayos Persistence of Vision fue desarrollado a partir de DBKTrace 2.12 (escrito por David K. Buck y Aaron A. Collins) por un puado de gente, llamado el POV-Team, en su tiempo libre. El cuartel general del POV-Team est en el foro POVRAY de CompuServe (ver "Foro POVRAY en CompuServe" para ms detalles). El paquete POV-Ray incluye instrucciones detalladas para usar el trazador y crear escenas. Se han incluido muchas escenas asombrosas con POV-Ray para que puedas empezar a crear imgenes inmediatamente. Estas escenas pueden ser modificadas para que no tengas que empezar desde cero. Adems de las escenas predefinidas, tambin se suministra una gran biblioteca de formas predefinidas y de materiales. Puedes incluir estas formas y materiales en tus propias escenas simplemente incluyendo el nombre de la forma o material y el nombre del archivo fuente correspondiente. He aqu algunas caractersticas de POV-Ray: Lenguaje de descripcin de escena fcil de usar Gran biblioteca de archivos de escenas asombrosas Archivos de inclusin estndar que predefinen muchas formas, colores y texturas

2. DESCRIPCIN DEL PROGRAMA Archivos de imagen de muy alta calidad (hasta 48 bits de color) Visualizacin en IBM-PCs de 15 y 24 bits, usando el hardware apropiado Crea paisajes usando suaves campos elevados Fuentes luminosas dirigidas, cilndricas y extendidas para iluminacin sofisticada Reflejos phong y especulares para conseguir superficies ms realistas Reflexin difusa (radiosidad) para conseguir iluminacin realista Efectos atmosfricos como atmsfera, niebla y arco iris Halos para modelar efectos como nubes, polvo, fuego y vapor Varios formatos de imagen, incluyendo Targa, PNG y PPM

12

Primitivas para figuras bsicas, como esferas, cajas, cudricas, cilindros, conos, tringulos y planos Primitivas para figuras avanzadas, como toros (donuts), parches de Bezier, campos elevados (montaas), burbujas, curticas, tringulos suavizados, texto, fractales, supercudricas, superficies de revolucin, prismas, polgonos y tornos (lathes) Las figuras se pueden combinar fcilmente para crear nuevas figuras complicadas usando Geometra Constructiva Slida (CSG). POV-Ray soporta uniones, mezclas, intersecciones y diferencias A los objetos se les asignas materiales llamados texturas (una textura describe el color y las propiedades de la superficie de una figura) Distribuciones de color y de normales incluidas: Agate, Bozo, Bumps, Checker, Crakle, Dents, Granite, Gradient, Hexagon, Leopard, Mandel, Marble, Onion, Quilted, Ripples, Spotted, Spiral, Radial, Waves, Wood, Wrinkles y mapeado segn archivo de imagen Los usuarios pueden crear sus nuevas texturas o usar las predefinidas, como latn, cromado, cobre, oro, plata, piedra, madera... Combinar texturas usando capas de texturas semitransparentes Previsualizar la imagen mientras la crea (no disponible en todas las plataformas) Parar el trazado de una escena y continuarlo posteriormente

2.3. Qu versin de pov-ray debo usar?


POV-Ray puede usarse bajo MS-DOS, Windows 3.x, Windows para Trabajo en Grupo 3.11, Windows 95, Windows NT, Apple Macintosh 68k, Power PC, Commodore Amiga, Linux, UNIX y otras plataformas. Las ultimas versiones de los archivos necesarios estn disponibles en CompuServe, Internet, Amrica On-line y varios BBS. Vea la seccin "Donde Encontrar los archivos de POV-Ray" para obtener ms informacin.

PERSISTENCE OF VISION RAYTRACER

13

2.3.1. IBM-Pc y compatibles


Normalmente hay tres versiones diferentes para IBM-PC funcionando bajo diversos sistemas operativos (MS-DOS, Windows y Linux) como se describe ms adelante. 2.3.1.1. MS-Dos

La versin para MS-DOS corre bajo MS-DOS o como una aplicacin DOS bajo Windows 95, Windows NT, Windows 3,1 o Windows para Trabajo en Grupo 3.11. Tambin corre bajo OS/2 y OS/2 WARP. Requerimientos de hardware y software: CPU 386 o superior y por lo menos 4 Mb de RAM. Aproximadamente 6 Mb de espacio en el disco duro para la instalacin y de 2 a 10 Mb o ms como espacio de trabajo. Un editor de texto capaz de editar archivos de texto en formato ASCII. El programa EDIT que viene con MS-DOS trabajar para archivos de tamao moderado. Un visor de archivos grficos capaz de visualizar archivos en formato GIF y quizs TGA y PNG. Archivos de POV-Ray Requeridos: POVMSDOS.EXE: un archivo auto-extraible contiendo el programa, ejemplos de escenas, los archivos .INC estndar y la documentacin en un formato de ayuda de hipertexto con un visor de ayuda. Este archivo puede estar dividido en archivos ms pequeos para facilitar la descarga del mismo. Chequee el directorio de su sitio de ftp para ver si requieren otros archivos. Recomendado: Pentium o 486DX, o tambin 386 o 486SX con co-procesador matemtico . 8 Mb o ms de RAM. Monitor SVGA, preferiblemente con interface VESA y capacidad de usar los modos Hi color (color de 16 bits ) o True color (color de 24 bits). Optativo: el cdigo fuente no es necesario para usar POV-Ray. Se proporciona para curiosos y aventureros. POVMSD_S.ZIP: El cdigo fuente en C de POV-Ray para MS-DOS. Contiene partes genricas y partes especficas MS-DOS. No incluye ejemplos de escenas, Archivos .INC estndar ni la documentacin, por lo que debers obtener tambin el archivo ejecutable. Un compilador de C qu pueda crear aplicaciones de 32-bit en modo protegido. Soportamos Watcom 10.5a, Borland 4.52 con DOS Power Pack y grficos limitados bajo DJGPP 1.12maint4. No soportamos DJGPP 2.0. 2.3.1.2. Windows

La versin para Windows corre bajo Windows 95, Windows NT y bajo Windows 3.1 o 3.11 si se agregan las extensiones Win32s. Tambin corre bajo OS/2 WARP. Requerimientos de hardware y software:

2. DESCRIPCIN DEL PROGRAMA CPU 386 o superior y por lo menos 8 Mb de RAM.

14

Aproximadamente 12 Mb de espacio en el disco duro para la instalacin y de 2 a 10 Mb o ms como espacio de trabajo. Archivos de POV-Ray requeridos: El archivo de usuario POVWIN3.EXE, un archivo autoextraible contiendo el programa, ejemplos de escenas, los archivos .INC estndar y la documentacin en un formato de ayuda de Windows. Puede estar dividido en archivos ms pequeos para facilitar la descarga del mismo. Verifique el directorio de su sitio de ftp para ver si se requieren otros archivos. Recomendado: Pentium o 486DX, o tambin 386 o 486SX con co-procesador matemtico . 16 Mb o ms de RAM. Monitor SVGA, preferiblemente con capacidad de usar los modos Hi color (color de 16 bits ) o True color (color de 24 bits). Optativo: el cdigo fuente no es necesario para usar POV-Ray. Se proporciona para curiosos y aventureros.
POVWIN_S.ZIP: el cdigo fuente en C de POV-Ray para Windows Contiene partes genricas y partes especficas Windows. No incluye ejemplos de escenas, archivos .INC estndar ni la documentacin, por lo que tambin debers obtener el archivo ejecutable.

POV-Ray solo puede ser compilado usando compiladores qu puedan crear aplicaciones de 32 bits para Windows. Soportamos los compiladores Watcom 10.5a, Borland 4.52/5.0. El cdigo fuente no es necesario para usar POV-Ray, se proporciona slo para los curiosos y aventureros. 2.3.1.3. Linux

Requerimientos de hardware y software: CPU 386 o superior y por lo menos 4 Mb de RAM. Aproximadamente 6 Mb de espacio en el disco duro para la instalacin y 2-10 Mb o ms como espacio de trabajo. Un editor de texto capaz de editar archivos de texto en formato ASCII. Cualquier versin reciente (1994 en adelante)del kernel de Linux y soporte para formatos binarios ELF. POV-Ray para Linux no esta en formato a.out. Bibliotecas ELF libc.so.5, libm.so.5 y uno o ambos de libX11.so.6 o libvga.so.1. Archivos de POV-Ray requeridos:
POVLINUX.TGZ o POVLINUX.TAR.GZ, un archivo que contiene el binario oficial para cada uno de los modos SVGALib y X-Windows. Tambin contiene ejemplos de escenas, los archivos .INC estndar y la documentacin.

Recomendado: Pentium o 486dx o tambin 386 o 486sx con co-procesador matemtico.

PERSISTENCE OF VISION RAYTRACER 8 Mb o ms RAM.

15

Monitor SVGA preferiblemente con capacidad de usar los modos Hi color (color de 16 bits ) o True color (color de 24 bits). Si quieres previsualizacin, requerir o SVGALib o X-Windows. Un visor de archivos grficos capaz de visualizar archivos en formato PPM, TGA o PNG. Optativo: el cdigo fuente no es necesario para usar POV-Ray. Se proporciona para curiosos y aventureros.
POVUNI_S.TAR.GZ o POVUNI_S.TGZ, el cdigo fuente en C de POV-Ray para Linux. Contiene partes genricas y partes especficas Linux . No incluye ejemplos de escenas, archivos .INC estndar ni la documentacin, por lo cual tambin debes obtener el archivo ejecutable.

El compilador GNU C y (opcionalmente) archivos de inclusin y bibliotecas X y conocimiento de como usarlo. Aunque proporcionamos el cdigo fuente genrico para sistemas Unix, no proporcionamos apoyo tcnico sobre cmo compilar el programa.

2.3.2. Apple Macintosh


Las versiones para Macintosh corren bajo el sistema operativo Apple's MacOS versin 7.0 o superior, en cualquier Macintosh basado en 68020/030/040 (con o sin un coprocesador de punto flotante) o en cualquier ordenador Power Macintosh. Requerimientos de hardware y software: Una CPU 68020 o superior sin una unidad del punto flotante (serie LC, Performa o Centris) y por lo menos 8 Mb de RAM, o Una CPU 68020 o superior con una unidad de punto flotante (series Mac II o Quadra) y por lo menos 8 Mb de RAM, o Cualquier ordenador Power Macintosh y por lo menos 8 Mb de RAM. System 7 o ms nuevo y color QuickDraw (el System 6 ya no es soportado). Aproximadamente 6 Mb de espacio libre en el disco para la instalacin y de 2 a 10 Mb de espacio libre adicional como espacio de trabajo. Una utilidad para visualizar archivos grficos que soporte los formatos Mac PICT, GIF y quizs TGA y PNG (las aplicaciones shareware GIFConverter o GraphicConverter son buenas.) Archivos de POV-Ray requeridos:
POVMACNF.SIT o POVMACNF.SIT.HQX, un archivo stuffit conteniendo la aplicacin para Macintosh no-FPU 68K, ejemplos de escenas, los archivos .INC estndar y documentacin (versin ms lenta para Macs sin unidad de punto flotante), o POVMAC68.SIT o POVMAC68.SIT.HQX, un archivo stuffit conteniendo la aplicacin para Macintosh FPU 68K, ejemplos de escenas, los archivos .INC estndar y documentacin (versin ms rpida para Macs con unidad de punto flotante), o POVPMAC.SIT o POVPMAC.SIT.HQX, un archivo stuffit conteniendo la aplicacin nativa del Power Macintosh, ejemplos de escenas, los archivos .INC estndar y documentacin.

2. DESCRIPCIN DEL PROGRAMA Recomendado: 68030/33 o ms rpido con unidad de punto flotante, o cualquier Power Macintosh. 8 Mb o ms de RAM para Macintosh 68K, 16 Mb o ms para sistemas Power Macintosh.

16

Monitor preferentemente en color: de 256 colores esta bien, pero de miles o millones de colores est incluso mejor. Optativo: el cdigo fuente no es necesario para usar POV-Ray. Se proporciona para curiosos y aventureros. POV-Ray se puede compilar usando Apple's MPW 3.3, Metrowerks CodeWarrior 8 o Symantec 8.
POVMACS.SIT o POVMACS.SIT.HQX, el cdigo fuente en C completo de POV-Ray para Macintosh. Contiene partes genricas y partes especficas Macintosh. No incluye ejemplos de escenas, archivos .INC estndar ni la documentacin por lo que tambin debers obtener el archivo ejecutable.

2.3.3. Commodore Amiga


La versin para Amiga viene en varios sabores: 68000/68020 sin FPU (muy lenta, no se recomienda), 68020/68881(68882), 68030/68882 y 68040. Hay tambin dos sub-versiones, una slo con un interface CLI, y otra con un interface GUI (requiere MUI 3.1). Todas las versiones corren bajo OS2.1 y superiores. Existe soporte para pensharing y visualizacin de ventanas bajo OS3.x con paletas de 256 colores y soporte para la biblioteca CybeGFX. Requerimientos: Por lo menos 4 Mb de RAM. Por lo menos 2 Mb de espacio en el disco duro, se recomiendan de 5 a 20 Mb ms para espacio de trabajo. Un editor de texto ASCII, GUI configurable para lanzar el editor de su eleccin. Visor de archivos grficos: POV-Ray da como resultado archivos en formato PNG, Targa (TGA) y PPM, convertidores desde la distribucin PPMBIN estn incluidos para convertir estas a archivos IFF ILBM Archivos de POV-Ray requeridos:
POVAMI.LHA, un archivo en formato .LHA conteniendo el ejecutable, ejemplos de escenas, los archivos .INC estndar y la documentacin.

Recomendado: 8 Mb o ms de RAM. Procesador 68030, 68882 o superior. Tarjeta grfica de 24-bits (con soporte para la biblioteca CyberGFX) Tan pronto como se haga pblico un compilador estable para sistemas Amiga PowerPC, los planes son agregar este a la lista de sabores. Optativo: el cdigo fuente no es necesario para usar POV-Ray. Se proporciona para curiosos y aventureros.

PERSISTENCE OF VISION RAYTRACER

17

POVLHA_S.ZIP, el cdigo fuente en C de POV-Ray para Amiga Contiene partes genricas y partes especficas Amiga. No incluye ejemplos de escenas, archivos .INC estndar ni la documentacin por lo que tambin debers obtener el archivo ejecutable.

2.3.4. SunOS
Requerimientos de hardware y software: Un procesador Sun SPARC y por lo menos 4 Mb de RAM. Aproximadamente 6 Mb de espacio en el disco duro para la instalacin y de 2 a 10 Mb o ms para espacio de trabajo. Un editor de texto capaz de editar archivos de texto ASCII. SunOS 4.1.3 u otro sistema operativo capaz de correr el archivo binario (Solaris o posiblemente Linux para Sparc). Archivos de POV-Ray requeridos:
POVSUNOS.TGZ o POVSUNOS.TAR.GZ, archivo conteniendo un ejecutable oficial para los modos slo texto y X-Windows. Tambin contiene ejemplos de escenas, los archivos .INC estndar y la documentacin.

Recomendado: 8 Mb de RAM o ms. Si quieres previsualizacin, requerir X-Windows o un terminal X. Preferiblemente capacidad para visualizar color verdadero de 24 bits(True Color), aunque se sabe que el cdigo X-Windows funciona con cualquier resolucin y nmero de colores. Un visor de archivos grficos capaz de visualizar formatos PPM, TGA o PNG. Optativo: el cdigo fuente no es necesario para usar POV-Ray. Se proporciona para curiosos y aventureros.
POVUNI_S.TGZ o POVUNI_S.TAR.GZ, el cdigo fuente en C de POV-Ray para UNIX. Contiene partes genricas UNIX y partes especficas Linux. No incluye ejemplos de escenas, archivos .INC estndar ni la documentacin, por lo que tambin debers obtener el archivo ejecutable.

Un compilador de C y (opcionalmente) los archivos de inclusin y bibliotecas X, y conocimiento de cmo usarlo. Aunque proporcionamos el cdigo fuente genrico para sistemas UNIX, no proporcionamos apoyo tcnico sobre cmo compilar el programa.

2.3.5. Unix genrico


Requerimientos:
POVUNI_S.TGZ o POVUNI_S.TAR.GZ, el cdigo fuente en C de POV-Ray para Unix. O cualquier archivo conteniendo el cdigo fuente genrico para Unix, y el especifico para X-Windows. POVUNI_D.TGZ o POVUNI_D.TAR.GZ, o cualquier archivo conteniendo los ejemplos de escenas, los archivos .INC estndar y la documentacin. ste podra ser uno de los archivos ejecutables para Linux o SunOS que se describieron antes.

2. DESCRIPCIN DEL PROGRAMA

18

Un compilador C para tu ordenador y conocimiento de como usarlo. Aunque proporcionamos el cdigo fuente genrico para sistemas Unix, no proporcionamos apoyo tcnico sobre cmo compilar el programa. Un editor de texto capaz de editar archivos de texto ASCII. Recomendado: Co-procesador matemtico. 8 Mb o ms de memoria RAM. Un visor de archivos grficos capaz de visualizar formatos PPM, TGA o PNG. Opcional: X Windows si quieres previsualizar el trazado. Tambin necesitars los archivos de inclusin de X-Windows. Si no ests familiarizado con la compilacin de programas para X-Windows podras necesitar algo de ayuda de alguien que conozca tu instalacin, porque los archivos de inclusin de X-Windows y las bibliotecas no siempre estn en el lugar habitual.

2.3.6. Todas las versiones


Cada archivo ejecutable incluye la documentacin completa de POV-Ray mismo as como instrucciones especficas para usar POV-Ray con su tipo de plataforma. Todas las versiones del programa comparten las mismas formas, iluminacin y texturas. En otras palabras, un IBM-PC puede crear las mismas imgenes qu un superordenador Cray siempre que tenga bastante memoria. Cada usuario desear obtener el ejecutable que mejor se adapte al hardware de su ordenador. Consulta la seccin Donde encontrar los archivos de POV-Ray para ver donde encontrar estos archivos. Puedes contactar con estas fuentes para encontrar la mejor versin para ti y tu ordenador

2.3.7. Compilando POV-Ray


Las secciones siguientes te ayudarn a compilar el cdigo fuente en C portable en una versin ejecutable de POV-Ray qu funcione. Son slo para sas personas qu quieren compilar una versin personalizada de POV-Ray o portarlo a una plataforma o compilador no soportado. La primera pregunta qu debes hacerte antes de proceder es realmente necesito compilar POV-Ray? Las versiones ejecutables oficiales del POV-Ray Team estn disponible para MS-DOS, Windows 3.1x/95/NT, Mac 68k, Mac Power PC, Amiga, Linux para Intel x86, y SunOS. Otras compilaciones no oficiales para otras plataformas estarn pronto disponibles. Si no piensas agregar cualquier caracterstica personalizada o experimental al programa y si ya existe un ejecutable para tu plataforma, entonces no necesitas compilar este programa. Si quieres proceder debers estar muy seguro de ti mismo. Las secciones siguientes y otra documentacin relacionada a la compilacin asumen que sabes lo qu estas haciendo. Asumen qu tienes un compilador de C adecuado instalado y funcionando. Asumen que sabes como compilar y enlazar programas de mltiples partes usando una utilidad make o un archivo de proyecto IDE si tu compilador los soporta. Ya que los archivos make y los archivos de proyecto a menudo especifican

PERSISTENCE OF VISION RAYTRACER

19

informacin sobre unidades, directorios o paths, no podemos prometerte qu nuestros archivos make o de proyectos trabajarn en tu sistema. Asumimos que sabes hacer cambios en los archivos make y de proyectos para especificar donde se localizan tus bibliotecas de sistema y otros archivos necesarios. En general no debes esperar ningn apoyo tcnico del POV-Ray Team sobre cmo compilar el programa. Todo se provee tal como esta. Todo lo qu podemos decir con certeza es qu pudimos compilar l cdigo en nuestros sistemas. Si no trabaja para ti probablemente no podamos decirte porqu. No hay ninguna documentacin tcnica para el cdigo fuente mismo salvo los comentarios en los archivos fuente. Intentamos hacer lo mejor para escribir cdigo claro y bien comentado, pero algunas secciones estn apenas comentadas y algunos comentarios pueden estar desactualizados. No proporcionamos ningn soporte tcnico para ayudarte a agregar caractersticas. No explicamos cmo trabaja una caracterstica en particular. En algunos casos la persona qu escribi una parte del programa ya no esta hace tiempo activamente en el Equipo y no sabemos exactamente cmo trabaja. Cuando hagas cualquier versin personalizada de POV-Ray o cualquier compilacin extraoficial, por favor asegrate de haber ledo y seguir todas las provisiones de nuestra licencia en la seccin "Copyright". En general puedes modificar y usar POV-Ray para ti mismo, sin embargo si quieres distribuir tu versin extraoficial debes seguir nuestras reglas. No puedes bajo cualquier circunstancia usar porciones del cdigo fuente de POV-Ray en otros programas. 2.3.7.1. Estructura de directorios

El cdigo fuente de POV-Ray se distribuye en archivos en una jerarqua particular de directorios o carpetas. Cuando extrae los archivos debe hacerlo de modo qu resguarde la estructura de directorios intacta. En general sugerimos qu cree un directorio llamado povray3 y extraiga los archivos all. La extraccin crear un directorio llamado source con muchos archivos y subdirectorios. En general, hay archivos separados para cada plataforma de hardware y sistema operativo, pero cada uno de estos archivos soporta ms de un compilador. Por ejemplo aqu esta la estructura de directorios para el archivo MS-DOS.
SOURCE SOURCE\LIBPNG SOURCE\ZLIB SOURCE\MSDOS SOURCE\MSDOS\PMODE SOURCE\MSDOS\BORLAND SOURCE\ MSDOS\DJGPP SOURCE\MSDOS\WATCOM

El directorio SOURCE contiene archivos fuente para las partes genricas de POV-Ray qu son comunes a todas las plataformas. El directorio SOURCE\LIBPNG contiene archivos para compilar una biblioteca de rutinas utilizadas en la lectura y escritura de archivos grficos en formato PNG (Portable Network Graphic). El directorio SOURCE\ZLIB contiene archivos para compilar una biblioteca de rutinas utilizada por libpng para comprimir y descomprimir flujos de datos. Todos estos archivos son usados por todas las plataformas y compiladores. Estn en cada versin de los archivos fuente. El directorio SOURCE\MSDOS contiene todos los archivos fuente de la versin para MS-DOS comn a todos los compiladores MS-DOS soportados. El subdirectorio PMODE contiene archivos fuente para PMODE.LIB qu son necesarios para todas las versiones de MS-DOS. Los subdirectorios BORLAND, DJGPP y WATCOM contienen fuente, archivos make y archivos de proyecto para compiladores de C de Borland, DJGPP y Watcom.

2. DESCRIPCIN DEL PROGRAMA

20

El directorio SOURCE\MSDOS esta slo en el archivo MS-DOS. De manera semejante el archivo Windows contiene un directorio SOURCE\WINDOWS. El archivo Unix contiene un directorio SOURCE/UNIX etc. El directorio SOURCE\MSDOS contiene un archivo CMPL_MSD.DOC qu contiene informacin de compilacin especfica de la versin MS-DOS. Otros directorios especficos de plataforma contienen archivos CMPL_XXX.DOC similares y los subdirectorios especficos del compilador tambin contienen archivos CMPL_XXX.DOC especficos. Asegrese de leer todos los archivos CMPL_XXX.DOC pertinentes para su plataforma y compilador. 2.3.7.2. Configurando el fuente de POV-Ray

Cada plataforma tiene un archivo de cabecera (header) llamado CONFIG.H qu generalmente est en el directorio especfico de la plataforma, pero podra estar en el directorio especfico del compilador. Algunas plataformas tienen versiones mltiples de este archivo y podras necesitar copiarlo o renombrarlo como CONFIG.H. Este archivo se incluye en cada mdulo de POV-Ray. Contiene todos los prototipos, macros y otras definiciones qu se requieren en las partes genricas de POV-Ray, pero debe ser personalizado para una plataforma o compilador en particular. Por ejemplo, sistemas operativos diferentes usan caracteres diferentes como separador entre directorios y nombres del archivo. MS-DOS usa una barra invertida(\), Unix una barra normal(/) y Mac una coma(,). El archivo CONFIG.H para MS-DOS y Windows contienen lo siguiente:
#define FILENAME_SEPARATOR '\'

qu instruye a la parte genrica de POV-Ray para usar una barra invertida(\). Cada personalizacin que la parte genrica del cdigo requiere tiene un valor por defecto en el archivo SOURCE\FRAME.H, qu tambin se incluye en cada mdulo despus de CONFIG.H. El archivo de cabecera FRAME.H contiene muchos grupos de definiciones como esta:
#ifndef FILENAME_SEPARATOR #define FILENAME_SEPARATOR '/' #endif

el cual bsicamente dice qu si no est definido previamente en CONFIG.H, entonces este es su valor por defecto. Verifica FRAME.H para ver qu otros valores puedes querer configurar. Si se usa cualquier definicin para especificar una funcin especifica de una plataforma tambin se deber incluir un prototipo para esa funcin. El archivo SOURCE\MSDOS\CONFIG.H, por ejemplo, no slo contiene el macro:
#define POV_DISPLAY_INIT(w,h) MSDOS_Display_Init ((w), (h));

para definir el nombre de la funcin de inicializacin de visualizacin de grficos, tambin contiene el prototipo:
void MSDOS_Display_Init (int w, int h);

Si piensas portar POV-Ray hacia una plataforma no soportada debes comenzar probablemente con la versin ms simple para Unix sin previsualizacin. Despus agrega nuevos trozos personalizados a travs del archivo CONFIG.H. 2.3.7.3. Conclusin

Comprendemos que las secciones anteriores son solo los primeros pasos, pero la mitad de la diversin de trabajar en los fuentes de POV-Ray es escarbar en ellos y figurrtelo por ti mismo. As es como los

PERSISTENCE OF VISION RAYTRACER

21

miembros del POV-Ray Team comenzaron. Hemos tratado de hacer el cdigo tan claro como pudimos. Asegrate de leer los archivos CMPL_XXX.DOC en los directorios de tu plataforma y compilador especficos para obtener alguna ayuda menor ms si trabaja en una plataforma o compilador soportados. Buena suerte !

2.4. Donde encontrar POV-Ray


Las ultimas versiones del software POV-Ray estn disponibles de las siguientes fuentes.

2.4.1. Foro de POV-Ray en Compuserve


La oficina principal de POV-Ray est en CompuServe, en el foro POVRAY, qu es dirigido por algunos de los miembros del equipo. Nos reunimos all para compartir informacin, programas tiles, utilidades y grficos creados con POV-Ray. Todo el mundo es bienvenido para unirse a la accin en CIS: POVRAY. Esperamos verte all! Puedes obtener informacin de como unirse a CompuServe llamando al (800)848-8990 o visitando la pgina principal de CompuServe en http://www.compuserve.com. Acceso directo a CompuServe tambin esta disponible en Japn, Europa y muchos otros pases.

2.4.2. Internet
El hogar en Internet de POV-Ray est disponible a travs del world wide web a travs de la direccin http://www.povray.org y va ftp como ftp.povray.org. Por favor, vistala a menudo para conocer los ltimos archivos, utilidades, noticias e imgenes del sitio oficial de POV-Ray en Internet. El grupo de noticias comp.graphics.rendering.raytracing es visitado por muchos usuarios competentes de POV-Ray qu estn muy deseosos de compartir su conocimiento. Generalmente primero te invitan a curiosear unos pocos archivos para ver si alguien ya ha contestado la misma pregunta, y por supuesto, a qu sigas la apropiada "netiquette". Si tienes cualquier duda sobre las calificaciones de las personas qu frecuentan el grupo, unos pocos minutos empleados en la pagina de la Competicin de Raytracing en www.povray.org te convencern rpidamente.

2.4.3. Area de grficos para PC en Amrica On-Line


Hay ahora un rea en Amrica On-Line dedicada al soporte e informacin de POV-Ray. Puedes encontrarla en la seccin PC Graphics de AOL. Sigue la palabra clave POV (la palabra clave PCGRAPHICS te conducir al principio de la seccin relacionada con los grficos). Esta rea incluye tambin los ejecutables para Apple Macintosh. Lo mejor sera qu los mensajes sean dejados en la seccin Company Support. Normalmente, Bill Pulver (BPulver) es nuestro representante all.

2. DESCRIPCIN DEL PROGRAMA

22

2.4.4. BBS The Graphics Alternative en El Cerrito, CA


Para todos aquellos en la costa oeste1, podis encontrar los archivos de POV-Ray en The Graphics Alternative BBS. Es una gran BBS grfica dirigida por Adam Shiffman. TGA es una BBS de alta calidad, activa y progresiva que oferta mensajera y archivos de calidad a sus ms de 1300 usuarios. 510-524-2780 (PM14400FXSA v.32bis 14.4k, Pblico) 510-524-2165 (USR DS v.32bis/ HST 14.4k, Subscriptores)

2.4.5. PCGNet
La red Profesional de CAD y Grficos (PCGnet) sirve a ambas comunidades, CAD y Grficos haciendo ampliamente disponible informacin til. Anteriormente conocida como ADEnet, PCGnet es una red nueva que incorpora nodos nuevos y enfoca uniformemente ambos tpicos relacionados, CAD y Grficos, incluyendo, pero no limitada a, los temas siguientes: diseo, dibujo, ingeniera, modelado 2d y 3d, multimedia, sistemas, imagen raster, trazado de rayos, rendering y animacin 3d. PCGnet esta diseada para servir las necesidades de todos los visitantes estimulando el inters y generando foros de soporte para usuarios activos qu tienen un inters en los temas relacionados al CAD y los grficos previamente mencionados; el inters y soporte se genera a travs de las conferencias de mensajes de PCGnet, compartiendo archivos a travs de la red, noticias de la industria y boletines de prensa. Las conferencias de mensajes de PCGnet son foros moderados diseados acomodar discusiones amistosas, y aun as profesionales e informativas sobre los asuntos relacionados con el CAD y los grficos. TGA BBS sirve como eje central para una gran red de sistemas BBS orientados a los grficos alrededor del mundo. La siguiente es una descripcin concisa de los nodos activos de PCGNet al momento qu este documento fue escrito. El POV-Team no puede responder sobre la validez de esta informacin, ni verificar qu cualquiera de estas BBS distribuyan POV-Ray. EE.UU. y Canad
411-Exchange Autodesk Global Village CAD/Engineering Services Canis Major CEAO BBS CHAOS BBS Joes CODE BBS John's Graphics PC-AUG SAUG BBS Space Command BBS The CAD/fx BBS The Drawing Board BBS The Graphics Alternative The Happy Canyon Los New Graphics BBS The University The virtual Dimension Alpharetta San Rafael Hendersonville Nashville Columbus Columbia West Bloomfield Brooklyn Park Phoenix Bellevue Kennewick Mesa Anchorage El Cerrito Denver Piscataway Shrewsbury Twp Oceanside GA CA TN TN OH MO MI MN AZ WA WA AZ AK CA CO NJ NJ CA 404-345-0008 415-507-5921 615-822-2539 615-385-4268 614-481-3194 314-874-2930 810-855-0894 612-425-4436 602-952-0638 206-644-7115 509-735-4894 602-835-0274 907-349-5412 510-524-2780 303-759-3598 908-271-8878 908-544-8193 619-722-0746

De los Estados Unidos, obviamente (N. de los T.)

PERSISTENCE OF VISION RAYTRACER


Time-Out BBS Sadsburyville PA 610-857-2648

23

Australia
MULTI-CAD BBS Magazine My Computer Company Sydney PCUG Compaq BBS The Baud Room Toowong QLD Erskineville NSW Caringbah NSW Melbourne VIC 61-7-878-2940 61-2-557-1489 61-2-540-1842 61-3-481-8720

Austria
Austrian AutoCAD User Group Graz 43-316-574-426

Blgica
Lucas Visions BBS Boom 32-3-8447-229

Dinamarca
Horreby SuperBBS Nykoebing Falster 45-53-84-7074

Finlandia
DH-Online Triplex BBS Jari Hiltunen Helsinki 358-9-40562248 358-9-5062277

Francia
CAD Connection Zyllius BBS! Montesson Saint Paul 33-1-39529854 33-93320505

Alemania
Ray BBS Munich Tower of Magic Munich Gelsenkirchen 49-89-984723 49-209-780670

Pases Bajos
BBS Bennekom: Fractal Board CAD-BBS Foundation One Bennekom Nieuwegein Baarn 31-318-415331 31-30-6090287 31-30-6056353 31-35-5422143

Nueva Zelanda
The Graphics Connections The Graphics Connections II The Graphics Connections III Wellington Nuevo Plymouth Auckland 64-4-566-8450 64-6-757-8092 64-9-309-2237

Slovenia
MicroArt Koper 386-66-34986

Suecia
Autodesk On-line Gothenburg 46-31-401718

Reino Unido
CADenza BBS Raytech BBS The Missing Link Leicester, UK Tain, Scotland Surrey, England 44-116-259-6725 44-1862-83-2020 44-181-641-8593

Nmeros de pases o de larga distancia podran requerir usar nmeros adicionales. Consulta a tu compaa telefnica local.

2.4.6. Libros y cd-roms relacionados con POV-Ray


Los artculos siguientes fueron producidos por miembros del POV-Team. Aunque slo tienen presente a POV-Ray 2.2 todava sern tiles. El siguiente paso es actualizar el cdrom de POV-Ray a la versin 3, con una versin nueva que se espera para la primera la mitad de 1997.

2. DESCRIPCIN DEL PROGRAMA

24

Los libros listados abajo se han sido descatalogados recientemente, pero pueden encontrarse todava en algunas libreras o bibliotecas (Visita http://www.dnai.com:80waite/ para ms detalles).
Ray Tracing Creations, 2d Ed. Chris Young and Drew Wells ISBN 1-878739-69-7 Waite Group Press, 1994

700 paginas con insertos en color y POV-Ray 2.2 en discos MS-DOS de 3.5".
Ray Tracing Worlds with POV-Ray Alexander Enzmann, Lutz Kretzschmar, Chris Young ISBN 1-878739-64-6 Waite Group Press, 1994

Incluye el modelador Moray 1.5x y POV-Ray 2.2 en discos MS-DOS de 3.5".


Ray Tracing for the Macintosh CD Eduard Schwan ISBN 1-878739-72-7 Waite Group Press, 1994

Viene con un CD-ROM lleno de escenas, imgenes, pelculas QuickTime, y una referencia de palabras clave interactiva. Tambin un disco flexible con POV-Ray para aquellos que no tienen un lector de CDROM. 'The Official POV-Ray CDROM' El cdrom Oficial de POV-Ray es una recopilacin de imgenes, fuentes de escenas, fuentes de programas, utilidades y trucos sobre POV-Ray y los grficos 3D provenientes de Internet y CompuServe. Dirigido no slo a aquellos qu quieren crear sus propias imgenes o hacer trabajos de programacin general en 3D, sino tambin a aquellos que quieren simplemente admirar unas imgenes del alta calidad hechas por algunos de los mejores artistas de POV-Ray, y aprender de su cdigo fuente. El cdrom contiene ms de 500 imgenes trazadas. Es un buen recurso para aquellos qu estn aprendiendo sobre POV-Ray, as como aquellos que ya tienen experiencia, y contiene un tutorial interactivo basado en Windows. El disco viene con un poster desplegable y una hoja de referencia. El CD es compatible con los formatos DOS/Windows y Macintosh. El cdrom esta disponible tambin en la World Wide Web, en http://www.povray.org/pov-cdrom. Para ms detalles visita http://www.povray.org/povcd.

PERSISTENCE OF VISION RAYTRACER

25

3. Comienzo rpido
La siguiente seccin describe como instalar rpidamente POV-Ray y trazar escenas de ejemplo en tu ordenador. Se asume que ests usando un ordenador compatible con IBM-PC con MS-DOS. Para otras plataformas debes buscar la documentacin especfica incluida en el archivo que contiene POV-Ray.

3.1. Instalando POV-Ray


En el ejecutable para tu ordenador se incluyen instrucciones especficas para la instalacin. En general, hay dos formas de instalar POV-Ray.2 [Ten en cuenta que usamos la palabra directorio. Tu sistema operativo puede que use otro trmino (subdirectorio, carpeta, etc.)] 1) La forma chapucera: crea un directorio llamado POVRAY y copia todos los archivos de POV-Ray en el. Edita y ejecuta todos los archivos y programas desde este directorio. Este mtodo funciona, pero no es el recomendado. O la forma recomendada: 2) Crea un directorio llamado POVRAY y varios subdirectorios llamados INCLUDE, DEMO, SCENES, UTIL. Los archivos autoextrables de algunas versiones del programa crean estos directorios por ti. Si los creas t mismo, el rbol de directorios debera quedar parecido a esto:
\-| +POVRAY -| +INCLUDE | +DEMO | +SCENES | +UTIL

Copia los ejecutables y la documentacin al directorio POVRAY. Copia los archivos de inclusin estndar en el subdirectorio INCLUDE. Copia las escenas de ejemplo en el subdirectorio SCENES. Y copia cualquier utilidad relacionada con POV-Ray en el subdirectorio UTIL. Las escenas que crees irn en el subdirectorio SCENES. Tambin tendrs que aadir los directorios \POVRAY y \POVRAY\UTIL a tu path, para que los programas puedan ser ejecutados desde cualquier directorio. Ten en cuenta que algunos sistemas operativos no tienen soporte para mltiples trayectorias de bsqueda.

Si utilizas el programa de instalacin de POV-Ray, este se encargar de crear la estructura de directorios necesaria. En este caso puedes omitir esta seccin (N. de los T.)
2

3. COMIENZO RPIDO

26

El segundo mtodo es un poco ms complicado de poner a punto, pero es el preferido. Hay muchos archivos asociados a POV-Ray que son mucho ms fciles de manejar cuando estn separados en varios directorios.

3.2. Utilizacin bsica


Nota: si no instalas el programa usando INSTALL.EXE, los ejemplos e instrucciones siguientes no funcionarn. El proceso de instalacin configura POVRAY.INI y varios archivos BATimportantes. Sin esos archivos configurados, los ejemplos siguientes no funcionarn. El propsito bsico de POV-Ray es leer una descripcin de una escena escrita en el lenguaje de POV y escribir un archivo conteniendo la imagen. Estos archivos de escena son texto ASCII que puedes crear usando un editor de texto. Con el paquete se incluyen docenas de archivos de ejemplo para ilustrar las caractersticas. El programa se ejecuta escribiendo un comando desde el smbolo de MS-DOS. El comando es povray y debe ir seguido de uno o ms parmetros. Cada parmetro comienza con un signo ms o menos, y van separados entre s por espacios. Los parmetros pueden estar en maysculas o minsculas. Nota: los ejemplos en esta documentacin asumen que has instalado POV-Ray en el directorio C:\POVRAY3. El instalador te permitir instalar POV-Ray en cualquier sitio y configurar el programa para la unidad y directorio que especifiques. Simplemente sustituye esa unidad y directorio donde te digamos que uses C:\POVRAY3. Cmbiate a ese directorio ahora. Luego teclea la siguiente lnea de comando y pulsa [ENTER}.
POVRAY +ISHAPES +D1

El parmetro +I (de input) le dice al programa que archivo debe leer como entrada. Si no le das una extensin al nombre del archivo, se asume .POV. De modo que +Ishapes le dice que lea SHAPES.POV para ser trazado. El parmetro +D (de display) le dice al programa que active la previsualizacin grfica. El parmetro -D la desactivara. El nmero 1 le dice que tipo de adaptador grfico usar. El tipo 1 es el antiguo adaptador estndar VGA a 320 por 200 puntos de resolucin y 256 colores. Totalmente garantizado que funcionar en cualquier tarjeta de vdeo VGA. Hay otras opciones activas adems de las que especificaste en la lnea de comandos. Se guardan en un archivo llamado POVRAY.INI que es creado por el programa de instalacin. POV-Ray busca automticamente este archivo en el mismo directorio donde reside POVRAY.EXE. Mira las secciones Archivos INI y Usando los archivos INI para obtener ms informacin sobre POVRAY.INI y otros archivos INI. Al ejecutar el comando anterior, vers aparecer brillantes formas geomtricas a medida que POV-Ray va calculando el color de cada pixel lnea a lnea. Probablemente estars descontento con el resultado grfico. Esto es debido a que es nicamente una previsualizacin. La imagen actual contiene 24 bits de color pero no se puede mostrar tan alta calidad usando una simple tarjeta VGA con un conjunto de 256 colores fijos. Si tu hardware soporta el interface estndar VESA o si tienes un controlador VESA instalado, prueba a ejecutar con el parmetro +DG en lugar de +D1. Esto te dar acceso a los varios modos que tu tarjeta de vdeo puede usar. Si tienes capacidad para color de 15 o 16 bits prueba +DGH, o si tienes capacidad para color de 24 bits prueba +DGT para ver la imagen en todo su esplendor. Consulta la seccin Tipos de visualizacin ms adelante para obtener ms informacin sobre la previsualizacin grfica.

PERSISTENCE OF VISION RAYTRACER

27

Cuando el programa termine oirs unos pitidos. Despus de admirar la imagen pulsa [ENTER]. Vers una pantalla de texto con estadsticas. Si el texto es demasiado largo para caber en la pantalla puedes pulsar las teclas cursor arriba o cursor abajo para leer ms texto. Fjate en las pestaas que hay en la parte inferior de la pantalla. Pulsa las teclas cursor derecha o cursor izquierda para leer otra informacin interesante. Pulsa [ENTER] de nuevo para salir de POV-Ray.

PERSISTENCE OF VISION RAYTRACER

29

4. Tutorial para principiantes


El Tutorial para Principiantes explica paso a paso como usar el lenguaje de descripcin de escena de POV-Ray para crear tus propias escenas. Se explica el uso de casi todas las caractersticas del lenguaje de POV-Ray. Aprenders las cosas bsicas como donde colocar la cmara o las fuentes de luz. Tambin aprenders como crear una gran variedad de objetos y como asignarles texturas. Las caractersticas mas sofisticadas, como la radiosidad, los halos y los efectos atmosfricos tambin sern explicados con detalle. Las siguientes secciones explican las caractersticas de POV ms o menos en el mismo orden en que aparecen en el captulo de Referencia.

4.1. Tu primera imagen


Vamos a crear el archivo de escena para una imagen sencilla. Como las esferas son las formas ms comunes en los trazadores, es lo primero que usaremos.

4.1.1. El sistema de coordenadas de POV-Ray


Primero hemos de decirle a POV-Ray donde situar nuestra cmara y hacia donde apuntar. Para hacer esto, usamos coordenadas 3D. El sistema de coordenadas habitual de POV-Ray tiene el sentido positivo del eje Y apuntando hacia arriba, el sentido positivo del eje X hacia la derecha y el sentido positivo del eje Z apuntando hacia el interior del monitor, tal y como muestra la figura:

Figura 1: El sistema de coordenadas de mano izquierda (el eje Z apunta alejndose de ti) Este tipo de sistema de coordenadas se llama "de mano izquierda". Si usas los dedos de tu mano izquierda puedes ver fcilmente porque se llama as. Apunta el pulgar hacia la direccin positiva del eje X, el dedo ndice hacia la direccin positiva del eje Y, y el dedo medio hacia la direccin positiva del eje Z. Slo puedes hacer esto con la mano izquierda. Si hubieras usado la mano derecha no habras sido capaz de apuntar el dedo medio hacia la direccin correcta.

4. TUTORIAL PARA PRINCIPIANTES

30

La mano izquierda se puede usar tambin para determinar las direcciones de rotacin. Para hacer esto debes practicar el famoso ejercicio de Aerobic Infogrfico. Toma tu mano izquierda, y apunta el pulgar hacia la direccin positiva del eje de rotacin. El resto de los dedos se curvarn en la direccin positiva de rotacin. Del mismo modo, si apuntas hacia la direccin negativa del eje, los dedos se curvarn sobre la direccin negativa de rotacin.

Figura 2: Aerobic Infogrfico para determinar el sentido de rotacin En la ilustracin, la mano izquierda se curva sobre el eje X. El dedo pulgar apunta hacia la direccin positiva del eje X y los dedos se curvan sobre la direccin positiva de rotacin. Si quieres usar un sistema de coordenadas de mano derecha, como hacen algunos sistemas de CAD como AutoCAD, has de modificar el vector right en la especificacin de la cmara. Mira la descripcin detallada en la seccin "Sistemas de coordenadas levgiros y dextrgiros". En un sistema de mano derecha debes usar tu mano derecha para el Aerobic. Ten en cuenta que hay alguna controversia sobre si el mtodo que usa POV-Ray para obtener un sistema de coordenadas de mano derecha es realmente vlido. Si quieres evitarte problemas te sugerimos que uses el sistema de mano izquierda, sobre el que no hay disputa.

4.1.2. Aadiendo archivos de inclusin estndar.


Usando tu editor de textos favorito, crea un archivo llamado DEMO.POV. Ahora teclea lo siguiente (POV-Ray distingue entre maysculas y minsculas, as que asegrate de que estn correctas).
#include #include #include #include #include #include #include "colors.inc" "shapes.inc" "finish.inc" "glass.inc" "metals.inc" "stones.inc" "woods.inc" // Los archivos de inclusin contienen // elementos de escena predefinidos

La primera sentencia de inclusin lee las definiciones de varios colores tiles. La segunda sentencia de inclusin las definiciones de algunas formas tiles. Las siguientes leen definiciones de acabados y texturas de vidrios, metales, piedras y maderas.

PERSISTENCE OF VISION RAYTRACER

31

Slo debes incluir aquellos archivos que realmente uses en tu escena. Algunos de los archivos de inclusin que vienen con POV-Ray son bastante largos, y es mejor que ahorres memoria y tiempo de interpretacin si no los vas a usar. En los siguientes ejemplos solo vamos a usar COLORS.INC, FINISH.INC y STONES.INC, as que mejor que quites el resto de las lneas de tu archivo de escena. Puedes tener tantos archivos de inclusin como sea necesario. Los archivos de inclusin pueden incluso contener a otros archivos, pero esto est limitado a diez niveles de profundidad. Los nombres de archivos en las sentencias de inclusin se buscan primero en el directorio actual. Si no se encuentran, se buscan en los directorios especificados por el parmetro +L o por la opcin Library_Path. Esto facilita el tener todos los archivos de inclusin en un directorio aparte, y especificar con el parmetro +L donde se encuentran.

4.1.3. Aadiendo la cmara.


La declaracin de la cmara describe donde y como la cmara ve la escena. Hay que especificar las coordenadas x, y, x que sitan a la cmara y a que parte de la escena est apuntando. Para describir las coordenadas x, y, z usamos un vector de tres componentes. Un vector se especifica poniendo tres valores numricos entre parntesis angulares y separando los valores por comas. Aade la siguiente sentencia a la escena.
camera { location <0, 2, -3> look_at <0, 1, 2> }

Brevemente, location <0, 2, -3> sita la cmara dos unidades hacia arriba y tres unidades hacia atrs a partir del centro del universo del trazador, que est situado en <0, 0, 0>. Recuerda que por defecto +Z va hacia dentro del monitor, y -Z sale hacia fuera. Tambin look_at <0, 1, 2> rota la cmara hasta apuntar a las coordenadas <0, 1, 2>. Es decir, un punto a 5 unidades enfrente de la cmara y 1 unidad ms abajo que la cmara. El punto look_at es el centro de atencin de tu imagen.

4.1.4. Describiendo un objeto.


Ahora que la cmara est lista para registrar la escena, vamos a poner una esfera amarilla. Aade lo siguiente a tu archivo de escena:
sphere { <0, 1, 2>, 2 texture { pigment { color Yellow } } }

El primer vector especifica el centro de la esfera. En este ejemplo la coordenada x es cero, de modo que estar centrada a izquierda y derecha. Tambin tenemos y=1, o una unidad por encima del origen. La coordenada z es 2, que est a 5 unidades de la cmara, que est en z=3. Despus del vector hay una coma seguida por el radio que en este caso es de 2 unidades. Como el radio es la mitad de la anchura de la esfera, sta tendr un ancho de 4 unidades.

4. TUTORIAL PARA PRINCIPIANTES

32

4.1.5. Aadiendo la textura al objeto.


Despus de definir la posicin y tamao de la esfera, necesitamos describir la apariencia de su superficie. El bloque texture {...} especifica el color, la rugosidad y las propiedades del acabado de un objeto. En este ejemplo slo vamos a especificar el color. Esto es lo mnimo que debemos hacer. El resto de las opciones de la textura usarn los valores por defecto. El color que tu defines es el que tendr el objeto cuando est totalmente iluminado. Si estuvieras haciendo un dibujo de una esfera usaras tonos oscuros para indicar las zonas sombreadas, y tonos brillantes para indicar las zonas iluminadas. Sin embargo, el trazador se ocupa ya de eso. T eliges el color inherente al objeto y POV-Ray lo aclara u oscurece dependiendo de la iluminacin de la escena. Como estamos definiendo el color que el objeto tiene en lugar del color aparente, el parmetro usado se llama pigment. Hay muchos tipos de distribuciones de color que se pueden usar en la sentencia pigment {...}. La palabra clave color indica que todo el objeto es de un nico color, en lugar de tener una distribucin de colores. Puedes usar uno de los colores definidos previamente en el archivo de inclusin colors.inc. Si no hay un color estndar disponible para tus necesidades, puedes definir tu propio color usando la palabra clave color seguida de red, green y blue, que especifican las cantidades de rojo, verde y azul de que se compone el color. Por ejemplo, un bonito tono rosa se puede indicar como:
color red 1.0 green 0.8 blue 0.8

Los valores despus de cada palabra han de estar comprendidos entre 0.0 y 1.0. Cualquiera de los tres componentes no especificadas se toman como 0 por defecto. Tambin se puede usar una notacin ms corta. Lo siguiente tambin produce el mismo tono rosa:
color rgb <1.0, 0.8, 0.8>

Los colores se explican con ms detalle en la seccin "Especificando Colores".

4.1.6. Definiendo una fuente de luz.


Un ltimo detalle falta en nuestra escena. Necesitamos una fuente de luz, hasta que crees una no habr luz en este mundo virtual. De modo que aade esta lnea
light_source {<2, 4, -3> color White}

a tu archivo de escena. Tu primera escena con POV-Ray debera quedar as:


#include "colors.inc" background { color Cyan } camera { location <0, 2, -3> look_at <0, 1, 2> } sphere { <0, 1, 2>, 2 texture { pigment { color Yellow } } } light_source { <2, 4, -3> color White}

PERSISTENCE OF VISION RAYTRACER

33

El vector en la sentencia light_source especifica la posicin de la luz como 2 unidades a nuestra derecha, 4 unidades sobre el origen y 3 unidades por detrs del origen. La fuente de luz es invisible, slo emite luz, de modo que no se necesita textura. Esto es todo. Graba el archivo y traza una pequea imagen con la orden
povray +w160 +h120 +p +x +d0 -v -idemo.pov

Si tu ordenador no usa la lnea de comandos, consulta la documentacin especfica de tu plataforma para ver como trazar la escena. Tambin puedes especificar otras opciones en la lnea de comandos, si quieres. La escena ser escrita al archivo DEMO.TGA (o con otro sufijo si tu ordenador usa un formato por defecto diferente). La escena que acabas de trazar no es ninguna obra de arte, pero tenemos que empezar por lo bsico antes de que exploremos caractersticas y escenas mucho ms fascinantes.

4.2. Usando la cmara


4.2.1. Usando el desenfoque
Vamos a construir una escena simple para ilustrar el uso del desenfoque. Para este ejemplo usaremos una esfera rosa, una caja verde y un cilindro azul. La esfera estar en primer plano, la caja en el centro y el cilindro al fondo. Para completar la escena pondremos un suelo ajedrezado y un par de fuentes de luz. Creamos un nuevo archivo llamado FOCALDEM.POV y tecleamos lo siguiente:
#include "colors.inc" #include "shapes.inc" #include "textures.inc" #version 3.0 global_settings { assumed_gamma 2.2 // para la mayora de los monitores de PC max_trace_level 5 } sphere { <1, 0, -6>, 0.5 finish { ambient 0.1 diffuse 0.6 } pigment { NeonPink } } box { <-1, -1, -1>, < 1, rotate <0, -20, 0> finish { ambient 0.1 diffuse 0.6 } pigment { Green } } 1, 1>

cylinder { <-6, 6, 30>, <-6, -1, 30>, 3 finish { ambient 0.1 diffuse 0.6 }

4. TUTORIAL PARA PRINCIPIANTES


} pigment {NeonBlue}

34

plane { y, -1.0 pigment { checker color Gray65 color Gray30 } } light_source { <5, 30, -30> color White } light_source { <-5, 30, -30> color White }

Ahora vamos a poner la cmara en una posicin apropiada, justo detrs de los tres objetos. Ajustando el punto focal moveremos el foco a cualquier punto de la escena. Aade las siguientes lneas:
camera { location <0.0, 1.0, -10.0> look_at <0.0, 1.0, 0.0> // focal_point <-6, 1, 30> // focal_point < 0, 1, 0> focal_point < 1, 1, -6> aperture 0.4 // aperture 0.05 // aperture 1.5 // blur_samples 4 blur_samples 20 } // el cilindro est enfocado // la caja esta enfocada // la esfera est enfocada

// una solucin de compromiso // casi todo est enfocado // muy desenfocado // poco muestreo, trazado ms rpido // ms muestras, mayor calidad de la imagen

El punto focal es el punto de la escena que estar totalmente enfocado, con los bordes bien definidos. Definimos el punto focal y asignamos un valor a la apertura para ajustar la distancia a la que comenzar a desenfocarse la imagen. El ajuste de la apertura puede considerarse como el rea enfocada. Aumentar la apertura tiene como efecto el hacer ms pequea el rea donde todo est enfocado, mientras de disminuirla hace que el rea enfocada sea mayor. As es como controlamos donde comienza a desenfocarse la imagen alrededor del punto focal. El valor de blur_samples determina cuantos rayos se trazan para muestrear cada pixel. Bsicamente, cuantos ms rayos se usen mayor ser la calidad de la imagen, y consecuentemente mayor tiempo tardar en trazarse. Cada escena es diferente, as que tendremos que experimentar. En este tutorial tenemos ejemplos de 4 y 20 muestras, pero podemos usar ms para imgenes de alta resolucin. No deberamos usar ms muestras que las necesarias para obtener la calidad deseada, porque ms muestras suponen ms tiempo para el trazado. Los ajustes de confidencia y varianza estn cubiertos en la seccin "Desenfoque". Experimenta con el punto focal, la apertura y el valor del muestreo. La escena tiene lneas con varios valores, y puedes probarlos comentando las lneas por defecto, y quitando el comentario a la lnea que quieras probar. Haz un cambio de cada vez para que puedas ver el efecto sobre la escena. Dos cosas sobre el trazado de escenas con desenfoque. No necesitamos especificar antialias (el parmetro +a) porque el desenfoque en s ya es un mtodo de sobremuestreo. El desenfoque slo puede usarse con la cmara de perspectiva (perspective camera).

PERSISTENCE OF VISION RAYTRACER

35

4.3. Formas simples


Hasta ahora, slo hemos usado la forma de la esfera. Hay muchas otras formas que podemos usar con POV-Ray. Las secciones siguientes describirn cmo usar algunas de las ms sencillas en lugar de la esfera usada anteriormente.

4.3.1. Caja
La caja es uno de los objetos ms utilizados. Sustituyamos la esfera por el texto del siguiente ejemplo:
box { <-1, 0, -1>, < 1, 0.5, 3> texture { T_Stone25 scale 4 } } rotate y*20 // Esquina delantera inferior izquierda // Esquina trasera superior derecha // Predefinida en stones.inc // Escalamos en todas las direcciones el mismo factor // Equivalente a "rotate <0,20,0>"

En el ejemplo, podemos observar que una caja se define especificando las coordenadas tridimensionales de sus esquinas opuestas. El primer vector debe contener los valores mnimos de x, y y z, y el segundo debe contener los valores mximos. Los objetos con forma de caja slo pueden ser definidos con sus aristas paralelas a los ejes del eje de coordenadas. Si lo deseamos, podemos rotarlos para situarlos de otra manera. Observa que podemos construir expresiones matemticas de diverso tipo con nmeros y vectores. El parmetro de la rotacin est expresado por el vector y multiplicado por 20. Es lo mismo que <0, 1, 0>*20, es decir, <0, 20, 0>.

4.3.2. Cono
Aqu tenemos otro ejemplo mostrando cmo usar un cono.
cone { <0, 1, 0>, 0.3 <1, 2, 3>, 1.0 } // Centro y radio de una base // Centro y radio de la otra base

texture { T_Stone25 scale 4 }

La forma del cono se define mediante el centro y el radio de cada base. En el ejemplo, una de las bases est centrada en el <0, 1, 0> y tiene radio 0.3, mientras que la otra est centrada en el punto <1, 2, 3> y tiene radio 1. Si queremos que el cono acabe en punta, indicaremos para esa base un radio 0. Ambas bases son paralelas y perpendiculares al eje del cono. Si queremos que el cono sea dibujado abierto, aadiremos la palabra open despus del segundo radio, como en el siguiente ejemplo:
cone { <0, 1, 0>, 0.3 // Centro y radio de una base <1, 2, 3>, 1.0 // Centro y radio de la otra base open // Quita las bases } texture { T_Stone25 scale 4 }

4.3.3. Cilindro
Podemos definir tambin un cilindro como sigue:
cylinder { <0, 1, 0>, // Centro de una base

4. TUTORIAL PARA PRINCIPIANTES


<1, 2, 3>, // Centro de la otra base 0.5 // Radio open // No dibuja las bases } texture { T_Stone25 scale 4 }

36

4.3.4. Plano
Probemos a crear un objeto tpico de los grficos por ordenador: el suelo ajedrezado. Aadimos el objeto siguiente a la primera versin del archivo DEMO.POV, el que incluye la esfera.
plane { <0, 1, 0>, -1 pigment { checker color Red, color Blue } }

El objeto definido aqu es un plano infinito. El vector <0, 1, 0> marca la direccin normal a la superficie del plano (si estuvisemos de pie sobre la superficie, la direccin apuntara desde nuestros pies hacia nuestra cabeza). El nmero situado tras el vector marca la distancia a la que el plano est situado del origen de coordenadas medido sobre la direccin normal. En este caso, el suelo est situado en y=-1, una unidad por debajo del centro. Como la esfera tiene radio 2 y est centrada a una unidad de altura, reposa sobre el suelo. Observemos que, aunque no hay una declaracin de textura, hay una textura implcitamente declarada aqu. Teclear continuamente instrucciones anidadas del tipo de texture{pigment{....}} es muy agotador, de forma que POV-Ray nos permite omitir la instruccin textura en muchas ocasiones. De hecho, slo deberemos usarla cuando englobemos una textura predefinida (como T_Stone25 del ejemplo anterior), o cuando apilemos varias texturas (como veremos ms adelante). Este pigmento usa el patrn de color ajedrezado y especifica que los colores usados sern el rojo y el azul. Como los vectores <1, 0, 0>, <0, 1, 0> y <0, 0, 1> se usan frecuentemente, POV-Ray tiene tres identificadores reservados (x, y, z) que se pueden usar como abreviatura. As, un plano puede definirse como
plane { y, -1 pigment { ... } }

Observa que no usamos los smbolos < y > alrededor de los identificadores de vectores. Mirando al suelo, descubrimos que la esfera produce una sombra en l. El trazador de rayos calcula las sombras de forma muy precisa y esto crea sombras con bordes muy definidos. En el mundo real habitualmente se aprecia una zona de penumbra o sombra "suave". Ms adelante aprenderemos cmo usar luces avanzadas para suavizar el borde de las sombras.

4.3.5. Inclusin de objetos estndar


El archivo de inclusin shapes.inc contiene algunas formas predefinidas que tienen un tamao similar a una esfera de radio uno. Podemos invocarlas desde uno de nuestros diseos as:
#include "shapes.inc" object { UnitBox texture { T_Stone25 scale 4 }

PERSISTENCE OF VISION RAYTRACER


scale 0.75 rotate <-20,25,0> translate y

37

4.4. Formas avanzadas


Despus de haber conseguido cierta experiencia con las formas simples de POV-Ray, es el momento de hablar de las formas ms avanzadas (e interesantes). Debemos tener en cuenta que las formas definidas en adelante no son sencillas de entender. No debemos preocuparnos por no saber usarlas, o no conocer su aspecto. Slo probaremos unos ejemplos que juegan con las caractersticas descrita ms ampliamente en el captulo de referencias. No hay nada mejor para aprender que practicar.

4.4.1. Parche bicbico 4.4.2. Burbuja


Las burbujas se pueden describir como esferas y cilindros que tienden a fusionarse unos con otros cuando estn prximos. Ideales para modelar tomos y molculas, estos objetos son tambin herramientas poderosas que nos permiten crear variadas formas orgnicas. Una manera ms matemtica de describir una burbuja es decir que es un objeto hecho de dos o ms componentes, de forma que cada componente se comporta como un campo de fuerza invisible que comienza con una intensidad determinada y decae a cero a cierto radio. Donde esos campos se solapan, sus intensidades se suman (algunos de esos componentes pueden tener intensidad negativa, tambin). Lo que nosotros vemos de este objeto es la superficie en la que esa intensidad es igual a un determinado valor. Por supuesto, podemos tener un solo componente en una burbuja, pero su aspecto es idntico a una esfera (o a un cilindro, si sa es la forma del campo). La verdadera belleza de este objeto es la forma en la que unos componentes interactan con los otros. Tomemos un ejemplo simple de burbuja para empezar. Para simplificar este primer ejemplo, slo usaremos componentes esfricos. Escribamos el siguiente cdigo, compuesto de una cmara sencilla, luz, y una burbuja con slo dos componentes. Esta escena se llama BLOBDEM1.POV:
#include "colors.inc" camera { angle 15 location <0,2,-10> look_at <0,0,0> } light_source { <10, 20, -10> color White } blob { threshold .65 sphere { <.5,0,0>, .8, 1 pigment {Blue} } sphere { <-.5,0,0>,.8, 1 pigment {Pink} } } finish { phong 1 }

4. TUTORIAL PARA PRINCIPIANTES

38

Figura 3: Una sencilla burbuja con dos componentes El umbral (threshold) es simplemente la intensidad en la que nuestro objeto se vuelve visible. Cualquier punto visible de la superficie del objeto rene exactamente esa cantidad de intensidad, a partir de la suma o la diferencia de las diferentes componentes. Aquellos en los que la intensidad es menor estn fuera del objeto, y los que tienen una intensidad mayor se encuentran en el interior. Observemos que el componente esfrico parece una esfera. De hecho, indicamos su centro y su radio. Pero qu es el ltimo valor numrico? Es la intensidad de ese componente, el valor que alcanza en su centro. Decae siguiendo una progresin lineal hasta alcanzar el valor cero exactamente a una distancia igual al radio de la esfera. Antes de trazar esta imagen, observemos que le hemos dado a cada componente una pigmentacin distinta. POV-Ray permite que los componentes tengan distintas texturas. Hemos hecho esto para dejar claro cul es cada componente en la imagen. Tambin podemos aplicar texturas al final, lo que afectar a todos los componentes, como el acabado indicado en el ejemplo, fuera de ambas esferas. Cuando tracemos la imagen, encontraremos una burbuja tpica formada por dos esferas unidas. La imagen que vemos muestra una esfera en cada lado, pero estn suavemente unidas por una seccin puente en el centro. Este puente representa dnde los campos se solapan, por lo que su intensidad aumenta con respecto a lo que valdra si slo hubiese un componente. Por si esto no est totalmente claro, aadiremos dos objetos ms y la trazaremos de nuevo (archivo BLOBDEM2.POV). Observa que las dos nuevas esferas se introducen como un objeto a parte, no como componentes de la burbuja.
sphere { <.5,0,0>, .8 pigment { Yellow transmit .75 } } sphere { <-.5,0,0>, .8 pigment { Green transmit .75 } }

PERSISTENCE OF VISION RAYTRACER

39

Figura 4: Las componentes esfricas se hacen visibles Ahora el secreto de las dos esferas unidas se pone de manifiesto. Estas esferas semitransparentes muestran dnde estn realmente las componentes de la burbuja. Si no hemos trabajado nunca con este tipo de objetos quiz nos sorprenda que las esferas se extiendan mucho ms all de donde vemos nosotros realmente los componentes. Esto es debido a que lo que muestran las superficies de las esferas es dnde la fuerza de los campos llega a cero, mientras que la burbuja marca dnde esta intensidad es igual a 0.65. El resto de la esfera es exterior a la burbuja y, por tanto, no es visible. Ves dnde se solapan ambas esferas? Observa que se corresponde precisamente con el "puente" entre las dos esferas. Esta es la regin donde la intensidad de ambos componentes est contribuyendo a la intensidad total, por lo que el puente aparece as: una regin en la que la intensidad supera el valor de umbral (0.65), debido a que se combina la de las dos esferas. 4.4.2.1. Tipos de componentes y otras caractersticas nuevas.

La forma mostrada hasta ahora es interesante, pero limitada. POV-Ray tiene unos cuantos trucos ms que extiende su utilidad. Por ejemplo, como hemos visto, podemos asignar valores de textura individualmente a cada componente, podemos aplicar transformaciones individuales (traslacin, rotacin y escalado) para modificar cada parte como deseemos. Y, lo que quiz es ms interesante, el cdigo de las burbujas se ha extendido a componentes cilndricas. Antes de empezar con los cilindros, deberamos mencionar que la forma clsica de enunciar las componentes de anteriores versiones de POV-Ray an sirve. Entonces, todas las componentes eran esfricas, de forma que no era necesario citar su forma. La forma clsica tiene el siguiente aspecto:
component intensidad, radio,

Esto tiene el mismo efecto que un componente esfrico, como los que hemos mostrado antes. Esto slo se mantiene por compatibilidad. Si tenemos archivos de POV-Ray de anteriores versiones, lo necesitaremos para que reconozca las componentes. Observa que el estilo clsico no pone llaves encerrando la intensidad, el radio y el centro, y, por supuesto, no podemos aplicarles individualmente texturas o transformaciones. De manera que si ests modificando un trabajo antiguo, tal vez sea interesante cambiar la sintaxis a la actual para conseguir algunas ventajas.

4. TUTORIAL PARA PRINCIPIANTES

40

Ahora intentemos crear algo con las componentes cilndricas. Se podra argumentar que podramos hacer un cilindro con una burbuja, usando algunas componentes esfricas alineadas. Esto es cierto, pero sera delicado calcular el valor de los centros, y deberamos teclear mucho ms. Sustituye la burbuja del ltimo ejemplo con lo siguiente y trzalo. Podemos borrar las esferas transparentes tambin.
blob { threshold .65 cylinder { <-.75,-.75,0>, <.75,.75,0>, .5, 1 } pigment { Blue } finish { phong 1 }

Tenemos slo un componente cilndrico para que veamos el aspecto que tiene aislado. No es realmente un cilindro, pues acaba en dos semiesferas. Podemos pensar en l como una esfera alargada en cierta direccin. En cuanto a la sintaxis, es lo que podamos esperar: el cilindro est descrito como los cilindros anteriormente vistos: dos vectores que indican los centros de sus bases y un valor que indica el radio. El otro nmero, por supuesto, indica la intensidad del campo en el centro del cilindro. Este valor indica cmo interacta con otras componentes, si tiene alguna con la que interactuar. 4.4.2.2. Construcciones complejas con burbujas e intensidad negativa.
BLOBDEM3.POV,

Iniciemos un archivo POV nuevo, llamado complejo:


#include "colors.inc" camera { angle 20 location<0,2,-10> look_at<0,0,0> }

escribiendo este ejemplo algo ms

light_source { <10, 20, -10> color White } blob { threshold .65 sphere sphere sphere sphere sphere sphere { { { { { { <-.23,-.32,0>,.43, 1 scale <1.95,1.05,.8> } <+.12,-.41,0>,.43, 1 scale <1.95,1.075,.8> } <-.23,-.63,0>, .45, .75 scale <1.78, 1.3,1> } <+.19,-.63,0>, .45, .75 scale <1.78, 1.3,1> } <-.22,-.73,0>, .45, .85 scale <1.4, 1.25,1> } <+.19,-.73,0>, .45, .85 scale <1.4, 1.25,1> } //palma //palma //centro de la mano //centro de la mano //extremo //extremo //meique (bajo) //meique (alto) //anular (bajo) //anular (alto) //medio (bajo) //medio (alto) //ndice (medio) //ndice (alto) //pulgar (bajo)

cylinder { <-.65,-.28,0>, <-.65,.28,-.05>, .26, 1 } cylinder { <-.65,.28,-.05>, <-.65, .68,-.2>, .26, 1 } cylinder { <-.3,-.28,0>, <-.3,.44,-.05>, .26, 1 } cylinder { <-.3,.44,-.05>, <-.3, .9,-.2>, .26, 1 } cylinder { <.05,-.28,0>, <.05, .49,-.05>, .26, 1 } cylinder { <.05,.49,-.05>, <.05, .95,-.2>, .26, 1 } cylinder { <.4,-.4,0>, <.4, .512, -.05>, .26, 1 } cylinder { <.4,.512,-.05>, <.4, .85, -.2>, .26, 1 } cylinder { <.41, -.95,0>, <.85, -.68, -.05>, .25, 1 }

PERSISTENCE OF VISION RAYTRACER


cylinder { <.85,-.68,-.05>, <1.2, -.4, -.2>, .25, 1 } } pigment { Flesh } //pulgar (alto)

41

Figura 5: Una mano hecha con burbujas Como podemos ver por los comentarios, estamos construyendo una mano. Cuando tracemos esta imagen, veremos que hay ciertos problemas con esta. La palma y la parte baja se pueden hacer ms realistas si usamos una docena de componentes pequeas en lugar de media docena de componentes grandes, y cada dedo debera tener tres segmentos en lugar de dos, pero como ejemplo nos sirve. Sin embargo, hay una cosa que realmente debemos aadir: los dedos aparecen unidos por una especie de membrana. Una revisin de lo que sabemos de las burbujas nos revela rpidamente qu sucede. Esta membrana est formada por lugares donde las componentes se solapan, por lo que la intensidad de las componentes se suma y la superficie se extiende hacia ellos. Lo que necesitamos es aadir aqu algunas componentes ms que tengan intensidad negativa y contrarresten parte de la intensidad combinada. Aadiremos las siguientes componentes a nuestro objeto (ver archivo BLOBDEM4.POV):
sphere { <-.65,.28,-.05>, .26, -1 } //anula el bulto del nudillo del meique sphere { <-.65,-.28,0>, .26, -1 } //anula el bulto de la palma junto al meique sphere { <-.3,.44,-.05>, .26, -1 } sphere { <-.3,-.28,0>, .26, -1 } anular sphere { <.05,.49,-.05>, .26, -1 } sphere { <.05,-.28,0>, .26, -1 } sphere { <.4,.512,-.05>, .26, -1 } sphere { <.4,-.4,0>, .26, -1 } ndice //anula el bulto del nudillo del anular //anula el bulto de la palma junto al //anula el bulto del nudillo del medio //anula el bulto de la palma junto al medio //anula el bulto del nudillo del ndice //anula el bulto de la palma junto al

sphere { <.85,-.68,-.05>, .25, -1 } //anula el bulto del nudillo del pulgar sphere { <.41,-.7,0>, .25, -.89 } //anula el bulto de la palma junto al pulgar

4. TUTORIAL PARA PRINCIPIANTES

42

Figura 6: La mano sin membrana Mucho mejor! La intensidad negativa de la componente esfrica acta aproximadamente en el punto medio entre los dedos, de forma que la horrible membrana ya no aparece, haciendo nuestra mano mucho ms creble. Aunque la podemos hacer an ms realista aadiendo algunas docenas de componentes adicionales, lo que hemos conseguido ya es bastante aceptable. Por ahora, ya tenemos algn ejemplo de la utilizacin de las burbujas para crear superficies orgnicas complejas.

4.4.3. Campo de alturas


Un campo de alturas es un objeto cuya superficie est determinada por el valor de color o de paleta de cada pxel de una imagen diseada para este propsito. Con estos objetos podemos simular montaas realistas y hacer fcilmente otros tipos de terreno. En primer lugar, necesitamos una imagen a partir de la cual crearemos el campo de alturas. POV-Ray es ideal para crear tal imagen. Abrimos un nuevo archivo llamado IMAGE.POV y escribimos lo siguiente:
#include "colors.inc" global_settings { assumed_gamma 2.2 hf_gray_16 }

La palabra clave hf_gray_16 hace que la salida sea codificada de un modo especial (16 bits en escala de grises) que es ideal para generar campos de alturas. Las superficies construidas con 8 bits son mucho menos suaves, ya que se trabaja con menos alturas diferentes (256 frente a 65536 de los 16 bits). Ahora situamos una cmara que apunta desde la parte negativa del eje z al origen.
camera { location <0, 0, -10> look_at 0 }

Despus, situamos un plano como un muro en z=0, que llenar totalmente la pantalla. Lo coloreamos con manchas con forma de arrugas grises sobre fondo blanco.
plane { z, 10 pigment { wrinkles

PERSISTENCE OF VISION RAYTRACER


color_map { [0 0.3*White] [1 White] }

43

Finalmente, aadiremos una luz.


light_source { <0, 20, -100> color White }

Trazamos esta escena con las opciones +h480 +w640 +a0.1 +fT. Obtendremos una imagen que producir un excelente campo de alturas. Creamos ahora un archivo llamado HFDEMO.POV y escribimos en l lo siguiente:
#include "colors.inc"

Aadimos una cmara dos unidades sobre el origen y diez unidades por detrs...
camera{ location <0, 2, -10> look_at 0 angle 30 }

... y una luz.


light_source{ <1000,1000,-1000> White }

Ahora aadimos el campo de alturas. En la sintaxis siguiente se especifica que usamos un archivo Targa, que se suaviza el cambio entre alturas, se colorea de blanco, y se traslada para centrarlo en el origen y escalarlo de forma que simule montaas y llene la pantalla.
height_field { tga "image.tga" smooth pigment { White } translate <-.5, -.5, -.5> scale <17, 1.75, 17> }

Guardamos el archivo y trazamos a 320 por 240, sin antialias (-a). Despus, si estamos satisfechos con el resultado, probaremos a crear una imagen de mayor resolucin y con antialias.

Figura 7: Un campo de alturas creado ntegramente con POVRay

4. TUTORIAL PARA PRINCIPIANTES Uao! El Himalaya en nuestro ordenador!

44

4.4.4. Objeto torneado (lathe)


Estos objetos simulan lo que podemos hacer con un torno puede hacer al cortar bordeando un patrn determinado sobre una pieza de algn material. El resultado es un artefacto elegantemente redondeado que puede ser usado en una gran diversidad de situaciones (mesas, piezas de cermica, etc.). Aqu incluimos algo de cdigo para crear una pieza torneada muy sencilla (llamada LATHDEM1.POV).
#include "colors.inc" camera { angle 10 location <1, 9, -50> look_at <0, 2, 0> } light_source { <20, 20, -20> color White } lathe { linear_spline 6, <0,0>, <1,1>, <3,2>, <2,3>, <2,4>, <0,4> pigment { Blue } finish { ambient .3 phong .75 } }

Figura 8: Un sencillo objeto torneado (lathe) Trazamos esto, y lo que veremos es un objeto muy sencillo, similar a una peonza. Veamos cmo este cdigo produce dicho efecto. Primero, se declaran seis puntos que el programa conecta con lneas. Observa que slo indicamos dos componentes en los vectores que describen esos puntos. Se asume que las lneas estn trazadas sobre el plano x-y, como si la tercera componente fuese siempre cero. Es obligatorio usar vectores de dos

PERSISTENCE OF VISION RAYTRACER

45

componentes (usar vectores de tres componentes ocasionar un error, excepto en un caso que exploraremos posteriormente, relacionado con la discusin de las curvas spline). Una vez que las lneas estn determinadas, podemos imaginar que el trazador de rayos gira esta lnea alrededor del eje y, dejando la forma del objeto al paso de la lnea (realmente, es como si cortara sobre un cilindro de material azul usando esta lnea de patrn, y descartara todo lo que queda en el exterior de sta). Los puntos especificados estn unidos por trazos rectos porque usamos la clave linear_spline. Hay otros tipos de curvas permitidas para este fin, que producen curvas ms suaves, redondeando las transiciones entre un trazo y otro, pero volveremos a hablar de ello dentro de un momento. Primero, estudiemos la diferencia entre un objeto torneado y una superficie de revolucin (sor). La superficie de revolucin, descrito en un tutorial aparte, es terriblemente similar a primera vista. Tambin declara una serie de puntos, los une mediante lneas y despus rota el resultado alrededor del eje y. El objeto torneado tiene ciertas ventajas, como diferentes tipo de trazos de unin (lineales, cuadrticos y cbicos) y algo ms. Las sencillas matemticas usadas en un SOR no permiten que la curva se doble y tome por dos veces el mismo valor de y, es decir, que todo intento de que un objeto SOR se curve hasta volver a tomar la misma altura produce un error. Por ejemplo, supongamos que queremos tornear una curva que sube de <0, 0> hasta <2, 2>, y despus baja hasta <4, 0>. Girado en torno al eje y, esto producira algo similar a un molde para gelatina (un semitoro), hundido en el centro. Sin embargo, en un SOR, el intento dar un mensaje de error debido a intentar curvarse en la direccin equivocada. Sin embargo, los objetos SOR utilizan matemtica de inferior orden, por lo que su clculo es ms rpido que el equivalente objeto torneado. De manera que es preferible usar un objeto SOR si sus limitaciones no nos afectan, pero si necesitamos tornear de una forma ms flexible, slo podemos utilizar un objeto torneado. 4.4.4.1. Entendiendo el concepto de splines

Sera til, a fin de comprender las splines, si tuviramos un ejemplo donde pudiramos practicar manipulando puntos y tipos de splines y ver cuales son los efectos. As que, hagamos uno! Ahora que sabemos como crear un torno bsico, ser fcil (ver archivo LATHDEM2.POV):
#include "colors.inc" camera { orthographic up <0, 5, 0> right <5, 0, 0> location <2.5, 2.5, -100> look_at <2.5, 2.5, 0> } /* Definir los puntos de control que sern usados */ #declare #declare #declare #declare #declare Red_Point Orange_Point Yellow_Point Green_Point Blue_Point = = = = = <1.00, 0.00, 0> <1.75, 1.00, 0> <2.50, 2.00, 0> <2.00, 3.00, 0> < 1.50, 4.00, 0> */

/* Hacer visibles los puntos de control

cylinder { Red_Point, Red_Point - 20*z, .1 pigment { Red }

4. TUTORIAL PARA PRINCIPIANTES


} finish { ambient 1 }

46

cylinder { Orange_Point, Orange_Point - 20*z, .1 pigment { Orange } finish { ambient 1 } } cylinder { Yellow_Point, Yellow_Point - 20*z, .1 pigment { Yellow } finish { ambient 1 } } cylinder { Green_Point, Green_Point - 20*z, .1 pigment { Green } finish { ambient 1 } } cylinder { Blue_Point, Blue_Point- 20*z, .1 pigment { Blue } finish { ambient 1 } } /* Algo para hacer aparecer la curva lathe { linear_spline 5, Red_Point, Orange_Point, Yellow_Point, Green_Point, Blue_Point pigment { White } finish { ambient 1 } */

Figura 9: Un simple ejemplo de spline Ahora, retomamos el aliento. Vemos que tiene una apariencia un poco rara, pero con algunas simples explicaciones, podemos ver fcilmente qu es lo que hace todo esto. En primer lugar decir que estamos usando la cmara ortogrfica. Si an no hemos ledo nada sobre ella, aqu hay un breve resumen: traza la escena plana, eliminando la distorsin de la perspectiva para que en

PERSISTENCE OF VISION RAYTRACER

47

una vista lateral, los objetos tengan la misma apariencia que si hubieran sido dibujado en un plano de papel (como en la vista lateral de un modelador o programa de CAD). Hay varios usos para este prctico nuevo tipo de cmara, pero aqu nos permitir ver nuestro torno y cilindros como si fueran una seccin transversal de la curva que forma el torno, ms que el torno en s mismo. Para reforzar el efecto hemos eliminado el sombreado con el acabado ambient 1 que, en efecto tambin elimina la necesidad de una fuente de luz. Tambin hemos posicionado esta particular vista lateral para que el punto <0, 0> aparezca en la esquina inferior izquierda de nuestra escena. A continuacin hemos declarado un conjunto de puntos. Ntese que hemos usado vectores de tres componentes para estos puntos, en lugar de los vectores de dos que solemos usar en un torno. Esta es una excepcin que ya mencionamos antes. Cuando declaramos un punto 3D y lo usamos en un torno, este solo usa las dos primeras componentes del vector y la tercera componente es ignorada. Esto es prctico aqu, ya que hace posible este ejemplo. Ahora hacemos dos cosas con los puntos declarados. Primeros los usamos para colocar cilindros de pequeo dimetro con las bases apuntando a la cmara. Entonces volvemos a usar esos mismos vectores para determinar el torno. Ya que intentar declarar vectores en 2D puede ocasionar resultados no esperados y no es lo que necesitan nuestras declaraciones de cilindros, podemos aprovechar la tendencia del torno a ignorar la tercera componente poniendo la coordenada z a 0 en los vectores en 3D. El resultado final es: cuando trazamos este cdigo, vemos un torno de color blanco contra un fondo negro mostrndonos la forma de la curva que hemos declarado y las bases circulares de los cilindros nos muestran nuestros puntos de control sobre el plano xy. En este caso, es muy simple. La spline lineal ha sido usada de forma que nuestra curva est compuesta por una serie de lneas conectando los puntos. Ahora cambiamos las declaraciones de Red_Point y Blue_Point de la siguiente forma (ver fichero LATHDEM3.POV).
#declare Red_Point = <2.00, 0.00 , 0> #declare Blue_Point = <0.00, 4.00, 0>

Figura 10: Moviendo algunos puntos de la spline Trazamos de nuevo y lo que podemos ver es que los segmentos rectos se han movido para acomodarse a las nuevas posiciones de los puntos rojo y azul. Vamos a intentar algo distinto. Primero cambiamos los puntos por estos otros (ver fichero LATHDEM4.POV).

4. TUTORIAL PARA PRINCIPIANTES


#declare #declare #declare #declare #declare Red_Point Orange_Point Yellow_Point Green_Point Blue_Point = = = = = <1.00, <2.00, <3.50, <2.00, <1.50, 0.00, 1.00, 2.00, 3.00, 4.00, 0> 0> 0> 0> 0>

48

Figura 11: La spline cuadrtica. Ahora vamos a la declaracin del torno y cambiamos linear_spline por quadratic_spline. Trazamos de nuevo y qu tenemos? Bien, esta vez hay varias cosas que comentar. Primero, vemos que, en lugar de lneas rectas, tenemos redondeados arcos conectando los puntos. Estos arcos estn formados a partir de curvas cuadrticas, de manera que ahora nuestro torno parece mucho ms interesante. Tambin vemos que el punto rojo no est conectado a la curva. Qu ha pasado? Bien, mientras que cualquier pareja de puntos puede determinar una lnea recta, se necesitan tres para determinar una curva cuadrtica. POV-Ray no solo tiene en cuenta los dos puntos a ser conectados, si no tambin el punto que los precede para determinar la frmula de la curva cuadrtica que ser usada para conectarlos. El problema est al principio de la curva. Ms all de su primer punto no hay punto previo. As que necesitamos declarar uno. Por lo tanto, cuando se usa una spline cuadrtica, debemos recordar que el primer punto que especificamos solo est all para que POV-Ray pueda determinar la curva para conectar los dos primeros puntos. No se mostrar como parte de la curva. Solo hay una cosa ms acerca de este ejemplo. A pesar de que nuestra curva est formada ahora por lneas redondeadas, las transiciones entre estas lneas son... bueno, un poco picadas. Parece que las lneas hubieran sido conectadas en los puntos de forma equivocada. Dependiendo de lo que intentemos hacer, esto puede ser aceptable, o podemos desear una forma ms redondeada. Afortunadamente tenemos otra opcin. La spline cuadrtica necesita ms tiempo de trazado que la lineal. La frmula matemtica es ms compleja. Ms tiempo necesita an la spline cbica, aunque para una figura realmente redondeada, esta es la nica opcin. Volvemos a nuestro ejemplo y reemplazamos quadratic_spline por cubic_spline (ver archivo LATHDEM5.POV). Trazamos una vez ms y vemos lo que tenemos.

PERSISTENCE OF VISION RAYTRACER

49

Figura 12: La spline cbica Mientras que una spline cuadrtica necesita tres puntos para determinar la curva, una cbica necesita cuatro. As que, como esperbamos, el punto azul ha dejado de formar parte de la curva, como antes pas con el punto rojo. Ahora el primer y el ltimo punto de la curva son solo puntos de control para determinar las curvas entre los restantes puntos. Pero echemos un vistazo a las transiciones desde el punto naranja hasta el punto amarillo y despus hasta el verde. Ahora, en lugar de parecer equivocados, los segmentos forman una sola y completamente redondeada curva. El concepto de las splines es algo til y necesario, que se volver a ver de nuevo en los objetos prisma y polgono. Con un poco de prctica podemos aprenderlo a usar rpidamente.

4.4.5. Malla de tringulos


Los objetos malla (mesh) son muy tiles, porque nos permiten crear objetos conteniendo cientos o miles de tringulos. Comparados con una simple unin de tringulos, las mallas almacenan los tringulos de manera ms eficiente. Las copias de los objetos malla necesitan muy poca memoria adicional, porque los tringulos se almacenan slo una vez. Casi todos los objetos se pueden aproximar usando tringulos, pero necesitaramos muchos tringulos para crear formas complejas. De modo que crearemos una malla muy simple como ejemplo. Este ejemplo nos mostrar adems una caracterstica muy til de las mallas de tringulos: se puede aplicar una textura diferente a cada tringulo. Comencemos. Crearemos una simple caja con caras de diferente color. Crea un archivo llamado MESHDEMO.POV y aade las siguientes lneas:
camera { location <20, 20, -50> look_at <0, 5, 0> } light_source { <50, 50, -50> color rgb<1, 1, 1> } #declare Red = texture { pigment { color rgb<0.8, 0.2, 0.2> } finish { ambient 0.2 diffuse 0.5 } }

4. TUTORIAL PARA PRINCIPIANTES


#declare Green = texture { pigment { color rgb<0.2, 0.8, 0.2> } finish { ambient 0.2 diffuse 0.5 } } #declare Blue = texture { pigment { color rgb<0.2, 0.2, 0.8> } finish { ambient 0.2 diffuse 0.5 } }

50

Debemos declarar todas las texturas que queremos incluir en la malla antes de crear sta. Las texturas no se pueden especificar dentro de la malla debido a que el rendimiento de la memoria decaera. Ahora aadimos la malla. Tres caras de la caja usarn textura individual, mientras que las otras tres usarn la textura global de la malla.
mesh { /* top side */ triangle { <-10, 10, -10>, <10, 10, -10>, <10, 10, 10> texture { Red } } triangle { <-10, 10, -10>, <-10, 10, 10>, <10, 10, 10> texture { Red } } /* bottom side */ triangle { <-10, -10, -10>, <10, -10, -10>, <10, -10, 10> } triangle { <-10, -10, -10>, <-10, -10, 10>, <10, -10, 10> } /* left side */ triangle { <-10, -10, -10>, <-10, -10, 10>, <-10, 10, 10> } triangle { <-10, -10, -10>, <-10, 10, -10>, <-10, 10, 10> } /* right side */ triangle { <10, -10, -10>, <10, -10, 10>, <10, 10, 10> texture { Green } } triangle { <10, -10, -10>, <10, 10, -10>, <10, 10, 10> texture { Green } } /* front side */ triangle { <-10, -10, -10>, <10, -10, -10>, <-10, 10, -10> texture { Blue } } triangle { <-10, 10, -10>, <10, 10, -10>, <10, -10, -10> texture { Blue } } /* back side */ triangle { <-10, -10, 10>, <10, -10, 10>, <-10, 10, 10> } triangle { <-10, 10, 10>, <10, 10, 10>, <10, -10, 10> } texture { pigment { color rgb<0.9, 0.9, 0.9> } finish { ambient 0.2 diffuse 0.7 } } }

Trazando la escena a 320x240 veremos que la cara superior, la derecha y la frontal tienen diferente textura. De acuerdo que este no es un ejemplo impresionante de lo que podemos hacer con las mallas. Puedes encontrar ejemplos ms complejos, usando tringulos suavizados, en el directorio de escenas con los nombres CHESMSH.POV y ROBOTMSH.POV.

4.4.6. Polgono
El objeto polgono se puede usar para crear formas planas de n lados, como cuadrados, rectngulos, pentgonos, hexgonos, octgonos, etc.

PERSISTENCE OF VISION RAYTRACER

51

Un polgono se define por un determinado nmero de puntos que describen su forma. Como los polgonos han de ser cerrados, el primer punto y el ltimo deben coincidir. En el siguiente ejemplo crearemos la palabra POV usando polgonos. Comenzaremos considerando los puntos que necesitamos para describir la forma deseada. Queremos que las letras se encuentren sobre el plano x-y, con la letra O en el centro. Las letras se extienden desde y=0 hasta y=1. De modo que tenemos los siguientes puntos para cada letra (la coordenada z se pone automticamente a 0).
Letra P (polgono externo): <-0.8, 0.0>, <-0.8, 1.0>, <-0.3, 1.0>, <-0.3, 0.5>, <-0.7, 0.5>, <-0.7, 0.0> Letra P (polgono interno): <-0.7, 0.6>, <-0.7, 0.9>, <-0.4, 0.9>, <-0.4, 0.6> Letra O (polgono externo): <-0.25, 0.0>, <-0.25, 1.0>, < 0.25, 1.0>, < 0.25, 0.0> Letra O (polgono interno): <-0.15, 0.1>, <-0.15, 0.9>, < 0.15, 0.9>, < 0.15, 0.1> Letra V: <0.45, <0.40, <0.70, <0.65, 0.0>, <0.30, 1.0>, 1.0>, <0.55, 0.1>, 1.0>, <0.80, 1.0>, 0.0>

Las letras P y O tienen un agujero, mientras que la letra V consiste slo en un polgono. Empezaremos por la letra V ya que es la ms fcil de definir. Creamos un archivo llamado POLYDEM.POV y aadimos el siguiente texto:
camera { orthographic location <0, 0, -10> right 1.3 * 4/3 * x up 1.3 * y look_at <0, 0.5, 0> } light_source { <25, 25, -100> color rgb 1 } polygon { 8, <0.45, <0.40, <0.70, <0.65, <0.45, } 0.0>, <0.30, 1.0>, // Letra "V" 1.0>, <0.55, 0.1>, 1.0>, <0.80, 1.0>, 0.0>, 0.0>

pigment { color rgb <1, 0, 0> }

Como ya hemos dicho el polgono ha de cerrarse aadiendo el primer punto al final de la secuencia. Un polgono cerrado siempre se define como una secuencia de puntos que termina cuando un punto es el mismo que el primero.

4. TUTORIAL PARA PRINCIPIANTES

52

Despus de crear la letra V continuaremos con la letra P. Como tiene un agujero hemos de encontrar una manera de recortar este agujero de la forma original. Esto es muy fcil. Definimos la forma externa de la letra P, que es un polgono cerrado, y aadimos la secuencia de puntos que definen el agujero, que tambin es un polgono cerrado. As tendremos un agujero en donde los dos polgonos se solapen. En general obtendremos agujeros siempre que un nmero par de subpolgonos se solapen en una nica sentencia de polgono. Un subpolgono est definido por una secuencia cerrada de puntos. La letra P consiste en dos subpolgonos, uno para la forma exterior y el otro para el agujero. Como el polgono del agujero solapa al polgono externo, tendremos un agujero. Una vez que sabemos como funcionan varios subpolgonos dentro de una nica sentencia de polgono, es bien fcil aadir la letra O. Finalmente, tenemos la palabra completa POV.
polygon { 30, <-0.8, <-0.3, <-0.7, <-0.8, 0.0>, <-0.8, 1.0>, 1.0>, <-0.3, 0.5>, 0.5>, <-0.7, 0.0>, 0.0>, // Letra "P" // forma exterior

<-0.7, 0.6>, <-0.7, 0.9>, <-0.4, 0.9>, <-0.4, 0.6>, <-0.7, 0.6> <-0.25, 0.0>, <-0.25, 1.0>, < 0.25, 1.0>, < 0.25, 0.0>, <-0.25, 0.0>, <-0.15, 0.1>, <-0.15, 0.9>, < 0.15, 0.9>, < 0.15, 0.1>, <-0.15, 0.1>, <0.45, <0.40, <0.70, <0.65, <0.45, } 0.0>, <0.30, 1.0>, 1.0>, <0.55, 0.1>, 1.0>, <0.80, 1.0>, 0.0>, 0.0>

// agujero

// Letra "O" // forma exterior // agujero

// Letra "V"

pigment { color rgb <1, 0, 0> }

PERSISTENCE OF VISION RAYTRACER

53

Figura 13: La palabra "POV" hecha con polgonos

4.4.7. Prisma
Un prisma es esencialmente un polgono o una curva cerrada barrida a lo largo de una trayectoria recta.. Podemos imaginarnos la figura como la superficie que dejara la curva al arrastrarla por el espacio. La curva o polgono que define un prisma puede estar formada por cualquier nmero de subformas, puede usar cualquiera de los tres tipos de curvas spline, y puede incluso mantener una anchura constante a lo largo del barrido o ir estrechndose lentamente hasta acabar en un punto. Pero antes de que todo esto comience a ser confuso, vamos a ir paso a paso con la forma ms simple de prisma. Tecleamos y trazamos el siguiente trozo de cdigo, (ver PRISMDM1.POV)
#include "colors.inc" camera { angle 20 location <2, 10, -30> look_at <0, 1, 0> } light_source { <20, 20, -20> color White } prism { linear_sweep linear_spline 0, // barrer la siguiente curva desde aqu ... 1, // ... hasta aqu 7, // el nmero de puntos que forman la curva ... <3,5>, <-3,5>, <-5,0>, <-3,-5>, <3, -5>, <5,0>, <3,5> } pigment { Green }

4. TUTORIAL PARA PRINCIPIANTES

54

Figura 14: Un prisma hexagonal Esto produce un hexgono, que es barrido desde y=0 hasta y=1. En otras palabras, ahora tenemos un hexgono con grosor. Un punto a tener en cuenta es que aunque esta sea una figura de seis caras, hemos usado en total siete puntos. Esto es debido a que el polgono se supone que es cerrado, lo cual hacemos que el ltimo punto coincida con el primero. Tcnicamente, con polgonos lineales, si no hacemos esto POV-Ray unira automticamente los dos extremos con una lnea para forzar el cerrado, aunque nos dara una advertencia. Sin embargo, esto slo funciona con splines lineales, as que no debemos pasar por alto estos mensajes de advertencia. 4.4.7.1. Nuevos trucos para las curvas spline

Si hemos seguido la seccin sobre splines cubierta en el tutorial del torno (ver seccin "Entendiendo el concepto de splines"), sabremos que hay dos tipos adicionales de spline a parte de la lineal: la spline cuadrtica y la cbica. Por supuesto las podemos usar con los prismas para crear una forma ms libre y redondeada. Solo hay una cosa tener en cuenta y deberamos leer esta seccin con cuidado para no acabar tirndonos de los pelos debido a misteriosos mensajes de que nos hacen falta puntos y que nos impiden renderizar el prisma. Podemos adivinar a donde nos lleva todo esto: como cerrar una spline no lineal. A diferencia de una spline lineal, que simplemente dibuja una lnea entre el primer y ltimo punto si olvidamos hacer que estos sean el mismo, las splines cuadrticas y cbicas son un poco ms exigentes. Antes que nada, recordemos que las splines cuadrticas determinan la ecuacin de la curva que conecta dos puntos cualesquiera basndose en esos dos puntos y el punto previo, de manera que el primer punto en cualquier spline cuadrtica es tan solo un punto de control y no ser parte de la curva. Lo que esto significa es: cuando construimos nuestra figura a partir de una spline cuadrtica, debemos igualar el segundo punto con el ltimo, ya que el primer punto no est sobre la curva, solo es un punto de control necesario por motivos computacionales. Igualmente, las splines cbicas necesitan que el primer y ltimo punto sea un punto de control, por lo tanto, para cerrar una figura construida a partir de una spline cbica debemos igualar el segundo punto con el penltimo. Si no igualamos los puntos correctos en una figura cuadrtica o cbica, entonces recibiremos los mensajes de error que nos idican que necesitamos ms puntos para definir el prisma.

PERSISTENCE OF VISION RAYTRACER

55

POV-Ray espera que nosotros cerremos la figura y cuando termina de procesar todos los puntos sin encontrar el cierre, se produrce un error. Confuso? Qu tal un ejemplo? Reemplazamos el prisma en nuestro ltimo fragmento de cdigo por este (ver archivo PRISMDM2.POV).
prism { cubic_spline 0, // levantar la figura desde aqui ... 1, // ... hasta aqui 6, // el numero de puntos que formaran la figura ... < 3, -5>, // point#1 (punto de control... no esta sobre la curva) < 3, 5>, // point#2 ... ESTE PUNTO ... <-5, 0>, // point#3 < 3, -5>, // point#4 < 3, 5>, // point#5 ... ES IGUAL QUE ESTE <-5, 0> // point#6 (punto de control... no esta sobre la curva) } pigment { Green }

Figura 15: Forma cbica para un prisma triangular Este simple prisma produce lo que parece un triangulo grueso con sus vrtices redondeados. Los puntos dos, tres y cuatro son los vertices del tringulo y el punto cinco cierra la figura volviendo a la posicin del punto dos. En lo que respecta a los puntos uno y seis, son nuestros puntos de control y no forman parte de la figura. Estn all para ayudar a computar que curvas sern usadas entre los otros puntos. 4.4.7.2. Transiciones suaves

Ahora fijmonos en que hemos hecho que el punto uno sea igual al punto cuatro, y el punto seis que sea igual al tres. Esto es importante. A pesar de que este prisma ya estara legalmente cerrado sin necesidad de manipular los puntos de control, las transiciones entre las curvas en cada punto no hubieran sido tan suaves. Cambiamos los puntos uno y seis a <4, 6> y <0, 7> respectivamente y renderizamos de nuevo para ver como el vertice trasero de la figura es alterado (ver archivo PRISMDM3.POV).

4. TUTORIAL PARA PRINCIPIANTES

56

Para generalizar, si queremos un cierre suave de una spline cbica, hacemos que el primer punto de control sea igual al tercero empezando por el final. Para una spline cuadrtica el truco es similar, pero, ya que solamente el primer punto es un punto de control, hay que hacer que sea igual al penltimo punto. 4.4.7.3. Mltiples subformas

Al igual que con el objeto polgono (ver seccion "4.4.6. Polgono") el objeto prisma es muy flexible, y nos permite construir un prisma a partir de varios sub-prismas. Para hacer esto, todo lo que necesitamos es seguir aadiendo puntos despus de haber cerrado la primera forma. La segunda forma puede ser simplemente aadida en otra direccin a partir de la primera, pero una de las caractersticas ms interesantes es que si cierto nmero de subformas se superponen en una regin determinada, esa regin queda vaca. Veamos otro ejemplo. Una vez ms tenemos el mismo cdigo para la cmara y la fuente de luz, pero sustituimos el prisma por este otro (ver archivo PRISMDM4.POV).
prism { linear_sweep cubic_spline 0, // barrer la figura desde aqui ... 1, // ... hasta aqui 18, // el numero de puntos que formaran la figura ... <3,-5>, <3,5>, <-5,0>, <3, -5>, <3,5>, <-5,0>, // subforma #1 <2,-4>, <2,4>, <-4,0>, <2,-4>, <2,4>, <-4,0>, // subforma #2 <1,-3>, <1,3>, <-3,0>, <1, -3>, <1,3>, <-3,0> // subforma #3 } pigment { Green }

Figura 16: Usando subformas para crear formas ms complejas Por motivos de legibilidad, hemos empezado una nueva lnea cada vez que cambiamos a la siguiente subforma, pero el trazador de rayos determina donde termina cada subforma basndose en el cierre de las figuras (como fue descrito antes). Renderizamos el nuevo prisma y vemos lo que tenemos. Es la misma y familiar forma de antes, pero ahora parece que una pequea versin de la forma haya sido extrada del centro y dentro del espacio vaco haya sido colocada otra versin todava ms pequea. Simplemente, la regin exterior est formada por la subforma #1, el agujero excavado es donde las subforma #1 y la subforma #2 se superponen. En el centro el objeto reaparece debido a que las

PERSISTENCE OF VISION RAYTRACER

57

subformas #1, #2 y #3 se superponen, devolviendo un nmero impar de piezas superpuestas. Usando esta tcnica podemos construir prismas extremadamente complejos. 4.4.7.4. Barrido cnico y el efecto de estrechamiento

En nuesto prisma original, el identificador linear_sweep es opcional. Este es el tipo de barrido asumido por defecto para un prisma si no se especifica ninguno. Pero hay otro tipo de barrido extremamente til: el barrido cnico. La idea bsica es la del prisma original, excepto que cuando estamos barriendo la forma desde la primera altura hasta la segunda, la estamos constantemente expandiendo desde un nico punto hasta que, al llegar a la segunda altura, el objeto tiene la forma que delimitan los puntos a partir de los cuales est hecho. Para dar una ligera idea de la utilidad de este efecto, reemplazamos nuestro prisma por este (ver fichero PRISMDM5.POV):
prism { conic_sweep linear_spline 0, // altura 1 1, // altura 2 5, // el numero de puntos que forman la figura... <4,4>,<-4,4>,<-4,-4>,<4,-4>,<4,4> rotate <180, 0, 0> translate <0, 1, 0> scale <1, 4, 1> pigment { gradient y scale .2 }

Figura 17: Creando una pirmide usando el barrido cnico El pigmento gradiente fue seleccionado para dar algo de definicin a nuestro objeto sin tener que fijar las fuentes de luz y el ngulo de la cmara, pero cuando lo trazamos, qu es lo que hemos creado?, Una pirmide rayada horizontalmente! Por ahora podemos reconocer la spline lineal conectando los cuatro puntos de un cuadrado y el familiar punto final que cierra la spline. Notemos todas las transformaciones en la declaracin del objeto. Esto va a necesitar una serie de explicaciones. La rotacin y la traslacin son fciles de entender. Normalmente, un barrido cnico empieza con el mximo tamao en la parte superior y se va estrechando hasta un punto en y=0, pero por supuesto esto seria al reves si estamos haciendo una pirmide. As que giramos el objeto respecto al

4. TUTORIAL PARA PRINCIPIANTES

58

eje x para colocarlo correctamente. Entonces, ya que hemos rotado respecto al vertice, trasladamos el objeto hacia arriba para ponerlo en la misma posicin en la que estaba cuando empezamos. El escalado sirve para adecuar las proporciones a este ejemplo. La base mide ocho unidades por ocho unidades, pero la altura (desde y=1 hasta y=0) es solode una unidad, as que la estiramos un poco. Llegados a este punto, probablemente estaremos pensando, Por que no simplemente hacer el barrido desde y=0 hasta y=4 y evitar este escalado? Este es un error frecuente con los barridos cnicos. Para ver lo que est mal, pongmoslo en prctica (ver archivo PRISMDM6.POV). Debemos asegurarnos de quitar el escalado y reemplazar la siguiente lnea
1, // altura 2

por
4, // altura 2

Esto sita la segunda altura a y=4, as que rendericemos de nuevo y veamos si el efecto es el mismo.

Figura 18: Escogiendo una segunda altura mayor que uno para el barrido cnico Vaya... La altura es correcta, pero la base de nuestra pirmide es enorme. Qu es lo que ha ido mal? Simple, la base, tal como la hemos descrito con los puntos que hemos usado, est situada en y=1 sin importar donde hayamos situado la segunda altura. Pero si definimos la segunda altura mayor que uno, una vez que el barrido ha pasado por y=1, continua expandiendo el objeto a lo largo de las mismas lneas que ha seguido hasta la base original, haciendo que la nueva base sea cada vez ms grande. Para evitar perder el control de un prisma construido a partir de un barrido cnico, es mejor dejar la segunda altura en y=1 y hacer un escalado para ajustar la altura desde su tamao unitario. De esta forma siempre podremos estar seguros de que las esquinas de la base permanecen donde creemos que deben estar. Esto nos lleva a otro punto interesante acerca de los barridos cnicos. Qu pasa si, por alguna razn, no queremos que el estrechamiento llegue a un nico punto? Qu pasa si en lugar de una pirmide completa, lo que queremos es algo mas parecido a un zigurat escalonado? Nada ms fcil. Despus de poner la segunda altura otra vez a uno y poner de nuevo el escalado, cambiamos la siguiente lnea
0, // altura 1

PERSISTENCE OF VISION RAYTRACER por


0.9, // altura 1

59

Figura 19: Incrementando la primera altura para el barrido cnico Cuando trazamos de nuevo, vemos que el barrido termina poco antes de llegar al vrtice, mostrndonos una pirmide sin punta. La altura a la que es cortada la pirmide depende de lo cerca que est la primera altura de la segunda.

4.4.8. Elipsoide supercudrico


A veces queremos utilizar un objeto similar a una caja cuyos bordes no son rectos, si no redondeados (suavizados). Este objeto es muy til para ese fin. Se describe mediante la sintaxis:
superellipsoid { <r, n> }

Donde r y n son valores decimales entre cero y uno. Probemos alguno para ver que tipo de formas producen. Abrimos un archivo llamado SUPELLPS.POV y escribimos lo siguiente:
#include "colors.inc" camera { location <10, 5, -20> look_at 0 angle 15 } background { color rgb <.5, .5, .5> } light_source { <10, 50, -100> White }

El color de fondo gris hace ms sencillo ver nuestro objeto. Ahora escribimos:
superellipsoid { <.25, .25> pigment { Red } }

Guardamos el archivo y lo trazamos a tamao 200x150. Parece una caja, pero sus bordes estn redondeados. Ahora experimentemos diferentes valores para r y n. Para la siguiente prueba, intenta <1, 0.2>. La forma parece un cilindro, aunque los bordes de las caras estn redondeados.

4. TUTORIAL PARA PRINCIPIANTES Intentmoslo ahora con <0.1, 1>. Es difcil describir esta figura, pero es interesante. Finalmente, probemos <1, 1>. Bueno, esto es ms familiar... una esfera!

60

Debemos tener en cuenta algunas cosas para usar los superelipsoides. En primer lugar, no debemos usar el valor cero para ninguno de los dos parmetros. Esto causara el dibujo de una caja negra en lugar de nuestra figura. En segundo lugar, valores muy prximos a cero de r y n producen resultados muy extraos, as que es conveniente evitarlos. Finalmente, el mtodo Sturm para resolver ecuaciones no funcionar con estas figuras. Los superelipsoides son objetos finitos, de forma que responden bien al encapsulado automtico (mtodo que permite acelerar el clculo de imgenes, evitando la necesidad de usar la instruccin bounded_by). Pueden usarse bien en composicin de objetos (CSG, uniones e interseccin). Ahora, usemos esta figura para hacer algo til en una escena. Haremos un suelo agrupando varios, usndolos como baldosas, y situaremos un puado de ellos flotando encima. Podemos empezar con el archivo anterior. Le cambiamos el nombre a TILES.POV y lo editamos para que contenga lo siguiente:
#include "colors.inc" #include "textures.inc" camera { location <10, 5, -20> look_at 0 angle 15 } background { color rgb <.5, .5, .5> } light_source{ <10, 50, -100> White }

Observa que hemos aadido #include "textures.inc" para que podamos usar texturas predefinidas. Ahora definimos el superelipsoide que usaremos de baldosa.
#declare Tile = superellipsoid { <0.5, 0.1> scale <1, .05, 1> }

Los superelipsoides miden alrededor de 2 por 2 por 2, de forma que lo escalamos para que tengan el tamao apropiado. Como queremos apilarlos juntos, hemos de tener cuidado al separarlos para que no se solapen. Elegimos un valor de 2.1 como desplazamiento con el fin de dejar un poco de espacio que se llenar con cemento. Aadamos esto:
#declare Offset = 2.1

Coloquemos una fila de baldosas. Cada una ser desplazada un mltiplo del desplazamiento escogido en la direccin del eje z (en ambos sentidos). Multiplicamos este desplazamiento por el orden que ocupa la baldosa en la fila para lograr este efecto. Unimos todos estos objetos en uno solo llamado Row, como este:
#declare object object object object object object object object object Row = union { { Tile } { Tile translate { Tile translate { Tile translate { Tile translate { Tile translate { Tile translate { Tile translate { Tile translate z*Offset } z*Offset*2 z*Offset*3 z*Offset*4 z*Offset*5 z*Offset*6 z*Offset*7 z*Offset*8

} } } } } } }

PERSISTENCE OF VISION RAYTRACER


object object object object object object object object { { { { { { { { Tile Tile Tile Tile Tile Tile Tile Tile translate translate translate translate translate translate translate translate z*Offset*9 } z*Offset*10 } -z*Offset } -z*Offset*2 } -z*Offset*3 } -z*Offset*4 } -z*Offset*5 } -z*Offset*6 }

61

Esto nos da una fila sencilla de 17 baldosas, suficiente para llenar la pantalla. Ahora debemos hacer copias de esta fila y trasladarlas con ayuda del desplazamiento (Offset) prefijado en la direccin del eje x, de la misma forma:
object object object object object object object object object object object object object object object { { { { { { { { { { { { { { { Row Row Row Row Row Row Row Row Row Row Row Row Row Row Row } translate translate translate translate translate translate translate translate translate translate translate translate translate translate x*Offset } x*Offset*2 } x*Offset*3 } x*Offset*4 } x*Offset*5 } x*Offset*6 } x*Offset*7 } -x*Offset } -x*Offset*2 } -x*Offset*3 } -x*Offset*4 } -x*Offset*5 } -x*Offset*6 } -x*Offset*7 }

Finalmente, las unimos para darles una sola textura, un mrmol blanco como pigmento y un acabado brillante con algo de reflexin.
union{ object { Row } object { Row translate x*Offset } object { Row translate x*Offset*2 } object { Row translate x*Offset*3 } object { Row translate x*Offset*4 } object { Row translate x*Offset*5 } object { Row translate x*Offset*6 } object { Row translate x*Offset*7 } object { Row translate -x*Offset } object { Row translate -x*Offset*2 } object { Row translate -x*Offset*3 } object { Row translate -x*Offset*4 } object { Row translate -x*Offset*5 } object { Row translate -x*Offset*6 } object { Row translate -x*Offset*7 } pigment { White_Marble } finish { phong 1 phong_size 50 reflection .35 } }

Ahora aadimos el cemento. Esto ser sencillamente un plano de color blanco. Incrementamos su valor de luz ambiente para que parezca ms blanco.
plane { y, 0 //esto es el cemento pigment { color White } finish { ambient .4 diffuse .7 } }

4. TUTORIAL PARA PRINCIPIANTES

62

Para completar la escena, aadimos cinco superelipsoides diferentes, cada uno de un color, de forma que floten sobre las baldosas reflejndose en ellas.
superellipsoid { <0.1, 1> pigment { Red } translate <5, 3, 0> scale .45 } superellipsoid { <1, 0.25> pigment { Blue } translate <-5, 3, 0> scale .45 } superellipsoid { <0.2, 0.6> pigment { Green } translate <0, 3, 5> scale .45 } superellipsoid { <0.25, 0.25> pigment { Yellow } translate <0, 3, -5> scale .45 } superellipsoid { <1, 1> pigment { Pink } translate y*3 scale .45 }

Trazamos la escena a 320x 200 para ver el resultado. Si estamos contentos con l, la imagen final podemos crearla a 640x480 y con antialias 0.2.

Figura 20: Objetos superelipsoides flotando sobre un suelo embaldosado

PERSISTENCE OF VISION RAYTRACER

63

4.4.9. Superficie de revolucin


Botellas, vasijas y vasos son bonitos objetos para las imgenes de trazado de rayos. Vamos a crear una copa dorada usando el objeto superficie de revolucin (objeto SOR, por sus iniciales en ingls). Empezamos pensando la forma del objeto final. Es bastante difcil obtener los puntos que describen una curva dada sin la ayuda de un programa modelador que soporte este tipo de objetos. Si tal programa est disponible podemos sacar mucho partido de l.

Figura 21: Los puntos que configuran nuestro objeto copa Usaremos la configuracin de puntos que muestra la figura anterior. Hay ocho puntos que describen la curva que ser rotada alrededor del eje y para obtener la copa. La curva se calcula usando el mtodo descrito en la seccin de referencia (ver "Superficie de Revolucin"). Es el momento de empezar con la escena. Editamos un archivo llamado SORDEMO.POV y escribimos el siguiente texto:
#include "colors.inc" #include "golds.inc" global_settings { assumed_gamma 2.2 } camera { location <10, 15, -20> look_at <0, 5, 0> angle 45 } background { color rgb<0.2, 0.4, 0.8> }

light_source { <100, 100, -100> color rgb 1 } plane { y, 0 pigment { checker color Red, color Green scale 10 } } sor {

4. TUTORIAL PARA PRINCIPIANTES


8, <0.0, -0.5>, <3.0, 0.0>, <1.0, 0.2>, <0.5, 0.4>, <0.5, 4.0>, <1.0, 5.0>, <3.0, 10.0>, <4.0, 11.0> texture { T_Gold_1B }

64

Esta escena contiene nuestra copa sobre un plano ajedrezado. Trazar la escena a una resolucin de 320x200 produce la imagen siguiente:

Figura 22: Un objeto superficie de revolucin La superficie de revolucin se describe escribiendo, en primer lugar, el nmero de puntos, seguido por los puntos en orden ascendente de altura. Cada punto determina el radio de la curva a una altura determinada. Por ejemplo, el primero de ellos le dice a POV-Ray que a una altura de -0.5 el radio es 0. Podemos observar que cada punto tiene una altura mayor que su predecesor. Si no se hace as el programa se detendr con un error.

4.4.10. Texto
Crear texto usando POV-Ray sola significar que las letras haba que construirlas usando composicin de objetos (CSG), un proceso bastante pesado, o usando una imagen en blanco y negro de las letras como campo de alturas, un mtodo que no siempre es satisfactorio. Ahora, en POV-Ray 3.0, se ha introducido un nuevo tipo de objeto que permite usar cualquier fuente de tipo True Type para crear objetos de texto. Estos objetos se pueden usar en composicin y transformarse en posicin, tamao y apariencia como cualquier otra primitiva de POV-Ray. En este tutorial haremos dos usos de este objeto. En primer lugar, colocaremos unas cuantas letras sobre un plano ajedrezado. Podemos usar cualquier fuente TTF, aunque aqu se usar slo las incluidas con POV-Ray 3.0. Creamos un archivo llamado TEXTDEMO.POV y escribimos:
#include "colors.inc"

PERSISTENCE OF VISION RAYTRACER


camera { location <0, 1, -10> look_at 0 angle 35 } light_source { <500,500,-1000> White } plane { y,0 pigment { checker Green White } }

65

Ahora, incluyamos el objeto de texto. Usaremos el archivo TIMROM.TTF con la cadena POV-RAY 3.0. De momento, haremos nuestras letras de color rojo. La sintaxis es muy sencilla. La primera cadena entrecomillada es el nombre de la fuente, la segunda es el texto que aparecer en el dibujo. Los dos nmeros decimales que las siguen son el grosor y el desplazamiento. El grosor determina el tamao del bloque sobre el que estn recortadas las letras. Los valores apropiados pueden estar entre 0.5 y 2. El desplazamiento es un valor que se aadir al valor definido por la propia fuente para separar las letras. De momento se dejar a cero.
text { ttf "timrom.ttf" "POV-RAY 3.0" 1, 0 pigment { Red } }

Al trazar esta escena a 200x150, observamos que las letras se salen por la derecha de la imagen. Esto es as porque POV-Ray sita el texto de forma que la esquina inferior izquierda delantera de la primera letra coincide con el origen. Para centrarlo debemos desplazar el texto en el sentido negativo del eje x. Pero cuanta distancia? En la documentacin vemos que la altura de las letras est entre 0.5 y 0.75 unidades. Si asumimos que la distancia entre una y otra ronda las 0.5 unidades, significa que la cadena en total tendr unas 6 unidades, de forma que trasladaremos el objeto 3 unidades en el sentido negativo del eje x.
text { ttf "timrom.ttf" "POV-RAY 3.0" 1, 0 pigment { Red } translate -3*x }

Mucho mejor. Ahora vamos a jugar un poco con los parmetros del objeto. En primer lugar, aumentaremos su grosor hasta un valor grande... pongamos 25!
text { ttf "timrom.ttf" "POV-RAY 3.0" 25, 0 pigment { Red } translate -2.25*x }

Realmente, queda un tanto extrao. Devolvamos este valor a 1 e intentemos un valor diferente para el desplazamiento. Pongamos 0.1 en lugar de 0 y volvamos a trazar. Un momento! Las letras se desplazan en ngulo! Esto no es lo que describe el manual! Parece que el valor de desplazamiento se aplica tanto en el eje x como en el eje y, en lugar de desplazarlas slo en la direccin x. Se necesita aqu un vector en lugar de un solo nmero? Probemos. Reemplazaremos 0.1 por 0.1*x y probaremos de nuevo. Ahora funciona! Las letras siguen en lnea recta, aunque un poco ms separadas de lo que lo estaban antes. Verifiquemos esta propiedad haciendo que las letras se desplacen en otra direccin. Cambiando 0.1*x por 0.1*y, observamos que las letras suben un poco al desplazarnos de izquierda a derecha, sin separarse horizontalmente ms de lo que estaban. Ahora, probemos el eje z. Reemplacemos 0.1*y por 0.1*z. Trazar esto produce una pequea desilusin: no hay tal desplazamiento, slo funciona en las direcciones x e y.

4. TUTORIAL PARA PRINCIPIANTES

66

Acabemos nuestra escena dando a las letras una textura mejor, usando un gran valor para el grosor y aadiendo un pequeo desplazamiento vertical a nuestras letras. Para obtener un mejor resultado, usaremos una esfera celeste, adornaremos un poco nuestro plano y buscaremos una situacin de la cmara mejor (trazamos la siguiente escena a 640x480 y con antialias).
#include "colors.inc" camera { location <-5,.15,-2> look_at <.3,.2,1> angle 35 } light_source { <500,500,-1000> White } plane { y,0 texture { pigment { SeaGreen } finish { reflection .35 specular 1 } normal { ripples .35 turbulence .5 scale .25 } } } text { ttf "timrom.ttf" "POV-RAY 3.0" 25, 0.1*y pigment { BrightGold } finish { reflection .25 specular 1 } translate -3*x } #include "skies.inc" sky_sphere { S_Cloud5 }

Ahora, vamos a usar un objeto de texto en una operacin CSG. Intentaremos crear un bajorrelieve en un bloque de piedra usando unas letras. Creamos un nuevo archivo llamado TEXTCSG.POV y lo editamos de la siguiente forma:
#include "colors.inc" #include "stones.inc" background { color rgb 1 } camera { location <-3, 5, -15> look_at 0 angle 25 } light_source { <500,500,-1000> White }

Ahora, creamos el bloque de piedra. Lo queremos de ocho unidades de largo para centrar en el interior nuestra frase (POV-RAY 3.0), que mide alrededor de seis unidades. Lo haremos tambin de cuatro unidades de alto y una de grueso. Como queremos evitar una coincidencia accidental entre la superficie del bloque y la del texto, usaremos una coordenada z inicial de 0.1 en lugar de 0. Finalmente, le damos una agradable textura de piedra escogida del archivo STONES.INC.
box { <-3.5, -1, 0.1>, <3.5, 1, 1> texture { T_Stone10 } }

Ahora, creamos nuestro texto. Usamos el mismo objeto que en el primer ejemplo, slo variando un poco el grosor y el desplazamiento.
text { ttf "timrom.ttf" "POV-RAY 3.0" 0.15, 0 pigment { BrightGold } finish { reflection .25 specular 1 }

PERSISTENCE OF VISION RAYTRACER


} translate -3*x

67

Recordemos que, por defecto, el texto se coloca de forma que su cara frontal se apoya en el plano x-y. Como el frontal del bloque se inicia en 0.1, resulta que nuestro texto penetra en la piedra un total de 0.05 unidades. Ahora, basta situar alrededor de ambos objetos una operacin de diferencia y tendremos nuestro objetivo:
difference { box { <-3.5, -1, 0.1>, <3.5, 1, 1> texture { T_Stone10 } } text { ttf "timrom.ttf" "POV-RAY 3.0" 0.15, 0 pigment { BrightGold } finish { reflection .25 specular 1 } translate -3*x } }

Lo trazamos a 200x150. Nos fijamos si se aprecia realmente la profundidad del texto, y su textura en oro brillante. Lo volvemos a trazar, esta vez a 640x480 y con antialias para ver el resultado ms claramente, pero seamos pacientes, porque esta imagen tardar algo de tiempo en estar lista.

Figura 23: Texto excavado en piedra

4.4.11. Toro
Podemos pensar en un toro como en un "donut" o un neumtico. Es una forma que se usa mucho en operaciones de composicin de objetos, de forma que POV-Ray ha adoptado esta forma polinmica de cuarto grado como forma primitiva. Su sintaxis es muy sencilla, as que es sencillo aprender a usarla una vez que se ha comprendido lo que significan los dos valores decimales que se deben indicar. En lugar de describirlos, creemos un objeto de este tipo y experimentemos con l. Creamos un archivo llamado TORDEMO.POV y escribimos:
#include "colors.inc" camera { location <0, .1, -25> look_at 0 angle 30

4. TUTORIAL PARA PRINCIPIANTES


} background { color Gray50 } // para hacer el toro ms visible light_source{ <300, 300, -1000> White } torus { 4, 1 // radio interno y radio externo rotate -90*x // para verlo desde arriba pigment { Green } }

68

Trazamos la escena. Bien, lo que vemos es una especie de neumtico. Cambiemos el radio interno y el externo y veamos qu pasa. Escribimos:
torus { 5, .25 // radio interno y radio externo

Esto parece un aro! Probemos lo siguiente:


torus { 3.5, 2.5 // radio interno y radio externo

Esto es... un neumtico excesivamente inflado! Con una sintaxis tan simple, no hay mucho que hacer con un toro salvo cambiarle la textura...no? Veamos... Los toros son muy tiles en composicin de formas. Hagamos un pequeo experimento. Veamos qu forma tiene la diferencia entre un toro y una caja:
difference { torus { 4, 1 rotate x*-90 // para verlo desde arriba } box { <-5, -5, -1>, <5, 0, 1> } pigment { Green } }

Interesante... medio toro. Ahora aadiremos otro al revs. Slo hay que declararlo y hacer las transformaciones necesarias para usarlo en dos posiciones distintas:
#declare Half_Torus = difference { torus { 4, 1 rotate -90*x // para verlo desde arriba } box { <-5, -5, -1>, <5, 0, 1> } pigment { Green } } #declare Flip_It_Over = 180*x #declare Torus_Translate = 8 // doble del radio mayor

Ahora, creamos la unin de dos semitoros:


union { object { Half_Torus } object { Half_Torus rotate Flip_It_Over translate Torus_Translate*x } }

Esto produce un objeto con forma de S, pero no lo podemos ver totalmente desde la posicin actual de la cmara. Aadamos unos cuantas piezas ms de ese tipo, moviendo nuestro objeto en la direccin del eje z y girndolo un poco con respecto al eje y para poder verlo algo ms. Tambin observamos que aparece un pequeo vaco donde se juntan los dos semitoros. Este defecto se debe al hecho de ver esta escena directamente desde el plano x-z (un defecto debido al tipo de clculo que hace el programa; en

PERSISTENCE OF VISION RAYTRACER

69

general, no conviene que nuestra cmara coincida con un plano de alguna de las cajas utilizadas en la imagen). Cambiaremos la coordenada y de la cmara de 0 a 0.1 para evitar este defecto.
union { object { Half_Torus } object { Half_Torus rotate Flip_It_Over translate x*Torus_Translate } object { Half_Torus translate x*Torus_Translate*2 } object { Half_Torus rotate Flip_It_Over translate x*Torus_Translate*3 } object { Half_Torus rotate Flip_It_Over translate -x*Torus_Translate } object { Half_Torus translate -x*Torus_Translate*2 } object { Half_Torus rotate Flip_It_Over translate -x*Torus_Translate*3 } object { Half_Torus translate -x*Torus_Translate*4 } rotate y*45 translate z*20 }

Al crear la imagen veremos una forma serpenteante muy curiosa. Pero queremos modelar algo ms til, que podamos encontrar en la vida real que tal una cadena? Pensemos un momento. Hay que observar que un eslabn de la cadena puede ser modelado de forma muy sencilla usando dos semitoros y dos cilindros. Creamos un nuevo archivo, en el que podemos usar los mismos fondo, cmara, luz y declaraciones de objetos que usbamos en TORDEMO.POV:
#include "colors.inc" camera { location <0, .1, -25> look_at 0 angle 30 } background { color Gray50 } light_source{ <300, 300, -1000> White } #declare Half_Torus = difference { torus { 4,1 sturm rotate x*-90 // para verlo desde arriba } box { <-5, -5, -1>, <5, 0, 1> } pigment { Green } } #declare Flip_It_Over = x*180 #declare Torus_Translate = 8

Ahora, creamos un toro completo a partir de dos semitoros:

4. TUTORIAL PARA PRINCIPIANTES


union { object { Half_Torus } object { Half_Torus rotate Flip_It_Over } }

70

Esto parece ser una forma algo artificiosa de crear un toro, pero realmente vamos a desplazar cada mitad para dejar sitio a los cilindros. Primero, declararemos los cilindros que utilizaremos:
#declare Chain_Segment = cylinder { <0, 4, 0>, <0, -4, 0>, 1 pigment { Green } }

Despus, aadiremos dos de estos cilindros a la unin de los semitoros trasladndolos de forma que queden alineados con el radio exterior de los toros a cada lado:
union { object object object object } { { { { Half_Torus } Half_Torus rotate Flip_It_Over } Chain_Segment translate x*Torus_Translate/2 } Chain_Segment translate -x*Torus_Translate/2 }

Ahora, trasladamos los semitoros en la direccin vertical para que sus extremos coincidan con los de los cilindros. La distancia coincide con la mitad de la definida como Torus_Tranlate:
union { object { Half_Torus translate y*Torus_Translate/2 } object { Half_Torus rotate Flip_It_Over translate -y*Torus_Translate/2 } object { Chain_Segment translate x*Torus_Translate/2 } object { Chain_Segment translate -x*Torus_Translate/2 } }

Trazamos el resultado y tenemos un eslabn de la cadena. Pero an no hemos acabado! Alguien ha visto una cadena de color verde? Usemos una apariencia metlica sobre ellos. En primer lugar, borremos todos los pigmentos de las declaraciones de los toros y cilindros. Despus, declaremos lo siguiente antes de la unin:
#declare Chain_Gold = texture { pigment { BrightGold } finish { ambient .1 diffuse .4 reflection .25 specular 1 metallic } }

Ahora, aadamos esta textura a la unin y nombrmosla apropiadamente:


#declare Link = union { object { Half_Torus translate y*Torus_Translate/2 } object { Half_Torus rotate Flip_It_Over translate -y*Torus_Translate/2 } object { Chain_Segment

PERSISTENCE OF VISION RAYTRACER


translate x*Torus_Translate/2 } object { Chain_Segment translate -x*Torus_Translate/2 } texture { Chain_Gold }

71

Por fin, uniremos dos eslabones. El segundo debe ser trasladado en direccin vertical de forma que su cara interior coincida con la cara interior del primer eslabn. La distancia adecuada resulta ser el doble de la distancia Torus_Translate menos dos (dos veces el radio exterior). Esto puede describirse mediante la expresin:
(Torus_Translate*2-2)*y

Declaramos la expresin como sigue:


#declare Link_Translate = (Torus_Translate*2-2)*y

En el bloque en el que situemos el objeto, usaremos este valor multiplicndolo para insertar nuevos eslabones. Ahora, rotaremos el segundo eslabn noventa grados respecto al eje vertical para que sea perpendicular al primero (como los verdaderos eslabones de una cadena). Finalmente, reduciremos el tamao de la unin a un cuarto de su tamao para poder ver el resultado completamente:
union { object { Link } object { Link translate y*Link_Translate rotate y*90 } scale .25 }

Al trazar esto, podremos ver un par de eslabones muy realistas. Si queremos hacer una cadena completa, necesitamos declarar esta unin y crear otra unin usando como pieza este par de eslabones. Quitamos el escalado de la primera declaracin para poder escalar slo el objeto definitivo:
#declare Link_Pair = union { object { Link } object { Link translate y*Link_Translate rotate y*90 } }

Ahora declaramos nuestra cadena:


#declare object object object object object object object } Chain = union { { Link_Pair} { Link_Pair translate y*Link_Translate*2 } { Link_Pair translate y*Link_Translate*4 } { Link_Pair translate y*Link_Translate*6 } { Link_Pair translate -y*Link_Translate*2 } { Link_Pair translate -y*Link_Translate*4 } { Link_Pair translate -y*Link_Translate*6 }

Y, finalmente, situamos nuestra cadena aadiendo unas transformaciones para hacerla visible en su totalidad. Estas transformaciones incluyen escalarla en un factor 1/10, trasladarla y girarla para poder ver bien todos los enlaces:
object { Chain scale .1 rotate <0, 45, -45> }

4. TUTORIAL PARA PRINCIPIANTES

72

Figura 24: El objeto toro puede usarse para crear cadenas En la imagen podemos ver una cadena dorada que cruza diagonalmente la pantalla.

4.5. Objetos CSG (Geometra Slida Constructiva)


La Geometra Slida Constructiva, CSG son sus iniciales en ingls, es una poderosa herramienta que usamos para combinar primitivas simples para crear objetos ms complejos, como se ver en las secciones siguientes.

4.5.1. Qu es CSG?
POV-Ray nos permite construir slidos complejos combinando formas primitivas de cuatro formas diferentes (realmente, slo tres). En la unin, dos o ms formas se asocian para ser utilizadas como una sola pieza. En el caso de la interseccin, slo aparece el volumen comn a todas las figuras. La diferencia, como veremos, es anloga a la interseccin, aunque no lo parezca, ya que en este caso las formas recortan su propio volumen de la que aparece en primer lugar. Y por ltimo, aunque no sea la menos importante, citaremos la fusin (merge), que es un tipo especial de unin en la que las superficies interiores a los objetos desaparecen, lo cual es especialmente til en los objetos transparentes. Trataremos estas formas de CSG en detalle en las secciones siguientes. Los objetos CSG pueden se extremadamente complejos. Pueden estar anidados profundamente (una unin puede contener varias intersecciones, y stas varias diferencias...).Los objetos CSG son (casi siempre) objetos finitos y por tanto responden al mtodo automtico de simplificacin que usa POVRay (auto-bounding) y pueden tambin ser transformados como si fuesen cualquier otra forma primitiva. A pesar de esto, en determinadas circunstancias, conviene utilizar (con moderacin) la instruccin bounded_by si creamos un CSG muy complejo.

4.5.2. Unin
Intentemos disear una unin sencilla. Crea un archivo llamado CSGDEMO.POV y escribe:
#include "colors.inc" camera { location <0, 1, -10>

PERSISTENCE OF VISION RAYTRACER


look_at 0 angle 36

73

light_source { <500, 500, -1000> White } plane { y, -1.5 pigment { checker Green White } }

Aade dos esferas, trasladando cada una de ellas en un sentido distinto del eje x 0.5 unidades. Colorearemos una roja y otra azul.
sphere { <0, 0, 0>, 1 pigment { Blue } translate -0.5*x } sphere { <0, 0, 0>, 1 pigment { Red } translate 0.5*x }

Trazamos esta unin a 200x150. Coloquemos una unin agrupando ambas esferas. Esto crear un solo objeto, unin de ambas esferas.
union{ sphere { <0, 0, 0>, 1 pigment { Blue } translate -0.5*x } sphere { <0, 0, 0>, 1 pigment { Red } translate 0.5*x } }

Si lo volvemos a trazar, no observaremos ningn cambio, pero ahora podemos dar a ambas esferas la misma textura, moverlas como si de una sola pieza se tratase, o escalarlas. Hagmoslo:
union{ sphere { <0, 0, 0>, 1 translate -0.5*x* } sphere { <0, 0, 0>, 1 translate 0.5*x } pigment { Red } scale <1, .25, 1> rotate <30, 0, 45> }

Al trazarlo ahora, observaremos que la imagen ha cambiado radicalmente. Podemos escalarla con diferentes valores, o probar sobre este objeto varias texturas distintas. Aplicar una textura a una unin en lugar de hacerlo sobre los objetos aislados tiene varias ventajas. En primer lugar, cambiar de decisin sobre la apariencia del objeto es ms si slo hemos de escribirla una vez que si debemos cambiarla en todos los objetos que compongan la figura. En segundo lugar, la escena se interpreta ms rpido, ya que slo es necesario que el ordenador la interprete una vez. En tercer lugar, ahorra memoria, ya que el programa construye un solo modelo de textura (y referencia cada objeto a este modelo). Si la aplicamos sobre varios objetos, aunque la textura sea idntica, almacena una copia por cada uno de ellos.

4. TUTORIAL PARA PRINCIPIANTES

74

4.5.3. Interseccin
Ahora usemos las mismas esferas de la seccin anterior para ilustrar el siguiente tipo de objeto CSG, la interseccin. Cambiamos la palabra "union" por "intersection", y borramos las transformaciones:
intersection { sphere { <0, 0, 0>, 1 translate -0.5*x } sphere { <0, 0, 0>, 1 translate 0.5*x } pigment { Red } }

Al trazar la escena, veremos un objeto similar a una lente, en lugar de las dos esferas. Esto sucede porque la interseccin encierra el volumen compartido por todas las formas, en este caso la figura que vemos, donde las esferas se solapan. Me gusta este objeto, de forma que lo usaremos para explicar las diferencias.

4.5.4. Diferencia
Rotemos el objeto de forma que presente su frente a la cmara.
intersection{ sphere { <0, 0, 0>, 1 translate -0.5*x } sphere { <0, 0, 0>, 1 translate 0.5*x } pigment { Red } rotate 90*y }

Ahora creemos un cilindro y situmoslo atravesando el centro de la lente.


cylinder { <0, 0, -1> <0, 0, 1>, .35 pigment { Blue } }

Trazamos la esfera para ver la posicin del cilindro. Despus incluiremos la lente y el cilindro en el interior de un bloque diferencia, como sigue:
difference { intersection { sphere { <0, 0, 0>, 1 translate -0.5*x } sphere { <0, 0, 0>, 1 translate 0.5*x } pigment { Red } rotate 90*y } cylinder { <0, 0, -1> <0, 0, 1>, .35 pigment { Blue } } }

Al trazar de nuevo la escena, veremos el objeto con forma de lente con un hoyo cortado limpiamente en su centro. El cilindro ha sido sustrado de la interseccin. Observa que el color del cilindro hace que el interior del cilindro aparezca de color azul. Si lo eliminamos, toda su superficie se ver roja.

PERSISTENCE OF VISION RAYTRACER

75

En realidad, la diferencia no es un objeto diferente, es idntica a la interseccin, slo que todos los objetos excepto el primero llevan la clave inverse, que hace que cambien de nombre su interior y su interior. Es decir, que lo anterior tambin podra haberse escrito como:
intersection{ sphere { <0, 0, 0>, 1 translate -0.5*x } sphere { <0, 0, 0>, 1 translate 0.5*x } pigment { Red } rotate 90*y cylinder { <0, 0, -1> <0, 0, 1>, .35 inverse pigment { Blue } } }

Bueno, hagamos algo mejor: declaremos nuestra lente perforada de forma que podamos ponerle un nombre. Antes, habremos eliminado todas las texturas de su interior, ya que las utilizaremos en su ubicacin definitiva.
#declare Lens_With_Hole intersection { sphere { <0, 0, 0>, translate -0.5*x } sphere { <0, 0, 0>, translate 0.5*x } rotate 90*y } cylinder { <0, 0, -1> } = difference { 1 1

<0, 0, 1>, .35 }

Ahora usaremos una unin para construir una figura compuesta de copias de este objeto:
union { object { Lens_With_Hole object { Lens_With_Hole object { Lens_With_Hole object { Lens_With_Hole pigment { Red } } translate translate translate translate <-.65, .65, 0> } <.65, .65, 0> } <-.65, -.65, 0> } <.65, -.65, 0> }

Trazamos la escena. Un objeto interesante no? Pero intentemos algo ms. Hagamos las lentes parcialmente transparentes aadindoles algo de filtro al pigmento de la unin:
union { object { Lens_With_Hole object { Lens_With_Hole object { Lens_With_Hole object { Lens_With_Hole pigment { Red filter .5 } translate translate translate translate } <-.65, .65, 0> } <.65, .65, 0> } <-.65, -.65, 0> } <.65, -.65, 0> }

Trazamos de nuevo la imagen. Est bien, salvo que... podemos ver trozos de los objetos lente dentro de otros. Esto no est tan bien.

4.5.5. Fusin
Esto nos lleva al cuarto tipo de construccin CSG. la fusin. Es muy similar a la unin, salvo que las superficies de los objetos que deben estar dentro de otro de la unin no se trazan, es decir, desaparecen. Esto eliminar el problema al que hemos hecho alusin antes. Probmoslo:

4. TUTORIAL PARA PRINCIPIANTES


merge { object { Lens_With_Hole object { Lens_With_Hole object { Lens_With_Hole object { Lens_With_Hole pigment { Red filter .5 } translate translate translate translate } <-.65, .65, 0> } <.65, .65, 0> } <-.65, -.65, 0> } <.65, -.65, 0> }

76

Desde luego que lo hace!

4.5.6. Observaciones sobre los objetos CSG


Hay algunos detalles sobre los objetos CSG contra los que debemos de estar prevenidos. 4.5.6.1. Coincidencia de superficies

POV-Ray utiliza pruebas numricas en cada punto para determinar si se encuentra en el interior o en el exterior de un objeto. Un problema muy frecuente es que este punto se encuentre exactamente en la superficie de dos objetos, ya que el error numrico puede situar el punto en el interior o en el exterior de ambos objetos, y no hay manera numrica de saber con seguridad a que superficie pertenece con exactitud, para darle una textura, o para determinar su invisibilidad (por ejemplo, si pertenece a una fusin, o a la parte eliminada por una interseccin). Veamos qu sucede cuando usamos un cilindro para abrir un agujero en una caja ms grande:
difference { box { -1, 1 pigment { Red } } cylinder { -z, z, 0.5 pigment { Green } } }

Al trazarlo, veremos una nube de puntos rojos donde el agujero debera estar, provocados por la coincidencia de la base del cilindro y el frontal de la caja. A veces, un rayo de luz impacta primero en la superficie del cilindro, decidiendo que debe pasar a travs de ella. En otras ocasiones, es alcanzada antes la superficie de la caja, rebotando en ella. Esto produce un mal resultado, y causa la aparicin de la nube de puntos. Este problema se puede remediar aumentando un poco la longitud del cilindro, evitando as la coincidencia de superficies:
difference { box { -1, 1 pigment { Red } } cylinder { -1.001*z, 1.001*z, 0.5 pigment { Green } } }

En general, debemos hacer el objeto que restamos algo ms grande en una diferencia para evitar coincidencias. Un problema similar ocurre con las intersecciones (que, como hemos comentado, son muy similares a las diferencias, con las fusiones (especialmente, ya que su objetivo es eliminar las superficies interiores, y, cuando coinciden, ambas pueden ser consideradas interiores a la otra) e incluso, aunque con menos frecuencia, con uniones en las que ambas superficies usan distinta textura. Habitualmente todos los casos tienen una sencilla solucin, que consiste en agrandar algo alguno de los objetos implicados.

4.6. Las fuentes de luz.


En cualquier escena de trazado de rayos, la luz necesaria para iluminar nuestros objetos y superficies debe provenir de una fuente de luz. Hay muchos tipos de fuentes de luz disponibles en POV-Ray y el

PERSISTENCE OF VISION RAYTRACER

77

uso adecuado del tipo correcto puede dar lugar a resultados muy impresionantes. Tommonos un momento para explorar algunos de los diferentes tipos de fuentes de luz y sus diferentes parmetros.

4.6.1. La fuente de luz ambiente.


La fuente de luz ambiente es usada para simular el efecto de la reflexin interdifusa. Si no hubiera reflexin interdifusa todas las reas no iluminadas directamente por una fuente de luz seran completamente oscuras. POV-Ray utiliza la palabra clave ambient para determinar que cantidad de luz proveniente de la fuente de luz es reflejada por una superficie. Por defecto la fuente de luz, la cual emite su luz en todas partes y en todas direcciones, y es blanca pura (rgb <1, 1, 1>). El cambio de color puede ser utilizado para crear efectos interesantes. Lo primero de todo el nivel de luz global de la escena puede ser ajustado fcilmente. En lugar de cambiar todos los valores ambient en cada finish, slo la fuente de luz ambiente es modificada. Asignando diferentes colores nosotros podemos crear bonitos efectos como una caprichosa luz de ambiente rojiza. Para ms detalles sobre la fuente de luz ambiente vase "Luz de Ambiente". He aqu un ejemplo de una fuente de luz ambiente roja.
global_settings { ambient_light rgb<1, 0, 0> }

4.6.2. La fuente de luz puntual.


Las luces puntuales son exactamente lo que su nombre indica. Un punto de luz no tiene tamao, es invisible e ilumina todo en la escena por igual independientemente de la distancia a la fuente de luz (este comportamiento puede ser modificado). Esta es la forma ms simple y bsica de fuente de luz. Hay slo dos parmetros importantes, location y color. Diseemos una escena simple y coloquemos una fuente de luz puntual en ella. Creamos un fichero nuevo con nombre LITEDEMO.POV. Lo editamos como sigue:
#include "colors.inc" #include "textures.inc" camera { location look_at angle 48 } <-4, 3, -9> <0, 0, 0>

Aadimos los siguientes objetos simples:


plane { y, -1 texture { pigment { checker color rgb<0.5, 0, 0> color rgb<0, 0.5, 0.5> } finish { diffuse 0.4 ambient 0.2 phong 1 phong_size 100 reflection 0.25 } } } torus { 1.5, 0.5

4. TUTORIAL PARA PRINCIPIANTES


texture { Brown_Agate } rotate <90, 160, 0> translate <-1, 1, 3>

78

box { <-1, -1, -1>, <1, 1, 1> texture { DMFLightOak } translate <2, 0, 2.3> } cone { <0,1,0>, 0, <0,0,0>, 1 texture { PinkAlabaster } scale <1, 3, 1> translate <-2, -1, -1> } sphere { <0,0,0>,1 texture { Sapphire_Agate } translate <1.5, 0, -2> }

Ahora aadimos una fuente de luz puntual:


light_source { <2, 10, -3> color White }

Trazamos esto a "200x150 -A" y vemos que los objetos son claramente visibles y con sombras pronunciadas. Los lados de objetos curvados prximos a la fuente de luz son de color brillante y las reas que estn en el lado opuesto a la fuente de luz son ms oscuras. Tambin apreciamos que el plano ajedrezado est iluminado incluso en todo el horizonte. Esto nos permite ver el plano, pero no es muy realista.

4.6.3. La fuente de luz cnica (focos).


Los focos son un tipo de fuente de luz muy til. Pueden ser usados para aadir brillos y caractersticas de iluminacin del mismo modo que un fotgrafo utiliza los focos. Hay algunos parmetros ms para luces focales que para luces puntuales. Estos son radius, falloff, tightness y point_at. El parmetro radius es el ngulo del cono completamente iluminado. El parmetro falloff es el ngulo del cono de sombra donde la luz se desvanece hacia la oscuridad. El parmetro tightness determina la proporcin de la luz que se desvanece. El parmetro point_at es, como su nombre dice, la posicin hacia la que la fuente de luz est apuntando. Cambiemos la fuente de luz en nuestra escena como sigue:
light_source { <0, 10, -3> color White spotlight radius 15 falloff 20 tightness 10 point_at <0, 0, 0> }

Trazamos esto a "200x150 -A" y vemos que solamente los objetos estn iluminados. El resto del plano y las porciones exteriores de los objetos no estn ahora iluminados. Hay una rea amplia de desvanecimiento pero las sombras son todava muy marcadas. Intentemos jugar con alguno de estos parmetros para ver qu ocurre. Modificamos el valor de falloff a 16 (debe ser siempre mayor que el valor del radio) y trazamos de nuevo. Ahora el desvanecimiento es muy estrecho y los objetos estn iluminados brillantemente o en total oscuridad. Ahora volvemos a establecer el valor de falloff en 20 y cambiamos el valor de tightness a 100 (cuanto ms alto ms cerrado) y trazamos otra vez. La luz

PERSISTENCE OF VISION RAYTRACER

79

focal parece haberse hecho mucho ms pequea, pero lo que realmente ha sucedido es que el falloff ha llegado a ser tan exagerado que el radio actual aparece mucho ms pequeo. Decidimos que un valor de tightness de 10 (el valor por defecto) y un valor de falloff de 18 son los mejores para esta luz focal y ahora pondremos algunas luces ms alrededor de la escena para conseguir efectos. Coloquemos un foco azul ligeramente ms estrecho y uno rojo adems del blanco que ya tenamos.
light_source { <10, 10, -1> color Red spotlight radius 12 falloff 14 tightness 10 point_at <2, 0, 0> } light_source { <-12, 10, -1> color Blue spotlight radius 12 falloff 14 tightness 10 point_at <-2, 0, 0> }

Trazando esto veremos que la escena ahora tiene un aire maravillosamente misterioso. Las tres luces focales convergen sobre los objetos hacindolos azules en un lado y rojos en el otro, con suficiente blanco en el medio para proporcionar un equilibrio.

4.6.4. La fuente de luz cilndrica.


Las luces focales tiene forma de cono, lo que quiere decir que su efecto cambia con la distancia. Cuanto ms lejos de la fuente de luz est un objeto, ms grande ser el radio aparente. Pero podemos querer que radius y falloff sean de un tamao particular independientemente de la distancia a la luz focal. Por esta razn, son necesarias las fuentes de luz cilndricas. Una fuente de luz cilndrica es prcticamente como una luz focal, excepto por que las regiones de radius y falloff son las mismas, independientemente de la distancia a la que se encuentra nuestro objeto de la fuente de luz. La forma es, por tanto, un cilindro en lugar de un cono. Podemos especificar una fuente de luz cilndrica reemplazando la palabra reservada spotlight por cylinder. Probemos ahora esto en nuestra escena reemplazando las tres luces focales por luces cilndricas y tracemos de nuevo. Veremos que la escena es ms suavizada. Esto es debido a que las restricciones cilndricas no permiten que la luz se extienda como la de una luz focal. Son necesarios valores mayores de radius y falloff para hacer el trabajo. Probemos un radius de 20 y un falloff de 30 para las tres luces.

4.6.5. La fuente de luz extendida.


Hasta aqu todas nuestras fuentes de luz han tenido una cosa en comn: producan sombras pronunciadas. Esto es debido a que la fuente de luz actual es un punto que es infinitamente pequeo. Los objetos estn o directamente expuestos a la luz, en cuyo caso estn completamente iluminados, o no lo estn, en cuyo caso estn completamente en la sombra. En la vida real, este tipo de situacin con sombra y luz extrema existe nicamente en el espacio exterior, donde la luz directa del sol penetra en la oscuridad total del espacio. Pero aqu en la Tierra, la luz se curva alrededor de los objetos, rebota en ellos y normalmente la fuente tiene alguna dimensin, lo que significa que puede estar parcialmente oculta a la vista (las sombras ya no sern bruscas). Esto es conocido como penumbra, un rea

4. TUTORIAL PARA PRINCIPIANTES

80

intermedia donde no hay ni luz total ni oscuridad. Para simular esta suave sombra, un trazador de rayos debe dar a sus fuentes de luz dimensin. POV-Ray lleva a cabo esto con una caracterstica conocida como luz extendida3. Las luces extendidas tienen dimensiones en dos ejes. Estos estn especificados por los dos primeros vectores en la sintaxis de superficie. Debemos tambin especificar cuntas luces hay en el array. Cuantas ms coloquemos, las sombras sern ms suaves, pero nos llevar ms tiempo de trazado. Normalmente un array de 3x3 5x5 ser suficiente. Tambin tenemos la posibilidad de especificar un valor de adaptacin. La palabra reservada adaptive le dice al trazador de rayos que puede adaptarse a la situacin y enviar slo los rayos necesarios para determinar el valor del pixel. Si no se usa adaptive se enviar un rayo por cada luz en la luz de superficie. Esto puede realmente ralentizar el proceso. Cuanto ms alto sea el valor de adaptive, ms suave ser la penumbra, pero ms tiempo emplear el trazado. Normalmente un valor adaptive de 1 es suficiente. Finalmente, es probable que debamos usar la palabra reservada jitter. sta le dice al trazador que mueva ligeramente la posicin de cada luz en la fuente extendida, de forma que las sombras aparezcan realmente suaves en lugar de darnos una penumbra formada por franjas de sombras cada vez ms claras. Probmoslo. Comentamos las luces cilndricas y aadimos lo siguiente:
light_source { <2, 10, -3> color White area_light <5, 0, 0>, <0, 0, 5>, 5, 5 adaptive 1 jitter }

Esta es una luz de superficie blanca centrada en <2, 10, -3>. Tiene un tamao de 5 unidades (a lo largo del eje x) por 5 unidades (a lo largo del eje z) y tiene 25 (5x5) luces. Hemos especificado un valor adaptive de 1 y jitter. Trazamos esto a 200x150 -A. Despus de hacer esto, apreciamos dos cosas. El trazado se hace un poco ms largo que con una fuente de luz puntual o focal y las sombras no son tan marcadas. Todo tiene una bonita y suave penumbra a su alrededor. Pero esto se puede mejorar. Las luces puntuales y cilndricas pueden tambin ser luces extendidas! Recuerdas esas sombras marcadas originadas por las luces puntuales de nuestra escena? No tendra mucho sentido usar un array de 5x5 para una luz puntual, pero un array ms pequeo podra hacer un buen trabajo y proporcionarnos la cantidad ptima de penumbra para una luz puntual. Probmoslo. Comentamos la fuente extendida y modificamos las luces cilndricas para que sean como las siguientes:
light_source { <2, 10, -3> color White spotlight radius 15 falloff 18 tightness 10 area_light <1, 0, 0>, <0, 0, 1>, 2, 2 adaptive 1 jitter point_at <0, 0, 0> } light_source {

Son las Area Lights (N. de los T.)

PERSISTENCE OF VISION RAYTRACER


<10, 10, -1> color Red spotlight radius 12 falloff 14 tightness 10 area_light <1, 0, 0>, <0, 0, 1>, 2, 2 adaptive 1 jitter point_at <2, 0, 0>

81

light_source { <-12, 10, -1> color Blue spotlight radius 12 falloff 14 tightness 10 area_light <1, 0, 0>, <0, 0, 1>, 2, 2 adaptive 1 jitter point_at <-2, 0, 0> }

Ahora tenemos tres luces puntuales de superficie, de tamao una unidad y con cuatro (2x2) luces, tres colores diferentes, todas iluminando nuestra escena. Trazamos esto a 200x150 -A. Esto parece funcionar perfectamente. Todas nuestras sombras tienen pequeas bandas de penumbra, exactamente como cabra esperar en un objeto iluminado con luz puntual real.

4.6.6. Asignando un objeto a una fuente de luz.


Las fuentes de luz son invisibles. Son slo una posicin desde donde la luz se emite. No tienen tamao real o forma. Si queremos que nuestra fuente de luz tenga una forma visible, podemos usar la palabra clave looks_like. Podemos especificar que nuestra fuente de luz pueda parecerse a cualquier objeto que elijamos. Cuando usamos looks_like, no_shadow se aplica automticamente al objeto. Esto se hace para evitar que el objeto bloquee cualquier iluminacin proveniente de la fuente de luz. Si queremos que ocurra un bloqueo (como en una lmpara apantallada), es ms sencillo usar una unin. Aadamos tales objetos a nuestra escena. Aqu tenemos una bombilla creada para este propsito:
#declare Lightbulb = union { merge { sphere { <0,0,0>,1 } cylinder { <0,0,1>, <0,0,0>, 1 scale <0.35, 0.35, 1.0> translate 0.5*z } texture { pigment {color rgb <1, 1, 1>} finish {ambient .8 diffuse .6} } } cylinder { <0,0,1>, <0,0,0>, 1 scale <0.4, 0.4, 0.5> texture { Brass_Texture } translate 1.5*z } rotate -90*x scale .5 }

Le aadimos la fuente de luz:


light_source {

4. TUTORIAL PARA PRINCIPIANTES


<0, 2, 0> color White looks_like { Lightbulb }

82

Trazando esto veremos que ahora una bonita bombilla con apariencia realista ilumina la escena. Sin embargo, si no especificamos un valor alto de ambient la bombilla no estar iluminada por la fuente de luz. Por otro lado, todas las sombras provienen de la bombilla como en una situacin real. Las sombras son marcadas, as que convirtamos nuestra bombilla en una luz extendida:
light_source { <0, 2, 0> color White area_light <1, 0, 0>, <0, 1, 0>, 2, 2 adaptive 1 jitter looks_like { Lightbulb } }

Apreciamos que hemos colocado esta luz de superficie en el plano xy en lugar de en el plano xz. Tambin apreciamos que la apariencia real de la bombilla no se ve afectada en ningn modo por la fuente de luz. La bombilla debe ser iluminada por alguna otra fuente de luz o, como en este caso, proporcionar un valor alto de ambient. Se pueden obtener resultados ms interesantes empleando halos (vase seccin "Halos").

4.6.7. Fuentes de luz especiales.


4.6.7.1. Empleando luces sin sombra.

A las fuentes de luz se les puede asignar la palabra clave shadowless y no sern arrojadas sombras debidas a su presencia en la escena. Algunas veces, las escenas son difciles de iluminar adecuadamente empleando las luces que hemos elegido para iluminar nuestros objetos. No es prctico ni realista aplicar un valor alto de ambient a la textura de todos los objetos de la escena. En su lugar podramos colocar un par de luces de relleno rodeando la escena. Las luces de relleno son simplemente luces de poca intensidad, con la palabra reservada shadowless, que actan para incrementar la iluminacin de otras reas de la escena que pueden estar no muy bien iluminadas. Probmoslo usando una en nuestra escena. Recuerdas las tres luces de color puntuales de superficie? Volvamos a ellas, quitmosles los comentarios y comentemos el resto de las fuentes. Aadamos lo siguiente:
light_source { <0, 20, 0> color Gray50 shadowless }

sta es una bonita luz de poca intensidad colocada 20 unidades sobre el centro de nuestra escena. Dar una ligera iluminacin a todos los objetos incluyendo el plano de la parte posterior. Tracemos y vemosla. 4.6.7.2. Usando atenuacin de la luz.

Si lo que queremos es realismo, no es muy realista que el plano est completamente iluminado hasta el horizonte. En la vida real, la luz se reparte a medida que se propaga de forma que disminuye su capacidad de iluminar los objetos segn van estando ms alejados de la fuente. Para simular esto, POVRay nos permite usar dos palabras clave: fade_distance, la cual nos permite especificar la distancia hasta la cual se alcanza la iluminacin plena, y fade_power, un valor exponencial que determina la proporcin real de atenuacin. Apliquemos estas palabras reservadas a nuestra luz de relleno.

PERSISTENCE OF VISION RAYTRACER

83

Primero hagamos nuestra luz de relleno un poco ms brillante cambiando Gray50 a Gray75. Ahora, modifiquemos la luz de relleno como sigue:
light_source { <0, 20, 0> color Gray75 fade_distance 5 fade_power 1 shadowless }

Esto significa que el valor completo de la luz de relleno alcanzar una distancia de 5 unidades desde la fuente de luz. El valor 1 de fade_power quiere decir que la atenuacin ser lineal (la luz se desvanece segn un valor constante). Tracemos para ver el resultado. Esto funciona! Probemos un valor de fade_power de 2 y un valor de fade_distance de 10. Nuevamente esto funciona bien. La atenuacin es mucho ms rpida con un valor de fade_power de 2, as que incrementemos el valor de fade_distance hasta 10. 4.6.7.3. Las fuentes de luz y la atmsfera.

Por definicin, ms que por defecto, las fuentes de luz se ven afectadas por la atmsfera, por ejemplo, su luz est siendo dispersada por la atmsfera. Esto puede ser desactivado aadiendo atmosphere off a la fuente de luz. La luz emitida por una fuente de luz tambin puede ser atenuada por la atmsfera (e incluso por la niebla), lo que significa que disminuir a medida que se propaga por ella, para lo cual aadimos atmospheric_attenuation on. La atenuacin es exponencial y depende del parmetro distance de la atmsfera (o niebla). Apreciamos que esto slo afecta a la luz que proviene directamente de una fuente de luz. La luz reflejada y refractada se ignora. Experimentemos con estas palabras reservadas. Primero aadimos una atmsfera a nuestra escena:
#include "atmos.inc" atmosphere { Atmosphere2 }

Comentemos las tres lneas que convierten cada una de las luces puntuales en luces de superficie. De otro modo el trazado se har muy largo.
//area_light <1, 0, 0>, <0, 0, 1>, 2, 2 //adaptive 1 //jitter

Generando esta escena a 200x150 -A veremos que realmente las luces puntuales son visibles. Veremos cmo el haz rojo y el azul se entrecruzan y cmo la luz superior blanca ilumina la parte inferior atravesando el centro de la escena. Tambin apreciamos que las luces puntuales parecen disminuir su intensidad a medida que la luz desciende desde la fuente de luz hacia los objetos. La luz roja inunda todo excepto en la parte baja de la izquierda de la escena y la luz azul inunda todo excepto en la parte baja de la derecha. Esto es debido a la atenuacin atmosfrica y aade ms realismo a la escena. La interaccin entre atmsfera y fuente de luz da a nuestra escena una apariencia ahumada y misteriosa, pero el trazado emplear ms tiempo. Convirtiendo estas fuentes puntuales en luces de superficie todava emplear ms tiempo. Este es el precio a pagar para obtener una imagen de calidad.

4.7. Opciones de textura simples


Las imgenes trazadas hasta ahora son aburridas en lo que respecta a la apariencia de los objetos. Aadmosle algunos divertidos efectos a la textura.

4. TUTORIAL PARA PRINCIPIANTES

84

4.7.1. Acabado de superficies.


Una de las caractersticas principales de un trazador de rayos es su capacidad para hacer cosas interesantes con el acabado de superficies, tales como brillos y reflexiones. Aadmosle un bonito y pequeo brillo (punto brillante) a la esfera. Para hacer esto necesitamos aadir la palabra reservada finish seguida por un parmetro. Cambiamos la definicin de la esfera a esto:
sphere { <0, 1, 2>, 2 texture { pigment { color Yellow } // Yellow est predefinido en colors.inc finish { phong 1 } } }

Trazamos la escena. La palabra reservada phong aade un brillo del mismo color que la luz que ilumina el objeto. Dota a la imagen de mayor credibilidad y hace que el objeto parezca ms suave y brillante. Valores menores de phong harn el brillo menos brillante (los valores deben encontrarse entre 0 y 1).

4.7.2. Aadiendo abolladuras.


Los brillos que hemos aadido ilustran como nuestra percepcin depende de las propiedades reflexivas de un objeto. El trazado de rayos puede explotar esto engaando a nuestra percepcin para hacernos ver detalles complejos donde realmente no los hay. Supongamos que queremos una superficie muy abollada sobre un objeto. Sera muy difcil modelar matemticamente esa cantidad de abolladura. Podemos, sin embargo, simular las abolladuras alterando la forma en que la luz se refleja en la superficie. Los clculos de reflexin dependen de un vector denominado normal a la superficie. Este es un vector que apunta hacia afuera de la superficie y es perpendicular a ella. Modificando artificialmente (o perturbando) este vector normal, podemos simular abolladuras. Cambiamos la escena a lo siguiente y la trazamos:
sphere { <0, 1, 2>, 2 texture { pigment { color Yellow } normal { bumps 0.4 scale 0.2 } finish { phong 1} } }

Esto informa a POV-Ray de que use un patrn de abolladura para modificar la normal a la superficie. El valor 0.4 controla la profundidad aparente de las abolladuras. Normalmente las abolladuras son de aproximadamente una unidad de ancho, lo cual no parece encajar muy bien con una esfera de radio 2. El escalado hace que las abolladuras tengan 1/5 de anchura, pero no afecta a su profundidad.

4.7.3. Creando patrones de colores.


Podemos hacer algo ms que asignar colores slidos a un objeto. Podemos crear patrones complejos en el bloque pigment como en este ejemplo:
sphere { <0, 1, 2>, 2 texture { pigment { wood color_map { [0.0 color DarkTan] [0.9 color DarkBrown] [1.0 color VeryDarkBrown] } turbulence 0.05 scale <0.2, 0.3, 1>

PERSISTENCE OF VISION RAYTRACER


} finish { phong 1 }

85

La palabra clave wood especifica un patrn de pigmento de anillos concntricos como los anillos de la madera. La palabra clave color_map especifica que el color de la madera debe mezclarse desde DarkTan a DarkBrown en el primer 90% del veteado y de DarkBrown a VeryDarkBrown sobre el restante 10%. La palabra clave turbulence agita ligeramente el patrn de forma que el veteado no sean crculos perfectos y la palabra clave scale ajusta el tamao del patrn. Muchos patrones nos vienen dados por defecto para ofrecernos esa caracterstica alrededor de una esfera de radio 1.0. Una caracterstica se puede definir burdamente como una transicin de color. Por ejemplo, una textura de madera debera tener una banda sobre una esfera de radio 1.0. En este ejemplo escalamos el patrn usando la palabra clave scale seguida por un vector. En este caso escalamos 0.2 en la direccin x, 0.3 en la direccin y, y 1 en la direccin z, lo cual lo deja inalterado. Valores de escalado mayores que 1 extendern un elemento. Valores de escalado menores que 1 encogern un elemento. Un valor de escalado de 1 dejar el elemento inalterado.

4.7.4. Texturas predefinidas.


POV-Ray tiene algunas texturas muy sofisticadas predefinidas en los ficheros de inclusin estndar: GLASS.INC, METALS.INC, STONES.INC y WOODS.INC. Algunos son texturas completas con los parmetros pigment, normal y/o finish ya definidos. Algunos son simplemente pigmentos o slo acabados. Cambiamos la definicin de nuestra esfera a lo siguiente y trazamos:
sphere { <0, 1, 2>, 2 texture { pigment { DMFWood4 // scale 4 // // } finish { Shiny } // } }

predefinida en textures.inc escalada la misma cantidad en todas las direcciones predefinida en finish.inc

El identificador de pigmento DMFWood4 ha sido ya reducido en escala suficientemente al ser definido. Para este ejemplo queremos aumentar la escala del patrn. Como queremos escalarlo uniformemente ponemos un valor simple despus de la palabra clave scale en lugar de un vector con factor de escalado x, y, z. Miremos el fichero TEXTURES.INC para ver qu pigmentos y acabados estn definidos y probmoslos. Insertemos el nombre del nuevo pigmento donde est ahora DMFWood4 o probemos un acabado diferente en lugar de Shiny y volvamos a trazar nuestro fichero. Aqu tenemos un ejemplo de un uso de identificador de textura completo en lugar de slo las piezas.
sphere { <0, 1, 2>, 2 texture { PinkAlabaster } }

4.8. Opciones avanzadas de texturas


Las amplias posibilidades para elegir la textura de un objeto es lo que realmente aparta a POV-Ray de otros programas trazadores de rayos. Hasta ahora no hemos intentado algo realmente complejo, pero ahora, que nos hemos acostumbrado a la sintaxis del programa, podemos probar algunas de las opciones ms avanzadas de textura.

4. TUTORIAL PARA PRINCIPIANTES

86

Obviamente, no podemos probarlas todas. En ese caso, nuestro tutorial an tendra ms pginas. En este tutorial slo probaremos unas cuantas de las opciones, para proporcionar una muestra de lo que puede crearse con POV-Ray. Con un poco de prctica, pronto podr el lector crear sus propias texturas.

4.8.1. Patrones de pigmentacin y de normal


Las versiones anteriores de POV-Ray distinguan entre patrones de color y patrones para la normal (es decir, entre los patrones que podan ser usados en el apartado pigment y los que podan ser usados en el apartado normal). En POV-Ray 3.0 se suprimi esta restriccin, de forma que todos los patrones listados como tales pueden ser usados como pigmentos o como normales.

4.8.2. Pigmentos
Todas las superficies deben tener un color. En POV-Ray este color se denomina pigmento. No tiene porqu ser un color uniforme. Puede ser un patrn de color, uno de los tres dibujos permitidos o una imagen extendida. Pueden colocarse diferentes capas de pigmentos, de forma que las superiores tengan partes transparentes a travs de las que se muestren las inferiores. Probemos algunas de las posibilidades de este concepto. Creamos un archivo llamado "TEXTDEMO.POV" y escribimos algo como lo siguiente:
#include "colors.inc" camera { location <1, 1, -7> look_at 0 angle 36 } light_source { <1000, 1000, -1000> White } plane { y, -1.5 pigment { checker Green, White } } sphere { <0,0,0>, 1 pigment { Red } }

Trazando esta imagen en una prueba a 200x150, vemos que se trata de una sencilla bola roja sobre un suelo a cuadros blancos y verdes. Usaremos esta esfera para probar nuestras texturas. 4.8.2.1. Usando pigmentos con lista de colores

Ya hemos utilizado en los ejemplos previos este tipo de pigmentos, en el suelo a cuadros verdes y blancos. Hay otros dos permitidos, hexgonos y ladrillos. Probemos ambos. En primer lugar cambiaremos el pigmento del plano como sigue:
pigment { hexagon Green, White, Yellow }

Esto crea un patrn hexagonal sobre el plano con tres colores. Este patrn requiere escribir los tres colores. Ahora cambiemos de nuevo el pigmento...
pigment { brick Gray75, Red rotate -90*x scale .25 }

Al mirar la imagen resultante, veremos que el plano tiene aspecto de estar construido con ladrillos rojos unidos con un cemento gris claramente visible. Observa que hemos tenido que girar este patrn para que aparezca en un plano horizontal, ya que habitualmente se usa directamente sobre superficies verticales. Podemos jugar con estos patrones, cambiar los colores usados, etc.

PERSISTENCE OF VISION RAYTRACER 4.8.2.2. Usando pigmentos y patrones

87

Cambiemos ahora la textura de nuestra esfera, usando un patrn con mapa de colores, usando para ello tres colores. Reemplazamos el bloque del pigmento con el siguiente:
pigment { gradient x color_map { [0.00 color [0.33 color [0.66 color [1.00 color } }

Red] Blue] Yellow] Red]

Veremos que se forma un interesante patrn de lneas verticales. Si utilizamos la direccin y en lugar de la x (junto a la palabra gradient), tendremos lneas horizontales. Cambiando a la direccin z, las bandas de color parecern anillos concntricos. Esto sucede porque la direccin de la variacin es la misma en la que apunta la cmara. Volvemos a poner la direccin x y aadimos lo siguiente en el bloque del pigmento.
pigment { gradient x color_map { [0.00 color [0.33 color [0.66 color [1.00 color } rotate -45*z }

Red] Blue] Yellow] Red] // <- aadimos esta lnea

Ahora, las bandas verticales aparecen inclinadas 45 grados. Todos los patrones pueden ser girados, escalados y trasladados de esta forma (sin desplazar la superficie sobre la que se aplican). Probemos diferentes tipos de patrn. Sustituiremos sucesivamente la lnea "gradient x" por la siguientes palabras clave, y trazaremos para ver el resultado: bozo, marble, agate, granite, leopard, spotted y wood (si quieres, puedes probar todos los patrones que aparecen en la seccin "Patrones"). Veremos que cada uno de ellos da lugar a una disposicin de los colores ligeramente diferente (bozo y spotted puede que resulten idnticos). Pero para obtener buenos resultados, cada tipo de patrn requiere el uso de algunos modificadores. 4.8.2.3. Usando modificadores de patrones

Echemos un vistazo a algunos de los modificadores de patrn. Primero, utilizaremos el patrn bozo, aadiendo el siguiente cambio:
pigment { bozo frequency 3 color_map { [0.00 color [0.33 color [0.66 color [1.00 color } rotate -45*z } // <- aadimos esta lnea Red] Blue] Yellow] Red]

El modificador frecuency determina el nmero de veces que se repiten los colores indicados en el mapa de colores, que por defecto es 1. En este caso, vemos ms bandas (el triple) en el patrn bozo de las que haba antes, aunque los colores que aparecen son los mismos.

4. TUTORIAL PARA PRINCIPIANTES

88

Cambiemos el patrn a marble. Al observarlo, veremos que es muy similar al gradient y, que no se parece en absoluto al mrmol, como parece sugerir su nombre. Situemos una frecuencia de 3 (frequency 3) y una turbulencia de 1 (turbulence 1) y probemos otra vez. Mucho mejor no? Prueba a cambiar el orden en el que sitas la turbulencia y la frecuencia qu sucede? La turbulencia tiene de por s unos modificadores especficos que nos permiten tener ms control sobre lo que hace. En primer lugar, el valor que sigue a la palabra turbulence puede tener decimales, e indica lo "revuelta" que quedar la textura. Valores ms altos hacen ms catico el resultado. En segundo lugar, podemos usar los modificadores omega, lambda y octaves para cambiar los parmetros internos de la turbulencia. Probemos esto ahora:
pigment { marble turbulence 0.5 lambda 1.5 omega 0.8 octaves 5 frequency 3 color_map { [0.00 color Red] [0.33 color Blue] [0.66 color Yellow] [1.00 color Red] } rotate 45*z }

Trazar esto nos permitir ver que la turbulencia ha cambiado, dando lugar a un patrn ligeramente distinto. Podemos jugar con los valores de turbulence, lambda, omega y octaves para observar lo que hacen. 4.8.2.4. Usando pigmentos transparentes y texturas superpuestas

Los colores se describen por valores numricos que indican la proporcin de rojo, verde y azul que los componen (color rgb <1,0,0> nos proporciona el color rojo). Pero esta sintaxis nos permite usar algo ms que la composicin rgb de un color. Podemos especificar transparencia (con filtro) escribiendo rgbf <1,0,0,1>. La f representa filtro, y un valor de 1 supone que la superficie ser totalmente transparente, filtrando la luz segn el color que tenga. En el caso del ejemplo, se comportar como papel celofn rojo. Hay otra clase de transparencia en POV-Ray. Se llama transmitancia o transparencia sin filtro. Su palabra clave es transmit, y difiere de la anterior en que no filtra la luz de acuerdo con el color de la superficie. Permite que la luz pase a travs sin cambios. Puede especificarse como sigue: rgbt <1,0,0,1>. Usaremos ahora colores transparentes para crear otro tipo de texturas, las texturas superpuestas. Volviendo a nuestro ejemplo anterior, declaramos la siguiente textura:
#declare LandArea = pigment { agate turbulence 1 lambda 1.5 omega .8 octaves 8 color_map { [0.00 color [0.33 color [0.86 color [1.00 color texture {

rgb rgb rgb rgb

<.5, <.1, <.6, <.5,

.25, .15>] .5, .4>] .3, .1>] .25, .15>]

PERSISTENCE OF VISION RAYTRACER


} }

89

Esta ser la textura del suelo. Ahora, crearemos lo ocanos declarando lo siguiente:
#declare OceanArea = texture { pigment { bozo turbulence .5 lambda 2 color_map { [0.00, 0.33 color rgb <0, 0, 1> color rgb <0, 0, 1>] [0.33, 0.66 color rgbf <1, 1, 1, 1> color rgbf <1, 1, 1, 1>] [0.66, 1.00 color rgb <0, 0, 1> color rgb <0, 0, 1>] } } } }

Observa que el rea transparente permitir ver la tierra, mientras que el azul opaco representar el ocano. Ahora, declaremos otra textura que represente la atmsfera, con remolinos de nubes.
#declare CloudArea = texture pigment { agate turbulence 1 lambda 2 frequency 2 color_map { [0.0 color rgbf <1, 1, [0.5 color rgbf <1, 1, [1.0 color rgbf <1, 1, } } } {

1, 1>] 1, .35>] 1, 1>]

Por fin, apliquemos estas texturas sobre nuestra esfera:


sphere { <0,0,0>, 1 texture { LandArea } texture { OceanArea } texture { CloudArea } }

Trazando esto, veremos una reconstruccin bastante buena de un pequeo planeta. Pero la capa de nubes no es muy realista. Hay formas de hacerlas mucho mejor. 4.8.2.5. Usando mapas de pigmentos

Los pigmentos pueden combinarse de la misma forma que los colores, usando los mismos patrones que hemos visto. Intentmoslo. Aadamos las siguientes declaraciones, delante de las anteriormente escritas:
#declare Clouds1 = pigment { bozo turbulence 1 color_map { [0.0 color White filter 1]

4. TUTORIAL PARA PRINCIPIANTES


[0.5 color White] [1.0 color White filter 1] }

90

} #declare Clouds2 = pigment { agate turbulence 1 color_map { [0.0 color White filter 1] [0.5 color White] [1.0 color White filter 1] } } #declare Clouds3 = pigment { marble turbulence 1 color_map { [0.0 color White filter 1] [0.5 color White] [1.0 color White filter 1] } } #declare Clouds4 = pigment { granite turbulence 1 color_map { [0.0 color White filter 1] [0.5 color White] [1.0 color White filter 1] } }

Ahora usaremos estos pigmentos en la capa de nubes de nuestro planeta. Escribamos lo siguiente en lugar de esta capa:
#declare CloudArea = texture { pigment { gradient y pigment_map { [0.00 Clouds1] [0.25 Clouds2] [0.50 Clouds3] [0.75 Clouds4] [1.00 Clouds1] } } }

Observa que ahora aparecen en el planeta unas patrones muy similares a los de nuestro planeta, ya que las nubes estn separadas en bandas, cada una de las cuales tiene una estructura diferente, simulando distintos climas a diferentes latitudes.

4.8.3. Normales
Los objetos de POV-Ray tienen superficies muy lisas. Esto no es muy real, de forma que hay varios sistemas de distorsionar la superficie, modificando su normal. La normal es el vector perpendicular a una superficie en un punto dado. La luz se refleja, o traspasa este objeto en funcin de esa normal, de forma que alterarla significa que la superficie puede aparecer abollada, ondulada, arrugada, o modificada de cualquiera de las formas disponibles. Probemos un puado de ellas.

PERSISTENCE OF VISION RAYTRACER 4.8.3.1. Usando modificadores de normal bsicos

91

De momento, marcaremos como comentario nuestro planeta en el archivo de prueba, y crearemos una nueva esfera al final de ste con una sencilla textura de un solo color:
sphere { <0,0,0>, 1 pigment { Gray75 } normal { bumps 1 scale .2 } }

Hemos aadido un bloque normal, adems del bloque pigmento (no ha de ser incluido en un bloque textura, salvo que se desee modificar ambos simultneamente, o que formen parte de una textura superpuesta). Una vez que hayamos comprobado el aspecto que tiene, substituiremos la palabra bumps por las siguientes: dents, wrinkles, ripples y waves (podemos usar cualquiera de los patrones listados en la seccin "Patrones"). Probaremos cmo queda cada uno de ellos. Podemos probar a modificar el valor numrico (decimal) que sigue a la palabra clave. Tambin podemos experimentar con el valor de escala. Como aadido interesante, cambiaremos la textura del suelo a un solo color con una normal como la que sigue:
plane { y, -1.5 pigment { color rgb <.65, .45, .35> } normal { dents .75 scale .25 } }

4.8.3.2.

Combinando normales

Las normales pueden superponerse, como los pigmentos, pero los resultados pueden ser inesperados. Probemos a modificar la textura de la esfera como sigue:
sphere { <0,0,0>, 1 pigment { Gray75 } normal { radial frequency 10 } normal { gradient y scale .2 } }

Como puedes ver, el patrn resultante no es radial o gradiente. Es el resultado de calcular el patrn radial y despus el patrn gradiente. El resultado se suma, por lo que el resultado es difcil de controlar. El programa POV-Ray ofrece a sus usuarios otras formas de combinar las normales. Una de las formas es usar mapas de normales. Un mapa de normales funciona igual que los mapas de pigmentos usados con anterioridad. Cambiemos la textura de nuestra esfera de la siguiente forma:
sphere { <0,0,0>, 1 pigment { Gray75 } normal { gradient y frequency 3 turbulence .5 normal_map { [0.00 granite] [0.25 spotted turbulence .35] [0.50 marble turbulence .5] [0.75 bozo turbulence .25] [1.00 granite] } } }

Al ver la imagen, observaremos que la esfera tiene una superficie con bultos muy irregular. El patrn gradiente separa las normales en bandas, pero la turbulencia las ha agitado, dndole un aspecto catico. Pero esto nos da una idea.

4. TUTORIAL PARA PRINCIPIANTES

92

Podemos usar el mismo patrn para un mapa de normales que el que usamos para crear los ocanos, de forma que las zonas de tierra se vean rugosas, mientras que los ocanos parezcan ms lisos. Quiere esto decir que si aplicamos el mismo patrn con los mismos modificadores en una esfera del mismo tamao obtendremos la misma forma? Probmoslo. Primero, tracemos las dos esferas, de forma que podremos ver que el patrn es realmente el mismo. Quitamos las seales de comentario a la primera esfera y realizamos los siguientes cambios.
sphere { <0,0,0>, 1 texture { LandArea } texture { OceanArea } //texture { CloudArea } translate -x }

// <-lo convertimos en comentario // <- aadimos esta transformacin

Modificamos la esfera gris de la siguiente forma:


sphere { <0,0,0>, 1 pigment { Gray75 } normal { bozo turbulence .5 lambda 2 normal_map { [0.4 dents .15 scale .01] [0.6 agate turbulence 1] [1.0 dents .15 scale .01] } } translate x // <- aadimos esta transformacin }

Ahora estamos seguros de que el patrn es el mismo. Ahora, marquemos como comentario la esfera gris y aadamos el bloque de normales a la textura del suelo del otro planeta. Quitaremos la traslacin para que vuelva a quedar centrado.
#declare LandArea = texture { pigment { agate turbulence 1 lambda 1.5 omega .8 octaves 8 color_map { [0.00 color rgb <.5, .25, .15>] [0.33 color rgb <.1, .5, .4>] [0.86 color rgb <.6, .3, .1>] [1.00 color rgb <.5, .25, .15>] } } normal { bozo turbulence .5 lambda 2 normal_map { [0.4 dents .15 scale .01] [0.6 agate turbulence 1] [1.0 dents .15 scale .01] } } }

Mirando el resultado, nos haremos una idea de como funciona la idea. Las zonas terrestres estn llenas de bultos mientras que los ocanos son lisos. Aadiendo de nuevo la capa de nubes, el planeta estar completo.

PERSISTENCE OF VISION RAYTRACER

93

Por razones de espacio, hay muchas cosas que no hemos tratado. Por ejemplo, deberas experimentar los llamados mapas de cuestas (slope maps), las medias (average) y mapas de bultos (bump maps).

4.8.4. Acabados
La parte final de una textura de POV-Ray es el acabado. Controla las propiedades de la superficie de un objeto. Puede hacer que sea brillante y reflexivo o montono y apagado. Tambin puede especificar lo que ocurre con la luz que pasa a travs de pigmentos transparentes, con la que es dispersada debido a superficies imperfectas y con la que es reflejada por superficies con delgadas pelculas que producen interferencias. Hay doce propiedades diferentes disponibles en POV-Ray para especificar el acabado de un objeto dado. Estas estn controladas por los siguientes identificadores: ambient, diffuse, brilliance, phong, specular, metallic, reflection, refraction, caustics, attenuation, crand e iridiscence. Diseemos un par de texturas que usen estos parmetros. 4.8.4.1. Usando ambient

Debido a que, en POV-Ray los objetos estn iluminados por fuentes de luz, las porciones de estos objetos que estn en la sombra seran completamente oscuras si no fuera por las dos primeras propiedades del acabado, ambient y diffuse. Ambient se usa para simular la luz dispersada por toda la escena que no viene directamente de ninguna fuente de luz. Diffuse determina que cantidad de luz proviene de fuentes directas. Estos dos identificadores trabajan juntos para controlar la simulacin de luz ambiental. Usemos nuestra esfera gris para demostrar esto. Cambiemos tambin nuestro plano a su diseo original de cuadros verdes y blancos.
plane {y,-1.5 pigment {checker Green, White} } sphere { <0,0,0>, 1 pigment {Gray75} finish { ambient .2 diffuse .6 } }

En este ejemplo se usan los valores por defecto para ambient y diffuse. Trazamos para ver cuales son los resultados y despus hacemos el siguiente cambio al acabado.
ambient 0 diffuse 0

La esfera es negra debido a que hemos especificado que la luz no sea reflejada por ella. Cambiemos ahora diffuse por su valor por defecto de 0.6. Ahora vemos la superficie gris donde la luz de la fuente incide directamente sobre la esfera, pero el lado sombreado sigue siendo absolutamente negro. Ahora cambiemos diffuse a 0.3 y ambient a 0.3. La superficie de la esfera se ha vuelto ahora ms montona. Es debido a que hemos especificado un alto grado de luz ambiental y solo una pequea cantidad de la luz proveniente de la fuente de luz es difusamente reflejada hacia la cmara. Los valores por defecto de ambient y diffuse son una media bastante buena y un buen punto de partida. En la mayora de los casos, un valor para ambient entre 0.1 y 0.2 es suficiente y un valor para diffuse entre 0.5 y 0.7 generalmente quedar bien. Hay un par de excepciones. Si tenemos una superficie completamente transparente con unos altos valores de refraccin o reflexin, usar valores bajos para ambient y diffuse es lo mejor. He aqu un ejemplo.
sphere { <0,0,0>, 1

4. TUTORIAL PARA PRINCIPIANTES


pigment { White filter 1 } finish { ambient 0 diffuse 0 reflection .25 refraction 1 ior 1.33 specular 1 roughness .001 }

94

Obviamente la esfera es de cristal. El cristal es un material que toma casi toda su apariencia de lo que le rodea. Poca parte de la superficie es vista debido a que transmite o refleja prcticamente toda la luz que brilla sobre el. Ver GLASS.INC para ms ejemplos. Si alguna vez necesitamos que un objeto est totalmente iluminado independientemente de las fuentes de luz en una escena dada, podemos hacerlo artificialmente especificando un valor de 1 para ambient y un valor de 0 para diffuse. Esto eliminar todo el sombreado y simplemente dar al objeto su color en su forma ms brillante en todos sus puntos. Esto es til para simular objetos que emiten luz como bombillas y para cielos en escenas donde el este no deba ser iluminado por ningn otro medio Ahora intentemos esto con nuestra esfera.
sphere { <0,0,0>, 1 pigment { White } finish { ambient 1 diffuse 0 } }

Nos da como resultado una esfera de un blanco cegador sin ningn punto de brillo ni partes sombreadas. Podra servir, por ejemplo, para la luz de una farola. 4.8.4.2. Usando los reflejos de superficie

En el ejemplo anterior del cristal, nos dimos cuenta de que haba pequeos puntos brillantes sobre la superficie. Esto daba a la esfera una apariencia dura y brillante. POV-Ray nos proporciona dos mtodos para especificar los reflejos especulares sobre la superficie. El primero es el reflejo phong y se describe mediante dos identificadores: phong y phong_size. El valor decimal que sigue a phong determina su brillo y el que sigue a phong_size, su tamao. Intentemos esto.
sphere { <0,0,0>, 1 pigment { Gray50 } finish { ambient .2 diffuse .6 phong .75 phong_size 25 } }

Trazando esto vemos un reflejo amplio y atenuado que da a la esfera una apariencia semejante al plstico. Ahora cambiemos phong_size a 150. Esto causa un reflejo ms pequeo que da a la esfera una apariencia ms dura y brillante. Hay otro tipo de reflejo, que es calculado usando un mtodo distinto, llamado reflejo especular. Se especifica usando el identificador specular y opera en conjuncin con otro identificador llamado roughness. En muchos aspectos, estos dos identificadores trabajan juntos del mismo modo que

PERSISTENCE OF VISION RAYTRACER

95

phong y phong_size para crear reflejos que alteren el aparente brillo de la superficie. Intentmoslo ahora usando specular en nuestra esfera.
sphere { <0,0,0>, 1 pigment { Gray50 } finish { ambient .2 diffuse .6 specular .75 roughness .1 } } }

Observando los resultados vemos un amplio y atenuado reflejo similar al que tenamos cuando usbamos phong_size 25. Cambiemos roughness a 0.001 y tracemos de nuevo. Ahora vemos un pequeo y ceido reflejo similar al que tenamos cuando usbamos phong_size 150. Hablando en general. specular es ligeramente ms preciso y por lo tanto ligeramente ms realista que phong, pero de todos modos deberas probar ambos mtodos al disear una textura. Incluso hay veces en las que ambos mtodos pueden ser usados en un mismo acabado. 4.8.4.3. Usando reflection y metallic

Existe otro parmetro muy relacionado con los reflejos, reflection. Las superficies muy brillantes normalmente tienen un cierto grado de reflexin. Echemos un vistazo a este ejemplo.
sphere { <0,0,0>, 1 pigment { Gray50 } finish { ambient .2 diffuse .6 specular .75 roughness .001 reflection .5 } } }

Vemos que ahora nuestra esfera refleja el plano a cuadros verdes y blancos y el fondo negro, pero el color gris de la esfera parece fuera de lugar. Este es otro caso en el que se necesita un valor bajo para diffuse. Generalmente, cuanto mayor sea la reflexin, menor deber ser el valor de diffuse. Bajamos el valor de diffuse a 0.3 y el valor de ambient a 0.1 y trazamos de nuevo. Ahora est mucho mejor. Hagamos que nuestra esfera sea tan brillante como una pulimentada bola de oro.
sphere { <0,0,0>, 1 pigment { BrightGold } finish { ambient .1 diffuse .1 specular 1 roughness .001 reflection .75 } } }

El resultado es muy aproximado, pero hay algo que todava esta mal en el reflejo. Para hacer que la superficie tenga un aspecto ms metlico se usa el identificador metallic. Lo aadimos para ver la diferencia
sphere { <0,0,0>, 1 pigment { BrightGold } finish { ambient .1

4. TUTORIAL PARA PRINCIPIANTES


diffuse .1 specular 1 roughness .001 reflection .75 metallic

96

Vemos que el reflejo a tomado su color de la superficie en lugar de la fuente de luz. Esto da a la superficie una apariencia ms metlica. 4.8.4.4. Usando refraction

Los objetos transparentes permiten a la luz pasar a travs de ellos. Con algunas sustancias, los rayos de luz son desviados al pasar de una sustancia a otra debido a la diferencia de densidades pticas entre los objetos. A esto se le llama refraccin. El agua y el cristal desvan la luz de esta forma. Para crear agua o cristal, POV-Ray nos proporciona un mtodo para especificar la refraccin. Esto se consigue mediante los identificadores refraction e ior. La cantidad de luz que pasa a travs de un objeto se determinan mediante el filtrado y la transmitancia en el pigmento. Deberamos usar el valor de refraction solo para activar o desactivar la refraccin usando los valores 1 0 respectivamente (o los valores booleanos on y off). Ver la seccin "Refraccin" para una explicacin detallada de las razones. El grado de refraccin se especifica mediante el identificador ior, abreviacin de index of refraction (ndice de refraccin). Si conocemos el ndice de refraccin de la sustancia que estamos creando lo podemos usar directamente. Como ejemplo el agua tiene un ndice de 1.33, el cristal est alrededor de 1.45 y el diamante de 1.75. Volvamos al ejemplo de una esfera de cristal que usamos anteriormente.
sphere { <0,0,0>, 1 pigment { White filter 1 } finish { ambient 0 diffuse 0 reflection .25 refraction 1 ior 1.45 specular 1 roughness .001 } } }

Trazamos esto de nuevo y observamos como la porcin del plano que es visible a travs de la esfera es distorsionado y vuelto de arriba a abajo. Esto es debido a que la luz que pasa a travs de la esfera es desviada o refractada segn el grado especificado. Reducimos el valor de ior a 1.25 y trazamos de nuevo. Despus lo incrementamos a 1.75. Podemos observar como cambia la distorsin. 4.8.4.5. Aadiendo la atenuacin luminosa

Los objetos transparentes pueden estar hechos de forma que la intensidad de la luz que pasa a travs de ellos sea reducida. En la realidad, esto es debido a impurezas que dispersan los rayos de luz. Dos valores decimales determinan este efecto: fade_distance es la distancia hasta la cual deben llegar los rayos de luz para alcanzar la mitad de su intensidad original y fade_power es el grado segn el cual disminuye esa intensidad. Veamos un ejemplo de esto.
sphere { <0,0,0>, 1 pigment { White filter 1 } finish {

PERSISTENCE OF VISION RAYTRACER


ambient .1 diffuse .1 reflection .15 refraction 1 ior 1.45 specular 1 roughness .001 fade_distance 5 fade_power 1

97

Esto da a la esfera un aspecto nublado, como si no toda la luz fuera capaz de pasar a travs de ella. Para variaciones interesantes de esta textura, bajemos el valor de ior a 1.15 y subamos el de reflection a 0.5. 4.8.4.6. 4.8.4.6.1. Usando custicas simuladas Qu es la custica?

Primero, hagamos una incursin en la alacena de la cocina. Estamos buscando vasos de cristal. Si tienen una superficie decorada, mucho mejor. Uno a uno los colocamos debajo de una lmpara y observamos la sombra que proyectan sobre la mesa. Si observamos de cerca distinguiremos regiones brillantes entre las sombras. Estos sern los lugares donde las propiedades refractivas de los vasos de cristal estn concentrando la suficiente luz como para formar puntos brillantes. Si hay un diseo tallado sobre la superficie del cristal veremos ese diseo formado por las reas brillantes. Estas regiones son la custica causada por la refraccin, la custica refractiva. Habr tambin regiones brillantes causadas por la luz reflejada por el cristal. A esto se le llama custica reflexiva. Una vez sabemos lo que estamos buscando, seremos capaces de observar la custica en muchas situaciones cotidianas: la sombra proyectada por una lupa, la luz que atraviesa una pecera, a travs de un trozo arrugado de celofn, etc. Podremos verla incluso en el fondo de una piscina en un da soleado. La custica es un sutil efecto luminoso que puede dar realismo a las imgenes trazadas con objetos que lo usen. POV-Ray usa algoritmos que simulan la custica refractiva (la custica reflexiva no es posible). Existen limitaciones inherentes al proceso estndar de trazado de rayos en general que la hacen inadecuada para algunas aplicaciones de la simulacin de la luz, tales como testeo ptico y muy pocos y particulares casos de proyectos arquitectnicos de iluminacin. Los mtodos que llevan a cabo clculos ms extensos necesarios para realizar simulaciones completas del comportamiento de la luz, incluyendo la custica (como el path-tracing, el photon-tracing o el ray-tracing bidireccional) son muy lentos y poco prcticos en plataformas normales. Esto significa que nos tenemos que arreglar con la custica para obtener el mejor resultado posible, pero con un poco de experimentacin, veremos que podemos emular de forma muy cercana la realidad. La mejor forma de hacerlo es, cuando sea posible, estudiando antes un ejemplo de lo que estamos intentando trazar. Tenemos que conocer el diseo de su custica y ajustar entonces nuestra imagen final hasta que estemos satisfechos. 4.8.4.6.2. Aplicando la custica a una escena

La custica es una nueva propiedad de la textura en el rea de los acabados. La aplicamos a las sombras de un objeto transparente y refractivo aadiendo el identificador caustics al acabado. Para empezar, probamos el siguiente ejemplo (ver fichero CAUSTIC1.POV).

4. TUTORIAL PARA PRINCIPIANTES


#include "colors.inc" #include "textures.inc" camera { location <0, 15, -40> look_at <-2, 0, 1> angle 10 } light_source { <10, 20, 10> color White } // crear un aburrido suelo para ver la sombra proyectada contra el plane { y, 0 pigment { Grey } } // he aqu algo para aplicar la custica sobre ello sphere { <0, 3, 0>, 2 texture { Glass3 finish { caustics .6 } } }

98

Figura 25: La custica de una esfera translcida Cuando tracemos esto veremos nuestra esfera en la esquina superior derecha de la imagen, flotando a escasa distancia del plano y la sombra que proyecta se extiende sobre la parte central de la escena. Y all, en el centro hay una custica bsica. Esa rea brillante en el centro representa la luz que normalmente la refraccin concentrara en medio de la sombra. La nica cuestin que esto desprende es: qu pasa con el valor decimal que sigue al identificador caustics? Bien, aqu es donde aparece nuestra discusin sobre como ajustar la custica. Recuerdas los vasos de cristal? Si tuviramos uno de paredes delgadas y una base gruesa veramos lo que queremos decir en la sombra que proyectara. En la parte superior, con las paredes delgadas (con menor refraccin) la custica es menos pronunciada y ms difundida entre la sombra, pero cuando llegamos a la parte de la sombra proyectada por la base ms gruesa y refractiva, de repente la custica se vuelve ms pronunciada y ms enfocada cerca del centro. Por supuesto, ya que la custica es simulada, no hay correspondencia entre el grado en que la custica es enfocada o difuminada y la forma, tamao o refractividad del objeto. Sin embargo, podemos controlarla

PERSISTENCE OF VISION RAYTRACER

99

manualmente con el valor decimal que sigue al identificador caustics. Cuanto ms se acerca este valor a cero, ms difusa y tenue ser la custica, mientras que cuanto ms cerca este de 1, ms enfocada y pronunciada ser esta. Con el valor 1 tenemos la custica de una gruesa y altamente refractiva pieza de cristal, mientras que con el valor 0.1, parece ms bien una esfera de cristal vaca. Trazamos de nuevo la escena anterior con una rango de valores entre 0.1 y 1.0 y vamos viendo las diferentes custicas que tenemos. Los valores fuera de rango tambin funcionan. Los nmeros mayores que 1 nos llevan a custicas cada vez ms enfocadas. Los nmeros negativos producen efectos extraos pero interesantes. Esencialmente, el objeto se ilumina de formas extravagantes y la sombra parece ms bien un negativo fotogrfico de si misma. Parecido a los efectos de las pistolas de rayos de ciencia ficcin de los aos 50. Tiene una apariencia extraa y no del todo foto-realsta, pero si nos gusta el surrealismo podemos querer probarlo al menos una vez y anotar el efecto que produce sobre nuestra mente en caso de que alguna vez lo necesitemos. 4.8.4.6.3. Custica y normales

POV-Ray hace el uso de la perturbacin de la normal de una superficie de una forma ms especial que la que la gente se parara a pensar. Cuando aplicamos la normal de una superficie en una textura, estamos no solo alterando la superficie si no, adems diciendo a POV-Ray que trate a la superficie como si esta hubiera sido alterada, por motivos del computo de la iluminacin que cae sobre cada punto individual. En pocas palabras, se trata de un truco de luces y sombras que, suponiendo que no lo observamos desde un ngulo demasiado agudo, efectivamente crea la ilusin de distorsiones sobre la superficie del objeto. Las custica es tambin un truco artificial, como vimos antes y se puede tener por seguro, que ha sido diseada para reaccionar sobre los diseos de la normal de la superficie para hacer que estos parezcan genuinos. Recuerdas el experimento del vaso de agua? Si encontramos un vaso con diseos tallados sobre su superficie probablemente veremos esos diseos resaltados en la custica proyectada por el cristal. Cuando tenemos una superficie transparente con una normal aplicada, esta hace que la custica proyectada por esa superficie imite el diseo de la normal, de forma que aparezca en la sombra. A continuacin hay un ejemplo de lo que queremos decir: est pensado para representar el agua en una piscina. Lo conseguimos mediante un plano superior para el agua, otro inferior que representa el suelo de la piscina, una cmara justo debajo de la superficie, mirando al suelo y una fuente de luz situada a bastante altura. (ver CAUSTIC2.POV).
#include "colors.inc" // Nuestra cmara esta bajo agua, mirando al fondo de // la piscina para una mejor visin de la custica producida camera { location <0, -5, 0> look_at <0, -10, -5> } light_source { <0, 100, 49.5> color White } // el fondo de la piscina... plane { y, -10 texture { pigment { color rgb <0.6, 0.7, 0.7> } finish { ambient 0.1 diffuse 0.7 } scale 0.01 }

4. TUTORIAL PARA PRINCIPIANTES


} // y la superficie del agua plane { y, 0 texture { pigment { rgbf <0.6, 0.67, 0.72, 0.9> } normal { bumps .6 scale <.75, .25, .25> rotate <0, 45, 0> } finish { caustics .9 } } }

100

Figura 26: La custica en una piscina Las ondulaciones que le hemos dado al plano del agua estn pensadas para representar las pequeas y aleatorias crestas que se forman sobre una piscina cuando una ligera brisa sopla sobre ella. Podramos haber usado ripples o waves tambin, como si algo se hubiera zambullido en ella en algn punto, pero bumps ser suficiente para un ejemplo. Observamos que nuestra vista del suelo de la piscina muestra docenas de pequeas custicas, correspondientes a un diseo de ondulaciones aleatorias. Si queremos podemos usar ripples o waves y ver como cambia el diseo de la custica. A pesar de que un plano liso no producira custica por si mismo (podemos intentarlo sin la normal), la generacin simulada de custica de POV-Ray sabe que si la superficie fuera realmente abultada como esta normal est indicando, la refraccin de esta sera suficiente para concentrar la luz en custicas por todo el suelo de la piscina. Vemos que al igual que con una superficie curva, como la anterior esfera, el diseo de la normal tambin afecta a las custicas proyectadas por un objeto. Lo curioso del caso es que esto sera la prueba de que la custica es simulada: a nuestra agua no se le ha dado ninguna propiedad de refraccin en su acabado, pero la custica est all. 4.8.4.7. Usando la iridiscencia

La iridiscencia es lo que vemos en la superficie de una mancha de petrleo cuando el sol brilla sobre ella. El efecto de arco iris es creado por algo llamado interferencia de pelculas delgadas (ver seccin ("Iridiscencia" para detalles). Por ahora simplemente intentemos usarla. La iridiscencia se especifica

PERSISTENCE OF VISION RAYTRACER

101

mediante el identificador irid y tres valores: cantidad, anchura y turbulencia. La cantidad es la contribucin al color de la superficie. Usualmente de 0.1 a 0.5 es suficiente. La anchura, precedida del identificador thickness, afecta a la magnitud del efecto. Mantnla entre 0.25 y 1 para mejores resultados. La turbulencia, precedida del identificador turbulence, es un poco diferente a la turbulencia del pigmento o la normal. No podemos definir octavas, lambda u omega pero podemos especificar una cantidad que afectar al grosor de una forma ligeramente distinta al valor de thickness. Aqu tambin funcionan mejor los valores entre 0.25 y 1. Finalmente, la iridiscencia responder a la normal de la superficie ya que depende del ngulo de incidencia de los rayos de luz sobre la superficie. Con todo esto en mente, aadamos algo de iridiscencia a nuestra esfera de cristal.
sphere { <0,0,0>, 1 pigment { White filter 1 } finish { ambient .1 diffuse .1 reflection .2 refraction 1 ior 1.5 specular 1 roughness .001 fade_distance 5 fade_power 1 caustics 1 irid { 0.35 thickness .5 turbulence .5 } } }

Variemos los valores de la cantidad, thickness y turbulence para ver que cambios tienen lugar. Aadamos tambin un bloque de declaracin de la normal para ver que pasa.

4.8.5. Halos
Nota importante: el halo es una caracterstica experimental de POV-Ray 3.0. Hay una alta probabilidad de que el diseo e implementacin de estas caractersticas cambie en futuras versiones. No podemos garantizar que las escenas que las usen den los mismos resultados en futuras versiones o que se mantenga la compatibilidad de la sintaxis del lenguaje. Los halos son una poderosa caracterstica que puede ser usada para crear gran cantidad de efectos distintos como nubes, niebla, fuego, lseres, etc. El nombre se debe a la posibilidad de trazar halos, como los que se ven alrededor de la luna o del sol. Debido a la complejidad del halo y de la gran cantidad de parmetros proporcionados es muy difcil conseguir resultados satisfactorios. Las siguientes secciones ayudarn a crear un halo paso a paso, empezando por lo ms bsico hasta llegar a los conceptos ms sutiles. Es tambin aconsejable leer las secciones de referencia para un mejor entendimiento de las caractersticas de los halos. En especial las secciones "Objetos Vacos y Objetos Slidos" y "Mapeado del Halo" debido a que son esenciales para entender los halos. 4.8.5.1. Qu son los halos?

Los halos son una caracterstica de las texturas que nos permiten rellenar con partculas el interior de un objeto. La distribucin de estas partculas puede ser modificada usando distintos mapeados y funciones

4. TUTORIAL PARA PRINCIPIANTES

102

de densidad. Las partculas pueden emitir luz, para crear efectos de fuego o lseres, o absorberla para crear nubes o niebla. Un halo esta vinculado a un objeto, llamado objeto contenedor, al igual que un pigmento, una normal o un acabado. El objeto contenedor esta completamente rellenado con el halo, pero no podremos ver nada si no nos aseguramos de que el objeto es vaco y su superficie translcida. Como se consigue esto lo veremos en la siguiente seccin. Cuando trabajemos con los halos siempre tendremos que tener en cuenta que el objeto contenedor tiene que ser vaco y translcido. 4.8.5.2. El halo emisor

Empezamos con uno de los tipos ms simples, el halo emisor. Usa partculas que solo emiten luz. No hay partculas que absorban la luz proveniente de otras partculas o de las fuentes de luz. 4.8.5.2.1. Empezando con un halo bsico

Una forma inteligente de conseguir un halo bien diseado es empezar con una figura simple, de tamao unitario que repose sobre el origen de coordenadas. En el primer ejemplo (HALO01.POV) intentamos crear una salvaje explosin, en la cual la esfera es el objeto ms adecuado. Empezamos con una simple escena que consiste de una cmara, una fuente de luz (no nos preocupan las sombras as que aadimos el identificador shadowless), un plano a cuadros y una esfera unitaria que contiene el halo.
camera { location <0, 0, -2.5> look_at <0, 0, 0> } light_source { <10, 10, -10> color rgb 1 shadowless } plane { z, 2 pigment { checker color rgb 0, color rgb 1 } finish { ambient 1 diffuse 0 } scale 0.5 hollow } sphere { 0, 1 pigment { color rgbt <1, 1, 1, 1> } halo { emitting spherical_mapping linear color_map { [ 0 color rgbt <1, 0, 0, 1> ] [ 1 color rgbt <1, 1, 0, 0> ] } samples 10 } hollow }

Observamos que la esfera est declarada como vaca (mediante el identificador hollow) y tiene una superficie translcida (el canal de transmitancia en el color de pigmento es 1), tal como es requerido para los halos. Tambin notamos que el plano tiene el identificador hollow a pesar de que no tiene halo. Por qu es necesario esto?

PERSISTENCE OF VISION RAYTRACER

103

La razn es bastante simple. Tal como se describe en la seccin "Objetos Vacos y Objetos Slidos" no puede haber un halo en un objeto no vaco. Ya que la cmara est dentro del plano, es decir, est en la regin considerada como interior del plano, el halo nunca ser visto a no ser que el plano sea declarado como vaco (o el identificador negative sea aadido para situar la cmara en la parte exterior del plano). Que significan todos esos identificadores y valores en el halo? Al principio de la declaracin se usa el identificador emitting para especificar que tipo de halo queremos usar. El halo emisor emite luz. Eso es lo ms adecuado para nuestra salvaje explosin. Los identificadores spherical_mapping y linear necesitan una explicacin ms detallada de cono funciona un halo (esto tambin es llevado a cabo en el captulo "Halo" en ms detalle). Como se ha dicho anteriormente el halo est formado de una gran cantidad de pequeas partculas. La distribucin de estas partculas es descrita por una funcin de densidad. En general, una funcin de densidad nos dir que cantidad de partculas encontraremos en una posicin dada. En lugar de usar una funcin matemtica explcita de densidad, los halos se basan en un determinado nmero de mapeados y funciones de densidad para modelar una variedad de distribuciones de partculas. El primer paso en este modelado es determinar la funcin de mapeado que ser usada para asignar a cada punto tridimensional un valor perteneciente a un rango unidimensional. En nuestro ejemplo hemos usado un mapeado esfrico, es decir, tomamos la distancia de un punto desde el origen del sistema de coordenadas. Esa es la razn por la que es recomendable empezar con un objeto contenedor situado en el origen del sistema de coordenadas. Ya que todos los mapeados de densidad son relativos a este origen, no veremos nada si empezamos con un objeto situado en cualquier otro lugar. La forma correcta de situar un objeto contenedor es mover todo el objeto (incluyendo texturas y halos). Ahora tenemos un solo valor comprendido en un rango que va de 0 a 1. Este valor ser transformado usando una funcin de densidad para obtener esta a partir de la distancia. Usar solo este valor no es suficiente debido a que queremos tener una distribucin de partculas en la densidad descienda segn nos movemos desde el centro del objeto contenedor al exterior. Esto se consigue mediante la funcin de densidad. Existen varias alternativas disponibles tal como se describe en la referencia del halo (ver seccin "Funcin de densidad"). Usamos una simple funcin lineal que transforma los valores de rango de 0 a 1 a un rango de 1 a 0. De esta forma tenemos un valor de 1 en el centro de nuestra esfera y de 0 en la superficie. Ahora que tenemos una funcin de densidad, qu hacemos para que se vea algo? Aqu es donde el identificador color_map entra en juego. Se usa para describir un mapa de color que indicar al programa que color debe ser usado para cada densidad. La relacin es bastante simple: los colores al principio del mapa de color (valores bajos) sern usados para valores bajos de densidad y los colores al final del mapa (valores altos) sern usados para densidades altas. En nuestro ejemplo el halo ser amarillo en el centro de la esfera, donde la densidad es mayor y se ir transformando en rojo hasta llegar a la superficie de la esfera donde la densidad se aproxima a cero. El canal de transmitancia de los colores en el mapa de color sirve para modelar la translucidez del campo de densidad. Un valor de 0 representa translucidez nula, es decir, que las reas con la correspondiente densidad sern (casi completamente) opacas, mientras que un valor de 1 significa (casi completamente) translcido.

4. TUTORIAL PARA PRINCIPIANTES En nuestro ejemplo usamos


color_map { [ 0 color rgbt <1, 0, 0, 1> ] [ 1 color rgbt <1, 1, 0, 0> ] }

104

que resulta en un halo con una rojiza y muy translcida rea exterior y una casi opaca zona interior de color amarillo tal como podemos ver despus de trazar la imagen de ejemplo.

Figura 27: El halo bsico usado para modelar una salvaje explosin Hay un parmetro que todava necesita ser explicado: el identificador samples. Este identificador le dice a POV-Ray cuantas muestras deben ser tomadas a lo largo de cualquier rayo que viaje a travs del halo para calcular su efecto. El uso de un valor bajo resultar en una alta velocidad de trazado y viceversa. El valor de samples debe ser incrementado si el halo tiene una apariencia incorrecta debido a la baja tasa de muestreo. Para ms detalles ver "Muestreo del Halo". 4.8.5.2.2. Incrementando el brillo

Los colores del halo en la imagen anterior son algo tenues. El fondo es demasiado visible a travs del halo. No se parece demasiado al fuego, verdad? Una forma fcil de arreglar esto es decrementar la transparencia de las partculas en las reas de alta densidad. Lo conseguimos usando el siguiente mapa de color en lugar del anterior (la transmitancia negativa es correcta).
color_map { [ 0 color rgbt <1, 0, 0, 1> ] [ 1 color rgbt <1, 1, 0, -1> ] }

Observando los resultados en HALO02.POV vemos que el halo es efectivamente ms brillante.

PERSISTENCE OF VISION RAYTRACER

105

Figura 28: El halo es ms brillante ahora

4.8.5.2.3.

Aadiendo algo de turbulencia

Lo que tenemos ahora tampoco parece una salvaje explosin. Se parece ms a una bola brillante que a cualquier otra cosa. De alguna forma tenemos que hacer que parezca ms catica, tenemos que aadir algo de turbulencia. Esto se consigue usando el identificador turbulence junto con la cantidad de turbulencia que queremos aadir. Tal como se muestra en el siguiente ejemplo.
sphere { 0, 1 pigment { color rgbt <1, 1, 1, 1> } halo { emitting spherical_mapping linear turbulence 1.5 color_map { [ 0 color rgbt <1, 0, 0, 1> ] [ 1 color rgbt <1, 1, 0, -1> ] } samples 10 } hollow }

Aadir turbulencia al halo provoca que todos los puntos en el interior del objeto contenedor se muevan de forma pseudo-aleatoria. El resultado es un cambio en la distribucin de partculas como si se hubiera producido un flujo o corriente en el interior del halo (dependiendo de la cantidad indicada que sigue al identificador turbulence tendremos un flujo ms uniforme o ms turbulento). En este ejemplo usamos un valor alto, ya que una explosin es altamente turbulenta. Observando la imagen de ejemplo (HALO03.POV) vemos que se parece ms a una salvaje explosin que a la bola brillante que tenamos hasta ahora.

4. TUTORIAL PARA PRINCIPIANTES

106

Figura 29: Aadir algo de turbulencia hace que la explosin sea ms realista Nos damos cuenta que el tiempo que tarda en ser trazada la imagen se ha incrementado al aadir la turbulencia. Esto es debido al hecho de que por cada una de las muestras tomadas del halo, la lenta funcin de turbulencia tiene que ser evaluada. 4.8.5.2.4. Reescalando el halo

Todava hay algo extrao en nuestra salvaje explosin. Sigue pareciendo una esfera. Por qu ocurre esto? y qu podemos hacer para evitarlo? Tal como se dijo antes, la turbulencia mueve las partculas en el interior del objeto contenedor del halo. El problema es que algunas de estas partculas son desplazadas fuera del objeto contenedor. Esto lleva a altas densidades en la superficie del objeto revelando su forma (todas las partculas fuera del objeto contenedor se pierden y no sern visibles resultando en un abrupto cambio de densidad en la superficie). Una forma fcil de evitar esto es asegurarnos de que las partculas permanecen en el interior del objeto contenedor incluso si aadimos turbulencia. Esto se consigue escalando el halo para reducir su tamao. No escalamos el objeto contenedor, solo el halo. Incluimos el identificador scale dentro de la declaracin del halo.
sphere { 0, 1 pigment { color rgbt <1, 1, 1, 1> } halo { emitting spherical_mapping linear turbulence 1.5 color_map { [ 0 color rgbt <1, 0, 0, 1> ] [ 1 color rgbt <1, 1, 0, -1> ] } samples 10 scale 0.5 } hollow scale 1.5

PERSISTENCE OF VISION RAYTRACER


}

107

El comando scale 0.5 indica a POV-Ray que escale todos los puntos dentro del halo por esta cantidad. Esto efectivamente escala el radio que tenemos despus del mapeado de densidad a un rango de 0 a 0.5 en lugar de 0 a 1 (sin turbulencia). Si aadimos la turbulencia los puntos pueden moverse media unidad en cualquier direccin sin abandonar el objeto contenedor. Esto es exactamente lo que queremos. Para compensar el menor tamao del halo escalamos la esfera (y el halo interior) por 1.5. Observando la nueva imagen de ejemplo (HALO04.POV) no veremos ni rastro de la esfera contenedora. Finalmente tenemos una bonita explosin.

Figura 30: Reescalando el halo mejoramos su apariencia La cantidad por la cual debemos escalar el halo depende de la cantidad de turbulencia que usemos. A ms turbulencia, menor deber ser el halo. He aqu algo con lo que experimentar. Otra forma de evitar que los puntos abandonen la esfera es que esta sea ms grande, es decir, una esfera con un radio mayor que uno. Es importante reescalar la esfera antes de aadir el halo debido a que de otra forma el halo sera tambin escalado. Notemos que esto solo funciona para el mapeado esfrico y de caja (y una funcin de densidad no constante). Todos los dems tipos de mapeado son (parcialmente) infinitos, es decir, la distribucin de partculas resultante cubre un espacio infinito (ver tambin "Mapeado del Halo"). 4.8.5.2.5. Usando frequency para mejorar el realismo

Otra forma muy efectiva de mejorar el realismo de nuestra explosin es usar un valor de frecuencia distinto de uno. La forma en que funciona frequency se explica en "El Modificador de Frecuencia" en la parte de referencia. La explicacin, ms bien matemtica, usada aqu no ayuda mucho en entender como se utiliza esta caracterstica. Aunque es bastante simple. El valor de frecuencia solo le indica al programa cuantas veces se tiene que repetir el mapa de color en el rango de densidad de 0 a 1. Si se tiene una frecuencia de uno (el valor por defecto) se especifica que el mapa de color solo ser visible una vez en el campo de

4. TUTORIAL PARA PRINCIPIANTES

108

densidad, es decir, el color en 0 ser usado para densidad 0, el color en 0.5 para densidad 0.5 y el color en 1 para densidad 1. Simple, verdad?. Si elegimos una frecuencia de dos, el color en 0 ser usado para densidad 0, el color en 0.5 ser usado para densidad 0.25 y el color en 1 ser usado para densidad 0.5. Qu pasa para densidades superiores a 0.5? Ya que no hay entradas en el mapa de color para valor superiores a 1 simplemente volvemos a empezar de 0 otra vez. De esta forma el color en 0.1 ser usado para densidad 0.55 ((2*0.55) mod 1 = 1.1 mod 1 = 0.1), el color en 0.5 ser usado para densidad 0.75 y el color en 1 ser usado para densidad 1. Si se nos dan bien la matemticas notaremos que este ejemplo no es del todo correcto debido a que (1 * 2) mod 1 = 0 y no 1. Simplemente imaginemos que hemos usado un valor ligeramente menor que uno y todo ir bien. Deberamos darnos cuenta de que para evitar cambios repentinos en el color del halo para frecuencias mayores que uno tendramos que usar un mapa de color peridico, es decir, un mapa de color cuyas entradas en 0 y en 1 sean las mismas. Cambiamos nuestro ejemplo usando un mapa de color peridico y cambiando el valor de la frecuencia a dos.
sphere { 0, 1 pigment { color rgbt halo { emitting spherical_mapping linear turbulence 1.5 color_map { [ 0.0 color rgbt [ 0.5 color rgbt [ 1.0 color rgbt } frequency 2 samples 20 scale 0.5 } hollow scale 1.5 } <1, 1, 1, 1> }

<1, 0, 0, 1> ] <1, 1, 0, -1> ] <1, 0, 0, 1> ]

PERSISTENCE OF VISION RAYTRACER

109

Figura 31: Usando un mapa de color peridico y una frecuencia de dos obtenemos mejores resultados Observando el resultado de (HALO05.POV) podemos estar bastante satisfechos con la explosin que hemos creado. Todava hay algo ms a tener en cuenta cuando se incrementa la frecuencia. A menudo es necesario incrementar la tasa de muestreo (samples) casi del mismo modo que incrementamos la frecuencia. Si no hacemos esto probablemente notaremos graves efectos de aliasing (como saltos o bandas extraas de color). Si esto ocurre simplemente se ha de cambiar el valor de samples de acuerdo con el nuevo valor de frequency (dos veces la tasa de muestreo si doblamos la frecuencia). 4.8.5.2.6. Cambiando el color del halo

Tenemos una bonita explosin, pero queremos aadir un toque de ciencia-ficcin usando colores distintos. Qu tal una menos turbulenta explosin verde que se vuelve roja en sus extremos? Nada ms fcil que eso!
sphere { 0, 1.5 pigment { color rgbt <1, 1, 1, 1> } halo { emitting spherical_mapping linear turbulence 0.5 color_map { [ 0 color rgbt <0, 1, 0, 1> ] [ 1 color rgbt <1, 0, 0, -1> ] } samples 10 scale 0.75 } hollow scale 1.5 }

4. TUTORIAL PARA PRINCIPIANTES

110

Figura 32: Usando los colores rojo y verde obtenemos un resultado inesperado Eso es exactamente lo que nos haca falta. Observando los resultados de HALO06.POV podemos quedar algo decepcionados. Donde est el centro rojo de la explosin? Los bordes son verdes como esperbamos pero hay gran cantidad de amarillo en el centro y solo un poco de rojo. Qu esta pasando? Usamos un halo emisor para nuestro ejemplo. De acuerdo con la correspondiente seccin en el captulo de referencia del halo (ver "Emisor") este tipo de halo utiliza partculas muy pequeas que no atenan la luz que atraviesa el halo. Especialmente las partculas cerca del observador no atenan la luz proveniente de partculas ms lejanas. Durante el clculo del color del halo cerca del centro de la esfera contenedora, el rayo pasa a travs de casi todas las posibles densidades de la distribucin de partculas. De esta manera tenemos partculas rojas y verdes segn avanzamos, dependiendo de la posicin actual en el halo. Se usa la suma de estos colores, lo que da el color amarillo (la suma del rojo y el verde es el amarillo). Esto es lo que ocurre aqu. Como podemos conseguir lo que queremos? La respuesta es usar un halo brillante en lugar de un halo emisor. El halo brillante es muy similar al emisor excepto que el primero atena la luz que pasa a travs de l. De esta forma la luz de las partculas situadas detrs de otras ser atenuada por estas ltimas. 4.8.5.3. El halo brillante

Hemos mencionado el halo brillante en la seccin sobre el halo emisor como una forma de evitar la mezcla de color que ocurre con este tipo de halo. El halo brillante es muy similar al emisor con la diferencia de que tambin absorbe la luz. Podemos verlo como una combinacin del halo emisor y del atenuante descrito en la seccin "El Halo Atenuante". Simplemente reemplazando el identificador emitting en el ejemplo de la seccin "Cambiando el Color del Halo" por el identificador glowing obtenemos el efecto deseado como se ve en la imagen del ejemplo (HALO11.POV).

PERSISTENCE OF VISION RAYTRACER

111

Figura 33: Usando un halo brillante obtenemos el resultado esperado A pesar de que el color rojo de las reas de alta densidad no es muy visible debido a la coloracin verde, las reas de baja densidad situadas al frente absorben la mayor parte de la luz roja, no vemos el color amarillo donde hubiramos esperado un color rojo. Debido a su similitud con el halo emisor tenemos que experimentar con este tipo de halo. Solo tenemos que retener en mente todo lo aprendido en las secciones previas pare obtener resultados satisfactorios. 4.8.5.4. El halo atenuante

Otro tipo de halo es el halo atenuante que solo absorbe luz. No emite luz propia. Una gran diferencia entre el halo atenuante y los otros tipos de halos es que el color del halo atenuante es calculado a partir del mapa de color usando la densidad total de partculas a lo largo de un rayo dado. Los otros tipos utilizan una media pesada de los colores calculados a partir de la densidad en cada muestra. 4.8.5.4.1. Haciendo una nube

Los halos atenuantes son ideales para crear nubes y humo. En los siguientes ejemplos intentaremos hacer una pequea nube. Empezamos de nuevo usando una esfera unitaria rellenada con un halo atenuante bsico (HALO21.POV).
camera { location <0, 0, -2.5> look_at <0, 0, 0> } light_source { <10, 10, -10> color rgb 1 shadowless } plane { z, 2 pigment { checker color rgb 0, color rgb 1 } finish { ambient 1 diffuse 0 } scale 0.5 hollow }

4. TUTORIAL PARA PRINCIPIANTES


sphere { 0, 1 pigment { color rgbt <1, 1, 1, 1> } halo { attenuating spherical_mapping linear color_map { [ 0 color rgbt <1, 0, 0, 1> ] [ 1 color rgbt <1, 0, 0, 0> ] } samples 10 } hollow }

112

A pesar de que normalmente las nubes no son rojas, si no blancas o grises, usamos el color rojo para hacerla ms visible contra el fondo a cuadros blancos y negros. El color de un halo atenuante se calcula a partir de la densidad total acumulada despus de que el rayo haya atravesado por completo el campo de partculas. Esto debe ser tenido en cuenta cuando se especifica el mapa de color. Queremos que las reas de la nube con baja densidad sean altamente translcidas, as que usamos un color rgbt <1,0,0,1> y queremos que las reas de alta densidad sean opacas, as que usamos un color rgbt <1,0,0,0>.

Figura 34: El halo atenuante bsico usado para crear una nube 4.8.5.4.2. Escalando el contenedor del halo

La nube que hemos creado no es muy realista. Es solo una translcida bola roja. Para obtener un mejor resultado usamos algunos de los mtodos que ya hemos aprendido en las secciones acerca de los halos emisores. Aadimos algo de turbulencia para conseguir una forma ms realista, escalamos el halo para evitar que la superficie del objeto contenedor sea visible y decrementamos la translucidez de las reas con una alta densidad de partculas. Otra idea es escalar el objeto contenedor para obtener una forma elipsoide que puede ser usada para modelar una nube de forma bastante efectiva. Esto se consigue con el comando scale <1.5,0.75,1> al final de la declaracin de la esfera. Escala ambos, la esfera y el halo interior.
sphere { 0, 1 pigment { color rgbt <1, 1, 1, 1> } halo {

PERSISTENCE OF VISION RAYTRACER


attenuating spherical_mapping linear turbulence 1 color_map { [ 0 color rgbt <1, 0, 0, 1> ] [ 1 color rgbt <1, 0, 0, -1> ] } samples 10 scale 0.75

113

} hollow scale <1.5, 0.75, 1>

Observando los resultados de HALO22.POV vemos que se parece ms a una nube real (aparte del color).

Figura 35: Escalando el contenedor del halo y aadiendo algo de turbulencia obtenemos mejores resultados 4.8.5.4.3. Aadiendo halos adicionales

Otro truco para conseguir algo ms de realismo es usar mltiples halos. Si observamos un grupo cmulos notaremos que a menudo se extienden en la parte superior mientras que son bastante ms planos en la inferior. Queremos modelar esta apariencia aadiendo dos halos adicionales a nuestro objeto contenedor (ver seccin "Mltiples Halos" para ms detalles). Esto se consigue de la siguiente forma.
sphere { 0, 1.5 pigment { color rgbt <1, 1, 1, 1> } halo { attenuating spherical_mapping linear turbulence 1 color_map { [ 0 color rgbt <1, 0, 0, 1> ] [ 1 color rgbt <1, 0, 0, -1> ] } samples 10 scale <0.75, 0.5, 1> translate <-0.4, 0, 0> }

4. TUTORIAL PARA PRINCIPIANTES


halo { attenuating spherical_mapping linear turbulence 1 color_map { [ 0 color rgbt <1, 0, [ 1 color rgbt <1, 0, } samples 10 scale <0.75, 0.5, 1> translate <0.4, 0, 0> } halo { attenuating spherical_mapping linear turbulence 1 color_map { [ 0 color rgbt <1, 0, [ 1 color rgbt <1, 0, } samples 10 scale 0.5 translate <0, 0.2, 0> } hollow

114

0, 1> ] 0, -1> ]

0, 1> ] 0, -1> ]

Los tres halos utilizados solo difieren en su localizacin, es decir, en el vector de traslacin que hemos usado. Los dos primeros halos sirven para formar la base de la nube, mientras el ltimo se encuentra situado sobre estos. La esfera tiene un radio distinto que la previa debido a que se necesita ms espacio para los tres halos. El resultado de retoques.
HALO23.POV

de alguna forma parece una nube, a pesar de que puede necesitar algunos

Figura 36: Usando varios halos mejora mucho nuestra nube 4.8.5.5. El halo de polvo

El halo de polvo es un tipo muy complejo de halo. Nos permite ver la interaccin de la luz proveniente de una fuente con las partculas del halo. Estas partculas absorben la luz de la misma forma que en el

PERSISTENCE OF VISION RAYTRACER

115

halo atenuante. Adems tambin la dispersan. Esto hace que los rayos de luz y las sombras proyectadas por objetos sobre el halo sean visibles. 4.8.5.5.1. Empezando con un objeto iluminado por un foco

Empezamos con un objeto en forma de caja que es iluminado por un foco. No usamos ningn halo de momento, debido a que queremos ver el objeto completamente iluminado por la luz (HALO31.POV).
camera { location <0, 0, -2.5> look_at <0, 0, 0> } background { color rgb <0.2, 0.4, 0.8> } light_source { <2.5, 2.5, -2.5> colour rgb <1, 1, 1> spotlight point_at <0, 0, 0> radius 12 falloff 15 tightness 1 } difference { box { -1, 1 } box { <-1.1, -0.8, -0.8>, <1.1, 0.8, 0.8> } box { <-0.8, -1.1, -0.8>, <0.8, 1.1, 0.8> } box { <-0.8, -0.8, -1.1>, <0.8, 0.8, 1.1> } pigment { color rgb <1, 0.2, 0.2> } scale 0.5 rotate 45*y rotate 45*x }

Figura 37: El objeto que queremos usar Como vemos el objeto entero es iluminado por la fuente de luz. Ahora podemos empezar a aadir algo de polvo.

4. TUTORIAL PARA PRINCIPIANTES 4.8.5.5.2. Aadiendo algo de polvo

116

Usamos una caja para contener el halo de polvo. Ya que usamos una funcin de densidad constante no importa que tipo de mapeado usemos. La densidad toma el valor especificado por el identificador max_value en cualquier lugar en el interior del halo (el valor por defecto es uno). La dispersin isotrpica es seleccionada con el identificador dust_type.
box { -1, 1 pigment { colour rgbt <1, 1, 1, 1> } halo { dust dust_type 1 box_mapping constant colour_map { [ 0 color rgbt <1, 1, 1, 1> ] [ 1 color rgbt <1, 1, 1, 0> ] } samples 10 } hollow scale 5 }

Figura 38: Este polvo es demasiado espeso El resultado de HALO32.POV es prometedor pero el polvo es demasiado espeso y solo podemos ver algunas partes del objeto y nada del fondo. 4.8.5.5.3. Decrementando la densidad del polvo

La densidad en el interior del halo tiene un valor constante de uno. Esto significa que solo la entrada en la posicin uno del mapa de color se usa para determinar la densidad y el color del polvo. Usamos un valor de transmitancia de 0.7 para obtener un polvo ms fino.
box { -1, 1 pigment { colour rgbt <1, 1, 1, 1> } halo { dust dust_type 1 box_mapping constant

PERSISTENCE OF VISION RAYTRACER


colour_map { [ 0 color rgbt <1, 1, 1, 1.0> ] [ 1 color rgbt <1, 1, 1, 0.7> ] } samples 10

117

} hollow scale 5

Figura 39: Un polvo ms fino le da un mejor aspecto A parte de los feos efectos de aliasing la imagen queda mejor. Podemos ver el objeto entero e incluso el fondo es ligeramente visible (HALO33.POV). 4.8.5.5.4. Mejorar la apariencia de las sombras

Para reducir los efectos de aliasing usamos tres tcnicas distintas: jittering, super-muestreo y un incremento total sobre la tasa de muestreo. Jittering se usa para aadir algo de aleatoriedad a los puntos de muestreo haciendo que la imagen parezca ms irregular. Esto es mejor que los efectos de aliasing. Un bajo valor para jittering es una buena eleccin. El super-muestreo intenta reducir las diferencias tomando muestras adicionales en reas de grandes cambios de intensidad. El umbral en el cual se usa el super-muestreo y el nivel mximo de recursin pueden ser especificados mediante los identificadores aa_threshold y aa_level respectivamente. La manera de enfocar el problema que siempre funciona es incrementar la tasa general de muestreo. Ya que tambin es el mtodo ms lento deberamos usar los dems mtodos primero. Si no son suficientes tenemos que incrementar la tasa de muestreo. Usamos el siguiente halo para reducir los efectos de aliasing (HALO34.POV).
box { -1, 1 pigment { colour rgbt <1, 1, 1, 1> } halo { dust dust_type 1 box_mapping constant

4. TUTORIAL PARA PRINCIPIANTES


colour_map { [ 0 color rgbt <1, 1, 1, 1.0> ] [ 1 color rgbt <1, 1, 1, 0.7> ] } samples 50 aa_level 3 aa_threshold 0.2 jitter 0.1

118

} hollow scale 5

Figura 40: Distintos mtodos de anti-aliasing ayudan a obtener un resultado satisfactorio La imagen tiene mejor apariencia ahora. prcticamente no queda ningn efecto de aliasing. Los mismos parmetros que hemos usado son discutidos en la seccin acerca de la atmsfera (ver "La Atmsfera" para ms explicaciones). 4.8.5.5.5. Aadiendo turbulencia

La mayor diferencia entre el halo de polvo y la atmsfera descrita en "La Atmsfera" es la posibilidad de elegir una distribucin de partculas no uniforme para el polvo. Esto incluye el hecho de que el halo es limitado a un objeto contenedor adems de los distintos tipos de funciones de densidad y mapeado. Otra forma interesante de conseguir una distribucin irregular es aadir algo de turbulencia al polvo. Esto se consigue con el identificador turbulence seguido de la cantidad de turbulencia que ser usada, como muestra el siguiente ejemplo (HALO35.POV).
box { -1, 1 pigment { colour rgbt <1, 1, 1, 1> } halo { dust dust_type 1 box_mapping linear turbulence 1 colour_map { [ 0 color rgbt <1, 1, 1, 1.0> ] [ 1 color rgbt <1, 1, 1, 0.5> ]

PERSISTENCE OF VISION RAYTRACER


} samples 50 aa_level 3 aa_threshold 0.2 jitter 0.1

119

} hollow scale 5

Figura 41: Aadir turbulencia al polvo hace que tenga un aspecto ms interesante La imagen parece ms interesante debido a los desplazamientos en la densidad de partculas. Deberamos notar que usamos una funcin de densidad lineal en lugar de la funcin constante anterior. Esto es necesario debido a que con una funcin constante la densidad tiene el mismo valor en todos los puntos. El aadir turbulencia no tendra ningn efecto debido a que a donde quiera que los puntos sean movidos el valor de la densidad tendr el mismo valor. Solo una distribucin de densidad no constante tiene sentido cuando se aade turbulencia. El hecho de que el valor de turbulencia sea un vector puede ser usado para crear efectos como cascadas usando un gran valor de turbulencia en una sola direccin (por ejemplo turbulence <0.2,1,0.2>). 4.8.5.5.6. Usando polvo coloreado

Si queremos crear polvo coloreado podemos hacerlo fcilmente usando un color distinto del blanco en el mapa de color. En este caso tambin tenemos que fijar los canales de filtro en el mapa de color a valores distintos de cero para especificar la cantidad de luz filtrada por el color del polvo. Usamos un mapa de color para obtener un filtrante polvo rojo por ejemplo:
colour_map { [ 0 color rgbft <1, 0, 0, 0.5, 1.0> ] [ 1 color rgbft <1, 0, 0, 0.5, 0.7> ] }

4. TUTORIAL PARA PRINCIPIANTES 4.8.5.6. Dificultades de los halos

120

Debido a la complejidad del halo y a la poca experimentacin que los usuarios han hecho de el todava hay un montn de cosas por descubrir. Algunos de los problemas y dificultades ms comunes son descritas a continuacin para ayudarnos a evitarlos. 4.8.5.6.1. Donde son permitidos los halos

Como se mencion antes, un halo llena completamente el interior de un objeto. Teniendo esto en cuenta es razonable que el siguiente ejemplo no tenga sentido.
sphere { 0, 1 pigment { checker texture { pigment { color Clear } halo { ... } } texture { pigment { color Red } } } hollow }

Qu es lo que est mal en este ejemplo? Es simplemente que un halo se usa para describir el interior de un objeto y que no se puede describir este interior especificando el aspecto de la superficie. Pero esto fue hecho en el ejemplo anterior. No podemos imaginar que aspecto tendr el interior de la esfera. Estar completamente ocupada por el halo? Estarn algunas reas ocupadas por el halo y otras por aire? Qu aspecto tendrn estas reas? No podremos ver las propiedades del interior observando la superficie. Simplemente no es posible. Esto siempre se debe tener en cuenta. Si el ejemplo anterior fue pensado para crear una esfera rellenada con un halo y cubierta por una textura a cuadros que ocultara en parte el halo tendramos que haber empleado la siguiente sintaxis:
sphere { 0, 1 pigment { checker texture { pigment { color Clear } } texture { pigment { color Red } } } halo { ... } hollow }

Un halo siempre se aplica a un objeto de la siguiente forma:


OBJECT { texture { pigment { ... } normal { ... } finish { ... } halo { ... } } hollow

PERSISTENCE OF VISION RAYTRACER


}

121

No se permite un halo en la declaracin de un pigmento, de un mapa de color, de un mapa de pigmento, de un mapa de material o de cualquier otra cosa. No se nos impide hacerlo pero no obtendremos los resultados que queremos. Podemos usar halos con texturas superpuestas siempre que nos aseguremos de que los halos solo estn vinculados a la capa inferior (que por supuesto debe ser transparente para que se pueda ver el halo). 4.8.5.6.2. Superponiendo los objetos contenedores

POV-Ray no es capaz de tratar de forma correcta la superposicin de objetos contenedores. Si creamos dos esferas superpuestas que contengan un halo no obtendremos resultados correctos en la zona de superposicin. El efecto del halo se calcula de forma independiente para cada esfera y despus se suman los resultados. Si queremos aadir distintos halos tenemos que ponerlos todos en el interior de un solo objeto contenedor para asegurarnos de que el halo se calcula de forma correcta (ver tambin "Mltiples Halos"). Tambin deberamos observar que cuando tenemos varios objetos contenedores muy prximos unos a otros pero sin superposicin real, son tratados de forma correcta. Si ponemos un objeto contenedor en frente de otro los halos son trazados correctamente. 4.8.5.6.3. Mltiples halos atenuantes

Actualmente no es posible usar mltiples halos atenuantes con distintos mapas de color. El mapa de color del ltimo halo ser usado para todos los halos en el objeto contenedor. 4.8.5.6.4. Halos y objetos vacos

Para trazar de forma correcta los efectos del halo tenemos que asegurarnos de que todos los objetos dentro de los cuales se encuentra la cmara sean vacos. Esto se consigue aadiendo el identificador hollow. 4.8.5.6.5. Escalando el contenedor de un halo

Si escalamos el objeto contenedor de un halo deberamos tener en cuenta que es importante el lugar donde coloquemos el identificador scale. Escalar el objeto antes de la declaracin del halo solo escalara el objeto contenedor, no el halo. Esto es til cuando queremos evitar que la superficie del objeto contenedor sea visible debido al uso de la turbulencia. Como hemos aprendido en las secciones anteriores, las partculas pueden moverse fuera del objeto contenedor, donde son invisibles, si se aade turbulencia. Esto solo funciona para el mapeado esfrico y el mapeado de caja debido a que los campos de densidad descritos por los otros mapeados no tienen dimensiones finitas. Si se usa el identificador scale despus de la declaracin del halo, ambos, el halo y el objeto contenedor son escalados. Esto es til para escalar el halo segn nuestras necesidades. El halo mantiene su apariencia a pesar de las transformaciones aplicadas al objeto contenedor (despus del halo), es decir, la translucidez, el color y la turbulencia del halo no cambiarn.

4. TUTORIAL PARA PRINCIPIANTES 4.8.5.6.6. Eligiendo una tasa de muestreo

122

Normalmente empezaremos con una baja tasa de muestreo y solo la incrementaremos si aparecen efectos de aliasing (y no desaparecen usando el super-muestreo y el jittering). La apariencia del halo es independiente de la tasa de muestreo siempre que se tomen las suficientes muestras para describir correctamente su forma. Esto significa que una o dos muestras difcilmente sern suficientes para determinar la apariencia del halo. Segn vamos incrementando el nmero de muestras el halo se aproximar rpidamente a su apariencia real. En pocas palabras, el halo no cambiar su apariencia con la tasa de muestreo siempre que tengamos el suficiente nmero de muestras y no nos encontremos con los efectos del aliasing. 4.8.5.6.7. Usando turbulencia

Como dijimos en una de las secciones anteriores la turbulencia no tendr efecto si se usa la funcin de densidad constante (identificador constant). No importa cuanto o en que direccin movamos un punto si la densidad es constante y por lo tanto no depende de la situacin del punto. Tenemos el mismo valor de densidad para todas la localizaciones. Siempre que aadamos turbulencia a un halo debemos evitar la funcin de densidad constante.

4.9. Trabajar con texturas especiales


Muchos de los patrones de color que hemos visto hasta ahora en POV-Ray usan una instruccin color_map para juntar diversos colores. Dependiendo de la lista de colores, podemos cambiar gradual o bruscamente de un color a otro. De hecho, el mapa de color es una herramienta muy poderosa para personalizar los diversos patrones de color, aunque requiere un poco de prctica usarla correctamente. Adems, a partir de la versin 3, POV-Ray nos permite unir diversos patrones, normales, acabados, e incluso texturas completas de la misma forma que mezclamos colores. Para experimentar con algunas de las excitantes opciones de textura, preparemos una escena bsica, a la que aplicaremos las texturas que diseemos ms adelante. Empecemos llamando a los archivos de inclusin de colores y texturas predefinidos, y poniendo una cmara y una fuente de luz.
#include "colors.inc" #include "textures.inc" camera { orthographic up <0, 5, 0> right <5, 0, 0> location <0, 0, -25> look_at <0, 0, 0> } light_source { <100, 100, -100> color White }

4.9.1. Trabajar con mapas de pigmentos


Empecemos con algo sencillo. No debemos confundir el mapa de colores con el mapa de pigmentaciones, ya que el mapa de colores slo admite colores como entradas, mientras que en el mapa de pigmentos podemos usar como elementos a mezclar pigmentos completos. Probemos a colorear un plano con un mapa de pigmentos. En el prximo ejemplo, vamos a declarar cada uno de los pigmentos

PERSISTENCE OF VISION RAYTRACER

123

que utilicemos. No es estrictamente necesario hacerlo (podemos colocar la descripcin completa en cada entrada del mapa), aunque habitualmente es ms cmodo de leer.
// cuadrados Blancos y Negros... es un clsico. #declare Pigment1 = pigment { checker color Black color White scale .1 } // un efecto de anillos psicodlicos #declare Pigment2 = pigment { wood color_map { [ 0.0 Red ] [ 0.3 Yellow ] [ 0.6 Green ] [ 1.0 Blue ] } } plane { -z, 0 pigment { gradient x pigment_map { [ 0.0 Pigment1 ] [ 0.5 Pigment2 ] [ 1.0 Pigment1 ] } } }

Vale, lo que hemos hecho es sencillo y probablemente fcil de entender si hemos trabajado anteriormente con mapas de colores. Hemos colocado un mapa de pigmentos donde suele ir un mapa de colores, y hemos situado nuestros pigmentos predeclarados como entradas del mapa. Cuando vemos la imagen, observamos un patrn a bandas de cuadrados negros y de anillos concntricos, de forma que las transiciones entre un patrn y otro son suaves, mezclndose ambos patrones en el centro de los cambios. Tambin podemos hacer transiciones bruscas, retocando algo el mapa de pigmentos.
pigment_map { [ 0.0 Pigment1 [ 0.5 Pigment1 [ 0.5 Pigment2 [ 1.0 Pigment2 } ] ] ] ]

4.9.2. Trabajar con mapas de normales


Para nuestro ejemplo prximo, reemplazaremos el plano anterior por este:
plane { -z, 0 pigment { White } normal { gradient x normal_map { [ 0.0 bumps 1 scale .1] [ 1.0 ripples 1 scale .1] } } }

Hemos elegido un color slido para que se vean ms claramente los bultos. Adems, observamos que nuestro mapa mezcla suavemente bultos y ondas, para luego saltar bruscamente (por ser un gradiente) al comienzo de nuevo. De esta manera, podemos ver qu sucede tanto cuando cambiamos bruscamente el patrn como cuando lo cambiamos lentamente.

4. TUTORIAL PARA PRINCIPIANTES

124

La sintaxis de la instruccin es la que podamos esperar. Hemos cambiado el tipo de mapa, ponindolo esta vez en el bloque de normal, y hemos colocado como parmetros tipos de normal. Recordemos que en POV-Ray 3, todos los patrones que funcionan como colores funcionan como normales, y viceversa, as que podemos cambiar de madera a granito, por ejemplo. Deberamos investigar un poco esto, para entender el aspecto que pueden tener estos patrones como normales. Tras ver lo interesante que puede ser mezclar dos patrones en las transiciones, quiz queramos construir una textura en la que dos patrones se mezclen completamente. Esto es posible usando la funcin average. Volveremos a esto ms adelante.

4.9.3. Trabajar con mapas de textura


Ahora que hemos mezclado colores, patrones de pigmentacin y normales, probablemente pensemos y los acabados? Y las texturas completas? Ambos pueden fundirse en un solo apartado, ya que, aunque no hay un mapa de acabados propiamente dicho, puede usarse mapas de textura para obtenerlo, colocando idnticos bloques de normal y pigmento en varias texturas. Pondremos un ejemplo. Hemos eliminado las declaraciones de pigmentos que utilizamos antes, y aadido lo siguiente:
#declare Texture1 = texture { pigment { Grey } finish { reflection 1 } } #declare Texture2 = texture { pigment { Grey } finish { reflection 0 } } cylinder { <-2, 5, -2>, <-2, -5, -2>, 1 pigment { Blue } } plane { -z, 0 rotate y * 30 texture { gradient y texture_map { [ 0.0 Texture1 [ 0.4 Texture1 [ 0.6 Texture2 [ 1.0 Texture2 } scale 2 } }

] ] ] ]

Qu hemos hecho? El plano de fondo alterna verticalmente entre dos texturas, idnticas excepto en su acabado. Cuando lo convertimos en una imagen, el cilindro se refleja en unas zonas del plano y en otras no. Con pequeas adaptaciones, podemos usar esta idea con cualquier patrn, mezclando cualquier tipo de acabado que se nos ocurra. Podemos dar a diferentes partes de un objeto diferentes acabados o diferentes texturas completas. Una pregunta: si existe un mapa de texturas, para qu necesitamos un mapa de pigmentos, o de normales? Sencillo: velocidad de clculo. Si usamos un mapa de texturas, para cada punto afectado, POV-Ray hace los clculos correspondientes a todas las texturas, despus realiza un clculo (media ponderada) entre los resultados que promedia el valor que corresponde al punto. Usar un mapa de pigmentos (o de normales) reduce el nmero de clculos, ya que algunas partes de la textura se calculan una sola vez. Como regla, usaremos preferentemente mapas de normales o pigmentos, dejando los de texturas para cuando lo que queramos sea imposible hacerlo de otra forma.

PERSISTENCE OF VISION RAYTRACER

125

4.9.4. Trabajar con listas de texturas


Si hemos ledo la parte del tutorial dedicada a pigmentos, sabremos que hay tres patrones de color llamados de lista de colores, ya que usan, en lugar de los mapas de colores, una sencilla lista con dos o tres colores inmediatamente despus de la palabra clave. Sus nombres son ajedrezado, hexgonos y ladrillo, nuevo en la versin 3 de POV-Ray. Por supuesto, esto tambin funciona con pigmentos completos, normales, e incluso texturas enteras, igual que los otros patrones anteriormente citados. La nica diferencia es que escribimos los datos tras el patrn (como con los colores individuales), en lugar de preparar un mapa de la forma anterior. Pongamos un ejemplo. Borramos el plano y los pigmentos declarados de nuestro ltimo ejemplo, y escribimos lo siguiente:
#declare Pigment1 = pigment { hexagon color Yellow color Green color Grey scale .1 } #declare Pigment2 = pigment { checker color Red color Blue scale .1 } #declare Pigment3 = pigment { brick color White color Black rotate -90*x scale .1 } box { -5, 5 pigment { hexagon pigment {Pigment1} pigment {Pigment2} pigment {Pigment3} rotate 90*x } }

Empezamos por declarar un ejemplo de cada uno de los patrones como pigmentos individuales. Despus, usamos el patrn hexagonal como una lista de pigmentos, usando los pigmentos predefinidos en esta lista, en lugar de colores individuales. Hay dos instrucciones de girado en este ejemplo, ya que los ladrillos se alinean en direccin z (para cubrir una pared, por defecto), mientras que los hexgonos lo hacen en direccin y (cubriendo un suelo), mientras que nosotros queremos que todos queden frente a la direccin z, que es hacia donde mira la cmara. Por supuesto, en POV-Ray 3, todo lo que vale para pigmentos, vale para normales o texturas enteras. A continuacin vemos algunos ejemplos de su uso.
normal { brick normal {granite .1} normal {bumps 1 scale .1} }

o...
texture { checker texture {Gold_Metal}

4. TUTORIAL PARA PRINCIPIANTES


} texture {Silver_Metal}

126

4.9.5. Y las baldosas?


En versiones anteriores de POV-Ray, exista una textura especial llamada baldosa (tiles). Ahora podemos substituirla por un patrn ajedrezado (como hemos visto anteriormente), as que ha quedado obsoleta debido a la flexibilidad de la nueva sintaxis. POV-Ray 3.0 an comprende la instruccin para mantener la compatibilidad con imgenes preparadas para versiones anteriores, aunque deberamos acostumbrarnos a usar los patrones de listas de texturas.

4.9.6. Funcin promedio


Las cosas se ponen interesantes. Hemos visto cmo los pigmentos y las normales se transforman gradualmente cuando las colocamos en mapas de normales, pigmentos o texturas. Pero y si queremos que nuestra textura sea una mezcla de dos en todo el objeto? Ahora disponemos de una funcin nueva, llamada promedio (average) que nos lo permite. Esta funcin trabaja con pigmentos, normales y texturas, aunque su sintaxis es ligeramente distinta de los patrones estudiados antes. Si no estamos advertidos, el cambio nos podra confundir. Probamos en nuestro archivo, borrando todos los objetos y usando los siguientes.
plane { -z, 0 pigment { White } normal { average normal_map { [ gradient x ] [ gradient y ] } } }

Lo que hemos hecho es bastante claro de por s, tan pronto como lo vemos convertido en un dibujo. Hemos combinado un gradiente horizontal con uno vertical, creando unos gradientes cruzados. Realmente, este efecto es una mezcla suave de las normales anteriores. Cul es el cambio en la sintaxis? Podemos ver cmo ha cambiado la declaracin del mapa de normales. El valor decimal que preceda cada entrada del mapa ha desaparecido. Este nmero indicaba en qu punto se iniciaba la mezcla entre uno y otro, y ahora la mezcla se realiza en todo el objeto. De hecho, el promedio no usa esos valores como esperamos, si no como pesos para las mezclas, e incluirlos puede dar lugar a resultados imprevistos.

4.9.7. Trabajar con texturas superpuestas


Con los abundantes colores, patrones y opciones para crear texturas complejas de POV-Ray, fcilmente podemos crear texturas apropiadas para nuestras creaciones. Sin embargo, tarde o temprano nos veremos obligados a usar la posibilidad que aqu se trata. Por ejemplo, imagina una madera barnizada sobre la que alguien ha manchado con un poco de pintura amarilla, dejando unas manchas irregulares a travs de las cuales puede verse la madera. Y bien? Es difcil crear una textura que rena todas esas condiciones. Quiz el lector est pensando en pegar una imagen simulando este efecto, pero an queda una solucin: superponer varias texturas. Slo tenemos que especificar una serie de varias texturas, una tras otra, asociadas al mismo objeto. Se le aplicarn como capas de pintura, una tras otra, en el orden en que aparezcan.

PERSISTENCE OF VISION RAYTRACER

127

Es importante que recordemos asignar un grado de transparencia (filtro o transmitancia) a parte de las texturas que situemos en las capas superiores, ya que en caso contrario las inferiores no servirn para nada. No recibiremos ningn mensaje de error, tcnicamente es legal, sencillamente no tiene sentido. Es como pasarse horas pintando una imagen elaborada en un muro, para despus darle una capa de ltex blanco encima, ocultndola totalmente. Diseemos un objeto muy simple con texturas superpuestas y observemos cmo funciona. Creamos un archivo llamado LAYTEX.POV y escribimos:
#include "colors.inc" #include "textures.inc" camera { location <0, 5, -30> look_at <0, 0, 0> } light_source { <-20, 30, -50> color White } plane { y, 0 pigment { checker color Green color Yellow background { rgb <.7, .7, 1> } box { <-10, 0, -10>, <10, 10, 10> texture { Silver_Metal // un objeto metlico... normal { // ... algo abollado dents 2 scale 1.5 } } // (fin de la textura base) texture { // ... tiene alguna manchas de xido ... pigment { granite color_map { [0.0 rgb <.2, 0, 0> ] [0.2 color Brown ] [0.2 rgbt <1, 1, 1, 1> ] [1.0 rgbt <1, 1, 1, 1> ] } frequency 16 } } // (fin de la textura de manchas de xido) texture { // ... y algunas manchas negras pigment { bozo color_map { [0.0 color Black ] [0.2 color rgbt <0, 0, 0, .5> ] [0.4 color rgbt <.5, .5, .5, .5> ] [0.5 color rgbt <1, 1, 1, 1> ] [1.0 color rgbt <1, 1, 1, 1> ] } scale 3 } } // (fin de la textura de las manchas negras) } // (fin de la caja) } }

Bueno. Esto se complica, as que para hacerlo ms sencillo de entender, hemos incluido comentarios explicando lo que hace cada parte, y dnde acaba. Para empezar, slo creamos una caja sobre un suelo ajedrezado tpico, y dimos al cielo de fondo un tono de azul liso. Y despus...

4. TUTORIAL PARA PRINCIPIANTES

128

Para empezar, dimos a la caja la textura Silver_Metal, declarada en TEXTURES.INC (si quieres nota, mira en el archivo indicado y comprueba que esta textura figura ah). Para dar impresin de desgaste, hemos aadido un patrn de normal abollado (dents). Esto produce la sensacin de que nuestra misteriosa caja metlica ha sido golpeada. Las pequeas manchas de xido no son mas que un patrn granito que vara de rojo oscuro a marrn y despus pasa de golpe a ser totalmente transparente, siendo as la mayor parte del mapa de color. Vale, probablemente habramos conseguido un patrn de manchas ms realista usando mapas de pigmentos, pero eso corresponde a otra seccin del manual, as que no lo pensemos por ahora. Por ltimo, hemos aadido otra textura al bloque. La distribucin llamada bozo vara desde centros oscuros a gris semi-transparente y despus se vuelve totalmente transparente durante la mitad del mapa de colores. Da aspecto de manchas oscuras (quiz producidas por fuego) que estn adheridas a la superficie de la caja (por encima de las manchas de xido). El resultado final es un misterioso bloque metlico ciertamente maltratado, de una forma en la que una sola textura no habra podido nunca. 4.9.7.1. Declarar texturas superpuestas

En el caso de que queramos usar un conjunto de texturas superpuestas en varios objetos de nuestra escena, es perfectamente legal declarar una textura as. No la tendremos que repetir cada vez, aunque el formato general debe parecerse a lo siguiente:
#declare Abused_Metal = texture { /* aqu va la textura base... */ } texture { /* y aqu las manchas de xido... */ } texture { /* y, por supuesto, aqu las manchas negras. */ }

POV-Ray no tiene ningn problema en reconocer dnde termina la declaracin, ya que las texturas se escriben una tras otra sin objetos ni directivas en medio. Las texturas superpuestas declaradas continuarn hasta que encuentre algo que no sea una textura, de forma que podemos apilar un nmero indeterminado de ellas. Una ltima aclaracin sobre las texturas: si utilizamos texturas superpuestas, declaradas o no, debemos olvidarnos de las abreviaturas para texturas (escribir slo el pigmento, o slo el acabado...), ya que este mtodo no se extiende a este tipo de texturas. Podemos apilar texturas completas, no trozos de textura. Lo siguiente:
#declare Bad_Texture = texture { /* insert your base texture here... */ } pigment { Red filter .5 } normal { bumps 1 }

no funcionar. El pigmento y la normal no son parte definida de una textura, Podemos escribirlos as si no hubiese una textura base, pero as generar un error. 4.9.7.2. Otro ejemplo de texturas superpuestas

Para explicar con mayor detalle cmo funcionan las texturas superpuestas, se describe otro ejemplo en detalle. Creamos un mantel para una escena de comida en el campo. Un mantel a cuadros blancos y rojos slo resulta demasiado nuevo, demasiado plano, como un trozo de suelo, se usan texturas superpuestas para manchar la tela. Creamos una escena que contiene cuatro cajas. La primera de ellas tendr la textura base a cuadros rojos y blancos, que usaremos de punto de partida, la segunda aade una capa que ensucia la tela de forma realista, la tercera aade algo de vino a la tela, y la cuarta coloca unas pocas arrugas (no otra textura superpuesta, aunque debemos fijarnos qu cambios en la textura provocan este efecto en el resultado).

PERSISTENCE OF VISION RAYTRACER

129

Empezamos situando una cmara, luces, y la primera caja. En este momento, la textura no es superpuesta, claro. Observa el archivo LAYERED1.POV.
#include "colors.inc" camera { location <0, 0, -6> look_at <0, 0, 0> } light_source { <-20, 30, -100> color White } light_source { <10, 30, -10> color White } light_source { <0, 30, 10> color White } #declare PLAIN_TEXTURE = // cuadros blancos y rojos texture { pigment { checker color rgb<1.000, 0.000, 0.000> color rgb<1.000, 1.000, 1.000> scale <0.2500, 0.2500, 0.2500> } } // caja roja y blanca a cuadros box { <-1, -1, -1>, <1, 1, 1> texture { PLAIN_TEXTURE } translate <-1.5, 1.2, 0> }

No hay nada especial en esta escena no? Usaremos nuevas texturas para hacerla ms interesante. Primero aadiremos una capa con dos grises distintos, parcialmente transparentes. Los distribuiremos en cuadrcula, de la misma forma que antes, aunque usaremos algo de turbulencia para hacer ms realista el oscurecimiento. Aadimos la siguiente caja a la escena previa y reconstruimos la imagen.
#declare FADED_TEXTURE = // cuadrados rojos y blancos texture { pigment { checker color rgb<0.920, 0.000, 0.000> color rgb<1.000, 1.000, 1.000> scale <0.2500, 0.2500, 0.2500> } } // grises para oscurecer el rojo y blanco texture { pigment { checker color rgbf<0.632, 0.612, 0.688, 0.698> color rgbf<0.420, 0.459, 0.520, 0.953> turbulence 0.500 scale <0.2500, 0.2500, 0.2500> } } // caja con cuadros oscurecida box { <-1, -1, -1>, <1, 1, 1> texture { FADED_TEXTURE }

4. TUTORIAL PARA PRINCIPIANTES


} translate <1.5, 1.2, 0>

130

Aunque pensemos que es una sutil diferencia, los cuadros rojos y blancos ya no parecen tan nuevos. Como hay una botella de vino en la escena, pensamos que sera un toque interesante aadir una o dos manchas. Este efecto puede lograrse situando una burbuja muy plana en la tela, aunque lograramos el efecto del vino derramado, no de la mancha producida. Es el momento de aadir otra capa. De nuevo, aadimos una caja y reconstruimos.
#declare STAINED_TEXTURE = // cuadros rojos y blancos texture { pigment { checker color rgb<0.920, 0.000, 0.000> color rgb<1.000, 1.000, 1.000> scale <0.2500, 0.2500, 0.2500> } } // grises texture { pigment { checker color rgbf<0.634, 0.612, 0.688, 0.698> color rgbf<0.421, 0.463, 0.518, 0.953> turbulence 0.500 scale <0.2500, 0.2500, 0.2500> } } // mancha de vino texture { pigment { spotted color_map { [ 0.000 color rgb<0.483, 0.165, 0.165> ] [ 0.329 color rgbf<1.000, 1.000, 1.000, 1.000> ] [ 0.734 color rgbf<1.000, 1.000, 1.000, 1.000> ] [ 1.000 color rgb<0.483, 0.165, 0.165> ] } turbulence 0.500 frequency 1.500

// caja sucia box { <-1, -1, -1>, <1, 1, 1> texture { STAINED_TEXTURE } translate <-1.5, -1.2, 0> }

Ahora disponemos de un mantel con personalidad. Queremos aadir otro toque, en forma de algunas arrugas en el mantel. Aunque esto no significa aadir una capa nueva, debemos tener en cuenta que hay que hacerlo sobre la ltima capa, ya que no tiene ningn efecto modificar la normal de las capas inferiores (aunque las superiores sean totalmente transparentes). Aadimos esta caja final y reconstruimos.

PERSISTENCE OF VISION RAYTRACER


#declare WRINKLED_TEXTURE = // cuadros rojos y blancos texture { pigment { checker color rgb<0.920, 0.000, 0.000> color rgb<1.000, 1.000, 1.000> scale <0.2500, 0.2500, 0.2500> } } // grises para oscurecer texture { pigment { checker color rgbf<0.632, 0.612, 0.688, 0.698> color rgbf<0.420, 0.459, 0.520, 0.953> turbulence 0.500 scale <0.2500, 0.2500, 0.2500> } } // manchas de vino texture { pigment { spotted color_map { [ 0.000 color rgb<0.483, 0.165, 0.165> ] [ 0.329 color rgbf<1.000, 1.000, 1.000, 1.000> ] [ 0.734 color rgbf<1.000, 1.000, 1.000, 1.000> ] [ 1.000 color rgb<0.483, 0.165, 0.165> ] } turbulence 0.500 frequency 1.500 } normal { wrinkles 5.0000 } } // caja arrugada box { <-1, -1, -1>, <1, 1, 1> texture { WRINKLED_TEXTURE } translate <1.5, -1.2, 0> }

131

Puede que este no sea el mantel ideal para ir al campo, pero si comparamos la ltima caja con la primera, veremos cunta profundidad, dimensin y personalidad es posible crear usando slo texturas originales. Una nota: los comentarios para la normal no son vlidos para los acabados. Si una capa tiene reflexin especular, y la superior no, donde la capa superior sea transparente veremos la reflexin especular.

4.9.8. Cuando todo falla: mapas de materiales


Tenemos a nuestra disposicin algunas herramientas para dar textura a los objetos que son bonitas y poderosas, pero qu sucede si queremos disponer de la variedad de las texturas naturales? Bueno, como hay mapas de imgenes para pigmentos, y mapas de bultos para definir las normales, las texturas completas pueden combinarse siguiendo los colores de un mapa de bits, que se denomina mapa de materiales.

4. TUTORIAL PARA PRINCIPIANTES

132

Como en los otros casos, necesitamos un archivo que contenga la imagen original que ser utilizada por POV-Ray para decidir el tipo de textura que aplicar a cada punto, y especificar qu textura va asociada a cada uno de los ndices de la paleta de la imagen. Para construir dicha imagen, necesitamos que el programa de dibujo nos deje elegir los colores por su ndice (el color es irrelevante, slo importa el ndice que va a ocupar en la paleta). Si tenemos el paquete completo que viene con POV-Ray, tendremos entre los ficheros de inclusin una imagen llamada POVMAP.GIF, que slo usa los cuatro primeros colores de la paleta para dibujar un cuadro con las palabras Persistence of Vision dentro. Esta imagen servir de muestra en nuestro prximo ejemplo. Usando de nuevo nuestra cmara y luz de siempre, y los ficheros de inclusin ms tpicos, completamos el fichero con el siguiente objeto:
plane { -z, 0 texture { material_map { gif "povmap.gif" interpolate 2 once texture { PinkAlabaster } // borde interno texture { pigment { DMFDarkOak } } // borde externo texture { Gold_Metal } // letras texture { Chrome_Metal } // el panel } translate <-0.5, -0.5, 0> scale 5 } }

La posicin de las luces y la ausencia de fondo puede que no dejen que la imagen tenga demasiada brillantez, pero podremos ver cmo funciona este proceso. Las texturas son situadas sencillamente segn los colores de la imagen. Al usar la palabra clave once (para no repetir la imagen en la textura) y trasladar y escalar la imagen, la vemos al completo delante de nuestra cmara. Por supuesto, esto slo funciona con imgenes con paleta, como las GIF y algunos tipos de PNG. Sin embargo, s pueden usarse imgenes sin paletas para construir algunos efectos. Veamos cmo usar POV-Ray para producir imgenes de este tipo para l mismo. Para empezar, si usamos una imagen sin paleta, POV-Ray slo hace caso a los ocho bits del color rojo para determinar qu textura usa. Necesitamos controlar perfectamente el color que van a tener los pxeles de nuestra imagen, cosa que podemos lograr si 1. Usamos una instruccin rgb para precisar los colores 2. No usamos luces, y aplicamos un ambiente de 1 para garantizar que el color resultado no va a variar. Confundido? Bien, pongamos un ejemplo. Generaremos un mapa de bits muy similar a POVMAP.GIF, excepto que ser en formato TGA. Le vamos a dar color verde y azul, pero esto es slo para que nosotros, las personas, podamos distinguir cmodamente los colores, ya que no podemos apreciar variaciones de rojo de 1/255 unidades. Sin esas variaciones, la imagen aparecera negra a nuestros ojos, de forma que podramos usar POV-Ray para enviar mensajes secretos, aunque no es ese el uso que le queremos dar. Queremos ver qu aspecto va a tener nuestra imagen. Reconstruiremos el cdigo siguiente, llamando al resultado POVMAP.TGA
camera { orthographic up <0, 5, 0> right <5, 0, 0> location <0, 0, -25> look_at <0, 0, 0>

PERSISTENCE OF VISION RAYTRACER


} plane { -z, 0 pigment { rgb <1/255, 0, 0.5> } finish { ambient 1 } } box { <-2.3, -1.8, -0.2>, <2.3, 1.8, -0.2> pigment { rgb <0/255, 0, 1> } finish { ambient 1 } } box { <-1.95, -1.3, -0.4>, <1.95, 1.3, -0.3> pigment { rgb <2/255, 0.5, 0.5> } finish { ambient 1 } } text { ttf "crystal.ttf", "The vision", 0.1, 0 scale <0.7, 1, 1> translate <-1.8, 0.25, -0.5> pigment { rgb <3/255, 1, 1> } finish { ambient 1 } } text { ttf "crystal.ttf", "Persists!", 0.1, 0 scale <0.7, 1, 1> translate <-1.5, -1, -0.5> pigment { rgb <3/255, 1, 1> } finish { ambient 1 } }

133

Todo lo que tenemos que hacer ahora es modificar nuestro ejemplo anterior de forma que situemos TGA en lugar de GIF, en el tipo de imagen y en su nombre. Comprobaremos al reconstruirlo que el resultado es muy similar, slo que no tenemos que usar un programa externo para crear la imagen: POV-Ray lo hace todo!

4.9.9. Limitaciones de las texturas especiales


Hay un par de limitaciones a las texturas especiales que hemos estudiado (las que tienen que ver con mapas de bits). En primer lugar, si hemos usado la textura por defecto para todos los elementos de nuestra escena, no podr estar compuesta de ninguna de las caractersticas mencionadas. Es un mal menor, ya que podemos declarar la textura y asignarla individualmente a todos los objetos. No nos impide realmente hacer nada. La otra limitacin es ms grave, aunque tambin se puede esquivar. Al trabajar con texturas superpuestas, hemos visto que podamos apilar una sobre otra indefinidamente (siempre y cuando hubiese transparencia en las superiores). Esta tcnica tan til tiene, sin embargo, problemas cuando se usa como base las texturas especiales que mencionbamos. Aunque hay una solucin! Por ejemplo, supongamos que tenemos una textura llamada Speckled_Metal, que produce una superficie metlica plateada, y ponemos pequeas manchas de xido sobre ella. Supongamos que entonces , para ms realismo, decidimos poner manchas de xido ms realistas sobre la superficie. Uno de los mtodos es crear un mapa de texturas con transparencias para usar como capa superior. Sin embargo, obtendremos un mensaje de error si lo intentamos. La solucin que se propone es hacer nuestra textura parte del mapa de texturas empleados, de la forma siguiente:
// Declaramos un pigmento que // usaremos en las manchas de xido #declare Rusty = pigment { granite color_map {

4. TUTORIAL PARA PRINCIPIANTES


[ 0 rgb <0.2, 0, 0> ] [ 1 Brown ]

134

} frequency 20

// Aqu se aplica // Observa que nuestra textura original // "Speckled_Metal" ahora es parte del mapa #declare Rust_Patches = texture { bozo texture_map { [ 0.0 pigment {Rusty} ] [ 0.75 Speckled_Metal ] [ 1.0 Speckled_Metal ] } }

Y el efecto es el mismo que si hubisemos superpuesto las manchas de xido en la superficie pulida. Usando los patrones, pigmentos, normales, acabados, capas y texturas especiales no hay nada prcticamente que no podamos crear como textura. Una casi infinita variedad de posibilidades nos esperan!

4.10. Usando los efectos atmosfricos


POV-Ray ofrece una variedad de efectos atmosfricos, es decir, caractersticas que afectan al ambiente de una escena. Es fcil asignar un color simple o un complicado diseo a una esfera celeste virtual (sky_sphere). Puedes crear cualquier cosa, desde un azul y despejado cielo de verano hasta uno densamente nublado y tormentoso. Incluso un cielo estrellado puede ser creado fcilmente. Puedes usar distintos tipos de nieblas para crear escenas brumosas. Mltiples capas de niebla de distintos colores pueden dar un toque siniestro a tu escena. Un efecto mucho ms realista se consigue usando una atmsfera, una niebla constante que interacta con la luz proveniente de las fuentes. Los rayos de luz se tornan visibles y los objetos proyectan sombras sobre la niebla.

4.10.1. Background
La caracterstica background se usa para asignar un color a todos los rayos que no incidan sobre ningn objeto. Se usa de la siguiente forma.
camera { location <0, 0, -10> look_at <0, 0, 0> } background { color rgb <0.2, 0.2, 0.3> } sphere { 0, 1 pigment { color rgb <0.8, 0.5, 0.2> } }

El color asignado al fondo ser visible al usar una esfera celeste solo si queda algo de translucidez despus de que las capas de pigmento de esta sean procesadas.

PERSISTENCE OF VISION RAYTRACER

135

4.10.2. La esfera celeste


La esfera celeste (sky_sphere) puede ser usada para crear, de una forma fcil, cielos nublados, cielos nocturnos con estrellas o cualquier clase de cielo que se te ocurra. En los siguientes ejemplos empezaremos con una esfera celeste muy simple que se ir volviendo cada vez ms y ms compleja segn vayamos aadiendo nuevas caractersticas. 4.10.2.1. Creando el cielo con un gradiente de colores

Junto con la esfera monocolor que puede ser creada con la caracterstica background, la esfera celeste ms simple es un gradiente de colores. Podemos advertir que el color del cielo vara segn el ngulo con la normal al plano de superficie. Si miras directamente hacia arriba el cielo tendr el color de un azul ms profundo que en el horizonte. Queremos modelar este efecto usando una esfera celeste como se muestra en la siguiente escena (SKYSPH1.POV).
#include "colors.inc" camera { location <0, 1, -4> look_at <0, 2, 0> angle 80 } light_source { <10, 10, -10> White } sphere { 2*y, 1 pigment { color rgb <1, 1, 1> } finish { ambient 0.2 diffuse 0 reflection 0.6 } } sky_sphere { pigment { gradient y color_map { [0 color Red] [1 color Blue] } scale 2 translate -1 } }

La parte interesante es la declaracin de la esfera celeste. Contiene un pigmento que describe la apariencia de la esfera. Queremos crear un gradiente de colores a lo largo del ngulo de visin medido contra la normal al plano de superficie. Ya que el vector director ser usado para calcular los colores del pigmento tenemos que usar el gradiente y. Las transformaciones de translacin y escalado se usan para distribuir los puntos derivados del vector director a un rango adecuado. Sin estas transformaciones el diseo sera repetido dos veces sobre la esfera celeste. El escalado se usa para evitar la repeticin y la sentencia translate -1 para mover el color correspondiente al ndice 0 al fondo de la esfera (al punto que veras si miraras directamente hacia abajo).

4. TUTORIAL PARA PRINCIPIANTES

136

Despus de estas transformaciones la entrada de color en la posicin 0 del mapa de color estar en el fondo de la esfera, es decir, por debajo de nosotros y el color en la posicin 1 estar en lo ms alto, es decir, por encima de nosotros. Los colores para el resto de las posiciones son interpolados entre estos dos colores tal como puedes ver en la imagen resultante.

Figura 42: Una esfera celeste con un gradiente simple Si quieres que uno de los colores empiece a partir de un ngulo especfico primero tienes que convertir el ngulo a un ndice del mapa de color. Esto se hace usando la frmula

indice _ mapa _ color =

1 Cos(angulo) 2

donde el ngulo se mide contra la normal (en el sentido negativo) al plano de superficie. Podramos decir que es la normal que apunta al centro de la tierra. Un ngulo de 0 grados describe el punto justo debajo de nosotros, mientras que un ngulo de 180 representara el cenit. En POV-Ray debes primero convertir el valor en grados a radianes como se muestra en el siguiente ejemplo.
sky_sphere { pigment { gradient y color_map { [(1-cos(radians( 30)))/2 color Red] [(1-cos(radians(120)))/2 color Blue] } scale 2 translate -1 } }

Esta escena usa un gradiente de colores que empieza con un rojo a los 30 grados y se transforma en azul a los 120 grados. Por de bajo de 30 grados todo es de color rojo, mientras que por encima de los 120 todo es azul.

PERSISTENCE OF VISION RAYTRACER 4.10.2.2. Aadiendo el sol

137

En el siguiente ejemplo crearemos un cielo con un sol rojo rodeado por un halo del mismo color que se va fundiendo en un cielo azul oscuro. Haremos esto usando solamente la esfera celeste. La esfera celeste que usamos es mostrada a continuacin. Tambin se ha aadido un plano de suelo para mayor realismo (SKYSPH2.POV).
sky_sphere { pigment { gradient y color_map { [0.000 0.002 color color [0.002 0.200 color color } scale 2 translate -1 } rotate -135*x }

rgb rgb rgb rgb

<1.0, <1.0, <0.8, <0.2,

0.2, 0.2, 0.1, 0.2,

0.0> 0.0>] 0.0> 0.3>]

plane { y, 0 pigment { color Green } finish { ambient .3 diffuse .7 } }

El diseo del gradiente y las transformaciones dentro del pigmento son las mismas que en el ejemplo de la seccin anterior. El mapa de color consiste de tres colores. Un rojo brillante y ligeramente amarillento es usado para el sol, un rojo ms oscuro para el halo y un azul oscuro para el cielo nocturno. El color del sol tan solo cubre una pequea parte de la esfera celeste debido a que no queremos que tenga un tamao demasiado grande. El color se usa en los valores 0.000 y 0.002 del mapa de color para obtener un acusado contraste en el valor 0.002 (no queremos que el sol se funda con el cielo). El rojo ms oscuro usado para el halo se funde con el azul del cielo entre los valores 0.002 y 0.200 del mapa de color. Todos los valores por encima de 0.200 mostrarn el color azul oscuro del cielo. La sentencia rotate -135*x se usa para rotar tanto el sol como el cielo a su posicin final. Si esta rotacin el sol estara situado a 0 grados, es decir, por debajo de nosotros.

4. TUTORIAL PARA PRINCIPIANTES

138

Figura 43: Un sol rojo desciende en la noche Observando la imagen resultante podemos ver los impresionantes efectos que podemos conseguir con la esfera celeste. 4.10.2.3. Aadiendo algunas nubes

Para mejorar todava ms nuestra imagen queremos aadir algunas nubes aadiendo un segundo pigmento. Este nuevo pigmento usa el diseo bozo para crear algunas nubes. Ya que se encuentra situado sobre el otro pigmento necesita que algunos colores del mapa de color sean translcidos (observa las entradas de 0.5 a 1.0).
sky_sphere { pigment { gradient y color_map { [0.000 0.002 color rgb <1.0, 0.2, 0.0> color rgb <1.0, 0.2, 0.0>] [0.002 0.200 color rgb <0.8, 0.1, 0.0> color rgb <0.2, 0.2, 0.3>] } scale 2 translate -1 } pigment { bozo turbulence 0.65 octaves 6 omega 0.7 lambda 2 color_map { [0.0 0.1 color rgb <0.85, 0.85, 0.85> color rgb <0.75, 0.75, 0.75>] [0.1 0.5 color rgb <0.75, 0.75, 0.75> color rgbt <1, 1, 1, 1>] [0.5 1.0 color rgbt <1, 1, 1, 1> color rgbt <1, 1, 1, 1>] } scale <0.2, 0.5, 0.2> } rotate -135*x }

PERSISTENCE OF VISION RAYTRACER

139

Figura 44: Un cielo nublado con un sol poniente La esfera celeste tiene un inconveniente como podrs haber notado al observar la imagen final (SKYSPH3.POV). El sol no emitir ninguna luz y las nubes no proyectarn ninguna sombra. Si quieres tener nubes que proyecten sombras tendrs que usar una esfera corriente de gran tamao con la textura adecuada y una fuente de luz situada en algn lugar en el exterior de la esfera.

4.10.3. La niebla
Puedes usar la caracterstica fog para aadir niebla de dos tipos distintos a tu escena: niebla constante y niebla de suelo. La primera tiene una densidad constante en todos los puntos mientras que en la segunda la densidad decrece segn nos movemos hacia arriba. 4.10.3.1. La niebla constante

El tipo ms simple de niebla es la niebla constante que tiene la misma densidad en todos los puntos. Se especifica mediante el identificador distance que describe la densidad y el identificador color que describe su color. El valor de distance determina la distancia a la cual el 36.8% del fondo es todava visible (para una explicacin ms detallada sobre como se calcula la niebla leer la seccin de referencia "Niebla"). El color de la niebla puede ser usado para crear cualquier cosa desde una niebla de un color blanco inmaculado hasta un rojo sangre. Tambin puedes usar una niebla negra para simular el efecto de un limitado rango de visin. El siguiente ejemplo muestra como aadir niebla a una escena simple (FOG1.POV).
#include "colors.inc" camera { location } <0, 20, -100>

background { colour SkyBlue } plane { y, -10 pigment {

4. TUTORIAL PARA PRINCIPIANTES


checker colour Yellow colour Green scale 20

140

sphere { <0, 25, 0>, 40 pigment { Red } finish { phong 1.0 phong_size 20 } } sphere { <-100, 150, 200>, 20 pigment { Green } finish { phong 1.0 phong_size 20 } } sphere { <100, 25, 100>, 30 pigment { Blue } finish { phong 1.0 phong_size 20 } } light_source { <100, 120, 40> colour White} fog { distance 150 colour rgb<0.3, 0.5, 0.2> }

Figura 45: Una escena brumosa Las esferas en esta escena se desvanecen, en mayor o en menor medida dependiendo de su distancia, en la niebla verdosa, al igual que el plano a cuadros. 4.10.3.2. Especificando un mnimo de translucidez

Si quieres asegurarte de que el fondo no se desvanece completamente en la niebla puedes modificar el canal de transmitancia del color de la niebla a la cantidad de fondo que quieres que sea siempre visible. Usando un valor de transmitancia de 0.2 como en
fog { distance 150 colour rgbt<0.3, 0.5, 0.2, 0.2> }

PERSISTENCE OF VISION RAYTRACER

141

la translucidez de la niebla nunca cae por debajo del 20% como puedes ver en la imagen resultante (FOG2.POV).

Figura 46: Aadiendo un poco de translucidez te aseguras de que el fondo no se desvanezca 4.10.3.3. Creando niebla filtrante

La niebla verdosa que hemos usado hasta ahora no filtra la luz que pasa a travs de ella. Todo lo que hace es disminuir la intensidad de la luz. Podemos cambiar esto usando un valor distinto de cero para el canal de filtro en el color de la niebla (FOG3.POV).
fog { distance 150 colour rgbf<0.3, 0.5, 0.2, 1.0> }

El valor de filtro determina la cantidad de luz que es filtrada por la niebla. En nuestro ejemplo el 100% de la luz que pase a travs de la niebla ser filtrada por esta. Si hubiramos usado un valor de 0.7 tan solo hubiera sido filtrada el 70% de la luz. El 30% restante hubiera pasado sin ser filtrada.

4. TUTORIAL PARA PRINCIPIANTES

142

Figura 47: una niebla filtrante Te habrs dado cuenta de que no solo disminuye la intensidad de los objetos en la niebla debido al color de esta, si no que tambin los colores son influenciados. La esfera roja y especialmente la azul obtienen un matiz de verde. 4.10.3.4. Aadiendo algo de turbulencia a la niebla

Para hacer que nuestra niebla tenga un aspecto menos montono y ms interesante podemos aadir algo de turbulencia, haciendo parecer que tiene una densidad no constante (FOG4.POV).
fog { distance 150 colour rgbf<0.3, 0.5, 0.2, 1.0> turbulence 0.2 turb_depth 0.3 }

PERSISTENCE OF VISION RAYTRACER

143

Figura 48: Aadiendo un poco de turbulencia hacemos que la niebla tenga un aspecto ms interesante El identificador turbulence es usado para especificar la cantidad de turbulencia usada mientras que el valor asociado a turb_depth es usado para mover el punto en el cual es calculado el valor de la turbulencia a lo largo de la lnea de visin. Valores cercanos a cero mueven el punto hacia el observador mientras que los valores cerca de uno lo mueven hacia el punto de interseccin (el valor por defecto es 0.5). Este parmetro puede ser usado para evitar los fallos que puedan aparecer en la niebla debido a la turbulencia (esto ocurre normalmente en puntos de interseccin muy alejados, especialmente si la interseccin no tiene lugar, es decir, ocurre directamente sobre el fondo). Si esto ocurre simplemente hay que disminuir el valor de turb_depth hasta que el fallo desaparezca. Deberas tener en cuenta que la densidad de la niebla no cambia. Solo el valor de la atenuacin basado en la distancia es modificado por el valor de la turbulencia en un punto a lo largo de la lnea de visin. 4.10.3.5. Usando la niebla de superficie

Un tipo de niebla ms flexible e interesante es la niebla de superficie, que es seleccionada mediante el identificador fog_type. Su apariencia es descrita mediante los identificadores fog_offset y fog_alt. El identificador fog_offset especifica la altura, es decir, el valor Y por debajo del cual la niebla tiene un valor constante de uno. El identificador fog_alt determina con que rapidez la densidad de la niebla se aproxima a cero segn nos movemos por el eje Y. A una altura de fog _ offset + fog _ alt la niebla tendr una densidad del 25%. El siguiente ejemplo (FOG5.POV) usa una niebla de suelo que tiene una densidad constante por debajo de y=25 (el centro de la esfera roja) y disminuye rpidamente para altitudes superiores.
fog { distance 150 colour rgbf<0.3, 0.5, 0.2, 1.0> fog_type 2 fog_offset 25 fog_alt 1 }

4. TUTORIAL PARA PRINCIPIANTES

144

Figura 49: La niebla de superficie slo cubre las partes ms bajas del mundo 4.10.3.6. Usando mltiples capas de niebla

Es posible usar varias capas de niebla escribiendo ms de una declaracin fog en tu fichero de escena. Esto es bastante til si quieres conseguir buenos efectos de turbulencia usando nieblas de suelo. Podras ir aadiendo varias capas de niebla de distintos colores para crear una escena de aspecto siniestro, por ejemplo. Prueba el siguiente ejemplo (FOG6.POV).
fog { distance 150 colour rgb<0.3, 0.5, 0.2> fog_type 2 fog_offset 25 fog_alt 1 turbulence 0.1 turb_depth 0.2 } fog { distance 150 colour rgb<0.5, 0.1, 0.1> fog_type 2 fog_offset 15 fog_alt 4 turbulence 0.2 turb_depth 0.2 } fog { distance 150 colour rgb<0.1, 0.1, 0.6> fog_type 2 fog_offset 10 fog_alt 2 }

PERSISTENCE OF VISION RAYTRACER

145

Figura 50: Se pueden conseguir resultados bastante buenos usando mltiples capas de niebla Puedes combinar nieblas de densidad constante, de suelo, nieblas filtrantes y no filtrantes, nieblas translcidas, etc. 4.10.3.7. La niebla y los objetos vacos

Siempre que uses la caracterstica fog y la cmara se encuentre dentro de un objeto no vaco no obtendrs ningn efecto de niebla. Para una explicacin detallada de porque ocurre esto ver "Objetos Vacos y Objetos Slidos" Para evitar este problema debes hacer que todos esos objetos sean vacos asegurndote de que la cmara se encuentra fuera de ellos (usando el identificador inverse) o aadindoles el identificador hollow (que es mucho ms fcil).

4.10.4. La atmsfera
Nota importante: la atmsfera es una caracterstica experimental de POV-Ray 3.0. Hay una alta probabilidad de que el diseo e implementacin de estas caractersticas cambie en futuras versiones. No podemos garantizar que las escenas que las usen den los mismos resultados en futuras versiones o que se mantenga la compatibilidad de la sintaxis del lenguaje. La atmsfera puede ser usada para modelar la interaccin de la luz con las partculas suspendidas en el aire. Los rayos de luz se volvern visibles y los objetos proyectarn sombras sobre la niebla o el polvo del aire. El modelo atmosfrico usado en POV-Ray supone una densidad constante de partculas en todos los puntos excepto en los objetos slidos. Si quieres crear nieblas o humos con la apariencia de nubes debers usar la propiedad halo de las texturas descrita en la seccin "Halos". 4.10.4.1. Empezando con una habitacin vaca

Queremos crear una escena simple para explicar como funciona el efecto atmsfera y como puedes obtener buenos resultados.

4. TUTORIAL PARA PRINCIPIANTES

146

Imagina una sencilla habitacin con una ventana. La luz entra a travs de la ventana y es dispersada por las partculas de polvo que flotan en el aire. Lo que veras seran unos rayos de luz provenientes de la ventana reflejandose sobre el suelo. Queremos modelar esta escena paso a paso. Los ejemplos siguientes empiezan con la habitacin, la ventana y un foco (spotlight) en algn lugar en el exterior de la habitacin. De momento no hay ninguna atmsfera para que podamos verificar si la iluminacin es la correcta (ATMOS1.POV).
camera { location <-10, 8, -19> look_at <0, 5, 0> angle 75 } background { color rgb <0.2, 0.4, 0.8> } light_source { <0, 19, 0> color rgb 0.5 atmosphere off } light_source { <40, 25, 0> color rgb <1, 1, 1> spotlight point_at <0, 5, 0> radius 20 falloff 20 atmospheric_attenuation on } union { difference { box { <-21, -1, -21>, <21, 21, 21> } box { <-20, 0, -20>, <20, 20, 20> } box { <19.9, 5, -3>, <21.1, 15, 3> } } box { <20, 5, -0.25>, <21, 15, 0.25> } box { <20, 9.775, -3>, <21, 10.25, 3> } pigment { color red 1 green 1 blue 1 } finish { ambient 0.2 diffuse 0.5 } }

Figura 51: La sencilla habitacin con la que queremos empezar La fuente de luz puntual se ha usado para iluminar la habitacin desde el interior sin ninguna interaccin con la atmsfera. Esto se hace aadiendo atmosphere off. No nos tendremos que preocupar de esta fuente de luz cuando aadamos la atmsfera ms tarde.

PERSISTENCE OF VISION RAYTRACER

147

Hemos aadido el identificador atmospheric_attenuation al foco. Esto significa que la luz proveniente de este ser atenuada por la atmsfera. El objeto unin es usado para modelar la habitacin y la ventana. Ya que usamos la diferencia entre dos cajas para modelar la habitacin (las primeras dos cajas en la declaracin difference) no hay necesidad de usar el identificador hollow. Si estamos dentro de esta habitacin, estaremos fuera del objeto (ver tambin "Usando Objetos Vacos y la Atmsfera"). 4.10.4.2. Aadiendo polvo a la habitacin

El siguiente paso es aadir una atmsfera a la habitacin. Esto se consigue con las siguientes lneas (ATMOS2.POV).
atmosphere { type 1 samples 10 distance 40 scattering 0.2 }

El identificador type selecciona el tipo de dispersin atmosfrica que queremos usar. En este caso usamos la dispersin isotrpica que dispersa la luz de igual forma en todas las direcciones (ver "La atmsfera" para ms detalles acerca de los diferentes tipos de dispersin). El identificador samples determina el nmero de muestras a acumular para calcular el efecto atmosfrico. Por cada rayo se toman una serie de muestras a lo largo de este para determinar si la muestra est iluminada o no por una fuente de luz. Si la muestra est iluminada, se determina la cantidad de luz dispersada en la direccin del observador y es aadida a la intensidad total. Siempre puedes empezar con un nmero arbitrario de muestras. Si los resultados no te satisfacen, puedes incrementar la tasa de muestreo para obtener mejores resultados. El problema de elegir una buena tasa de muestreo es mantener el equilibrio entre una imagen satisfactoria y una rpido trazado. Una alta tasa de muestreo casi siempre funcionar bien, pero el trazado de la imagen tambin consumir mucho tiempo. He aqu algo con lo que experimentar. El identificador distance especifica la densidad de la atmsfera. Funciona del mismo modo que el parmetro distance del efecto niebla (fog). Por ltimo pero no menos importante, el valor del identificador scattering determinar la cantidad de luz que es dispersada por las partculas (la luz restante es absorbida). Como vers ms tarde este parmetro es muy til para ajustar el brillo medio de la atmsfera.

4. TUTORIAL PARA PRINCIPIANTES

148

Figura 52: Despus de aadir algo de polvo, los rayos de luz se tornan visibles Observando la imagen creada a partir de la escena anterior notars algunos efectos de aliasing bastante desagradables conocidos como mach-bands. Son el resultado de una baja tasa de muestreo. 4.10.4.3. Eligiendo una buena tasa de muestreo

Como has visto, una tasa de muestreo demasiado baja causa efectos desagradables. Hay formas de reducir o incluso eliminar estos problemas. Una posible solucin es incrementar la tasa de muestreo hasta que los efectos desaparezcan y obtengas una imagen satisfactoria. A pesar de que esto siempre funcionar, es una mala idea debido a que consume demasiado tiempo. Una mejor aproximacin al problema es usar primero las tcnicas de jittering y anti-aliasing. Si esto no funciona, tendrs que incrementar la tasa de muestreo. La tcnica de jittering mueve cada punto una pequea y aleatoria cantidad sobre la direccin de muestreo. Esto ayuda a reducir la regularidad resultante del aliasing. Difcilmente habr algo ms molesto para el ojo humano que los efectos de una baja tasa de muestreo. Es mucho mejor aadir algo de aleatoriedad a las posiciones de las muestras. Usa el identificador jitter seguido de la cantidad de jittering que quieres usar. Son recomendables los valores hasta 0.5. Deberas tener en cuenta el hecho de que el jittering no puede ocultar totalmente los efectos resultantes de una tasa de muestreo demasiado baja. En todo caso puede hacerlos menos visibles. Adicionalmente, un mejor mtodo para reducir los efectos del aliasing es usar el super-muestreo adaptativo. Este mtodo toma muestras adicionales donde es posible que sean necesarias. Si la intensidad de dos muestras adyacentes difiere mucho, son tomadas muestras adicionales en un punto intermedio. Este paso se ejecuta de forma recursiva hasta que es alcanzado un nivel de recursin especfico o la muestra tomada se acerca demasiado a otra adyacente. Los identificadores aa_level y aa_threshold dan control absoluto sobre el proceso de super-muestreo. El identificador aa_level determina el nivel mximo de recursin mientras que

PERSISTENCE OF VISION RAYTRACER

149

aa_threshold especifica la diferencia mxima permitida entre dos muestras antes de que el super-muestreo tenga lugar. Despus de esta parte terica volvemos de nuevo a nuestra escena de muestra y aadimos los identificadores apropiados para usar ambas tcnicas, jittering y super-muestreo (ATMOS3.POV).
atmosphere { type 1 samples 50 distance 40 scattering 0.2 aa_level 4 aa_threshold 0.1 jitter 0.2 }

Se eligi un valor muy bajo para threshold para que se efecte el super-muestreo incluso entre puntos adyacentes de intensidad muy similar. El nivel mximo de recursin de 4 resultar en un mximo de 15 super-muestreos. Si observas los resultados que obtienes despus de aadir jittering y super-muestreo seguramente no estars satisfecho. La nica forma de reducir los defectos todava visibles es incrementar la tasa de muestreo eligiendo un nmero mayor de muestras.

Figura 53: Una alta tasa de muestreo nos lleva a una imagen satisfactoria Haciendo esto obtendrs un buen resultado sin (casi) ningn defecto. Por otro lado la cantidad de polvo flotando en esta habitacin puede ser un poco exagerada pero solo es un ejemplo y los ejemplos tienden a ser exagerados. 4.10.4.4. Usando una atmsfera coloreada

Puedes asignar un color a la atmsfera, lo que te da un mayor control sobre su apariencia. El color se usa para filtrar la luz que pasa a travs de l, ya venga de una fuente de luz, rayos reflejados o refractados o del fondo. La cantidad de luz filtrada por el color de la atmsfera se determina con el valor de filtro (filter) de este. Un valor de 0 significa que la luz no es influenciada por el color de la atmsfera, mientras que un valor de 1 significa que toda la luz ser filtrada por el color.

4. TUTORIAL PARA PRINCIPIANTES

150

Si, por ejemplo, quieres crear una atmsfera rojiza, puedes aadir la siguiente lnea a la declaracin de atmsfera usada en el ejemplo anterior.
color rgbf <1, 0, 0, 0.25>

Usando solamente rgb <1,0,0> no funcionara debido a que el valor de filtro del color sera cero y no filtrara la luz, es decir, el color de esta no sera multiplicado por los valores de la componente RGB. El valor de filtro de 0.25 significa que un 25% de la luz que pasa a travs de la atmsfera ser filtrada por el color rojo y el 75% restante pasar sin ser filtrada. El canal de transmitancia del color de la atmsfera se usa para especificar la translucidez mnima. Por defecto el canal de transmitancia es cero y por lo tanto no existe tal translucidez mnima. Usando un valor positivo te permite determinar la cantidad de luz que siempre pasar a travs de la atmsfera sin tener en cuenta su grosor determinado por el identificador distance. Si usas un color rgbt <0,0,0,0.3> con nuestra habitacin de ejemplo, puedes hacer que el fondo azul sea visible. Hasta ahora estaba oculto debido a la atmsfera. 4.10.4.5. Consejos usando la atmsfera

Es muy difcil obtener resultados satisfactorios cuando usamos el efecto atmsfera. Algunos de los problemas ms comunes sern discutidos en las siguientes secciones para ayudarte a resolverlos (ver tambin la seccin de Preguntas Frecuentes sobre la atmsfera en Preguntas sobre la atmsfera). 4.10.4.5.1. Eligiendo los parmetros de distancia y dispersin

El primer paso difcil es elegir unos buenos valores para la distancia (distance) y la dispersin (scattering). Necesitas poder controlar la visibilidad de los objetos en la escena y los efectos atmosfricos. La mejor solucin es elegir primero el valor de distance. Este valor determina la visibilidad de los objetos en la escena sin tener en cuenta la dispersin de la luz. Funciona de igual forma que el valor distance del efecto niebla (fog). Ya que la niebla es muy similar a la atmsfera, excepto en lo que se refiere a la iluminacin, podemos usarla en lugar de la atmsfera para elegir un valor para la distancia. Si haces esto con la escena de la habitacin que usamos antes, podras usar la siguiente declaracin de niebla en lugar de la atmsfera (ATMOS4.POV).
fog { distance 40 color rgb <0, 0, 0> }

PERSISTENCE OF VISION RAYTRACER

151

Figura 54: Una niebla de color negro puede ser usada para obtener un valor de distancia para la atmsfera Se usa el color negro para simular la atenuacin que obtendras en las partes situadas a la de sombra en la escena con la atmsfera. Si quieres usar una atmsfera coloreada tendrs que usar el mismo color para la niebla que el que quieres usar para la atmsfera, incluyendo los valores del filtro y del canal de transmitancia (ver "Usando una atmsfera coloreada" y "La Atmsfera" para una explicacin del color de la atmsfera). Si quieres simular la apariencia de esas partes iluminadas por una fuente de luz, puedes usar el color de la atmsfera en la declaracin de la niebla. Una vez ests satisfecho con el valor de distancia tendrs que elegir una valor de dispersin (scattering). Este valor te permite adecuar la intensidad de la atmsfera a tus necesidades. Empezando con un valor de uno debers aumentarlo si los efectos atmosfricos son difcilmente visibles. Si no ves nada en las partes iluminadas de la atmsfera, tendrs que decrementar el valor. Deberas tener en cuenta que quizs tengas que usar valores muy grandes o muy pequeos para obtener los resultados deseados. 4.10.4.5.2. La atmsfera y las fuentes de luz

Los mejores resultados se obtienen con los focos cnicos y cilndricos. Crean buenos rayos de luz y son fciles de trazar debido a que el muestreo atmosfrico solo tiene lugar dentro del cono o del cilindro. Si quieres aadir una fuente de luz que no interacte con la atmsfera puedes usar el identificador atmosphere dentro de la declaracin de la fuente de luz (ver "Interaccin con la atmsfera"). Simplemente aade atmosphere off. Por defecto la luz proveniente de cualquier fuente no ser disminuida por la atmsfera. De esta manera los reflejos en tu escena sern normalmente demasiado brillantes. Esto puede ser cambiado con la declaracin
atmospheric_attenuation on.

4. TUTORIAL PARA PRINCIPIANTES 4.10.4.5.3. Tipos de dispersin atmosfrica

152

Los diferentes tipos de dispersin listados en "La atmsfera" pueden ser usados para modelar distintos tipos de partculas. Esto es algo con lo que puedes experimentar. La dispersin Rayleigh se usa para partculas pequeas como polvo o humo, mientras que la dispersin Mie se usa para la niebla. Si alguna vez has visto la escena del faro en la pelcula Casper sabrs que efecto tiene el tipo de dispersin. En esta escena el rayo de luz proveniente del faro se torna visible cuando apunta hacia el observador y se va desvaneciendo segn se aleja. Este comportamiento es tpico de las minsculas gotas de agua que modela la dispersin Mie. 4.10.4.5.4. Incrementando la resolucin de la imagen

Debes tener en cuenta que quizs debas incrementar la tasa de muestreo de la atmsfera si incrementas la resolucin de la imagen. De otra manera puede que aparezcan algunos efectos del aliasing que no eran visibles con una resolucin ms baja. 4.10.4.5.5. Usando Objetos Vacos y la Atmsfera

Siempre que uses el efecto atmsfera tendrs que asegurarte de que todos los objetos que deberan ser rellenados con la atmsfera son declarados vacos mediante el identificador hollow. Esto tambin se mantiene para los objetos infinitos como quadric, quartic, triangle, polygon, etc. Donde quiera que uses uno de estos objetos deberas aadir el identificador hollow, siempre que no ests absolutamente seguro de que no lo necesitas. Tambin debes asegurarte de que todos los objetos dentro de los cuales se encuentra la cmara son declarados vacos. Donde quiera que obtengas resultados inesperados deberas revisar los objetos slidos y declararlos como vacos.

Você também pode gostar