12.07.2015 Views

xi - Escuela Superior de Informática (UCLM)

xi - Escuela Superior de Informática (UCLM)

xi - Escuela Superior de Informática (UCLM)

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Tecnologías Libres para Síntesis<strong>de</strong> Imagen Digital TridimensionalIV Jornadas Blendiberia 2006Ciudad Real, 7 y 8 Julio


Tecnologías Libres para Síntesis<strong>de</strong> Imagen Digital TridimensionalIV Jornadas Blendiberia 2006Ciudad Real, 7 y 8 Julio


TÍTULOTecnologías Libres para Síntesis <strong>de</strong> Imagen Digital TridimensionalAUTORES (Por or<strong>de</strong>n alfabético)Javier Alonso Albusac Jiménez, Fernando Arroba Rubio, Javier Belanche Alonso,Alejandro Conty Estévez, Roberto Domínguez, José Antonio Fernán<strong>de</strong>z Sorribes, LuisFernando Ruiz Gago, Carlos Folch Hidalgo, Miguel García Corchero, Inmaculada GijónCardós, Juan David González Cobas, Carlos González Morcillo, Miguel Ángel Guillén, CarlosLópez Yrigaray, Emilio José Molina Cazorla, Guillermo Vayá.EDITORCarlos González MorcilloPORTADA Y MAQUETACIÓNCarlos González MorcilloIMPRESIÓNServicio <strong>de</strong> publicaciones on-line Lulu.comISBN 84-689-9280-1Nº REGISTRO 06/45890LICENCIASe permite la copia y distribución <strong>de</strong> la totalidad o parte <strong>de</strong> esta obra sin ánimo <strong>de</strong> lucrobajo licencia Creative Commons que se <strong>de</strong>talla a continuación. Toda copia total o parcial<strong>de</strong>berá citar expresamente el nombre <strong>de</strong> los autores. Al reutilizar o distribuir la obra, tieneque <strong>de</strong>jar bien claro los términos <strong>de</strong> la licencia <strong>de</strong> esta obra. Alguna <strong>de</strong> estas condicionespue<strong>de</strong> no aplicarse si se obtiene el permiso <strong>de</strong>l titular <strong>de</strong> los <strong>de</strong>rechos <strong>de</strong> autor. Los <strong>de</strong>rechos<strong>de</strong>rivados <strong>de</strong> usos legítimos u otras limitaciones reconocidas por ley no se ven afectados por loanterior.LICENCIA CREATIVE COMMONSReconocimiento-NoComercial-SinObraDerivada 2.5 EspañaUsted es libre <strong>de</strong> copiar, distribuir y comunicar públicamente la obra,bajo las condiciones siguientes:Reconocimiento. Debe reconocer los créditos <strong>de</strong> la obra <strong>de</strong> lamanera especificada por el autor o el licenciador.No comercial. No pue<strong>de</strong> utilizar esta obra para fines comerciales.Sin obras <strong>de</strong>rivadas. No se pue<strong>de</strong> alterar, transformar o generaruna obra <strong>de</strong>rivada a partir <strong>de</strong> esta obra.Este documento fue maquetado exclusivamente con software libre:GNU/Linux con OpenOffice 2.0, GIMP, Blen<strong>de</strong>r y Yafray.


«Emo... ¿Es que no ves la belleza<strong>de</strong> este lugar? El modo en quefunciona... Lo perfecto que es.»Fotograma <strong>de</strong> la Película <strong>de</strong> Animación“Elephants Dream” realizada con Blen<strong>de</strong>r© Copyright 2006, Blen<strong>de</strong>r FoundationNetherlands Media Art Institutewww.elephantsdream.org


Don't lose yourmonkey head


Tabla <strong>de</strong> Contenidos«Los libros que el mundo llama inmoralesson libros que muestran al mundo su propia vergüenza»Oscar Wil<strong>de</strong>Prefacio ........................................................................................ 1FilosofíaCreative Commons: entre el copyright y la copia ................... 5¿Qué pasa en este país? .......................................................... 11YafRay <strong>de</strong> la Y a la y .................................................................. 19Software Libre .................................................................................... 20Ingeniería <strong>de</strong>l Software ...................................................................... 23Ingeniería <strong>de</strong>l Software Tradicional: Software Propietario ........... 24Ingeniería <strong>de</strong>l Software Libre ........................................................ 24La Catedral y el Bazar ....................................................................... 29YafRay: <strong>de</strong> la catedral al bazar organizado .................................. 31Desarrollo libre para el software libre ................................................. 33Conclusiones ..................................................................................... 35Referencias ........................................................................................ 36¿La retrocomputación está <strong>de</strong> moda? .................................... 37Un poco <strong>de</strong> historia ............................................................................ 37Intenciones ................................................................................... 39Coleccionismo ................................................................................... 39Emulación/Recreación ....................................................................... 42Recreación ................................................................................... 44Hardware Emulation ..................................................................... 46Hardwriting/Low Programming ........................................................... 46La retroinformática y el arte actual ..................................................... 48Para saber un poco más .................................................................... 50[ i ]


[ ii ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFundamentosTexturas procedurales .............................................................. 53Fundamentos <strong>de</strong> los conjuntos fractales ............................................ 53Condiciones básicas <strong>de</strong> dimensión .............................................. 53Dimensiones topológica y <strong>de</strong> Haufsdorff ...................................... 54Conjuntos fractales ....................................................................... 55Texturas iterativas .............................................................................. 55Funciones <strong>de</strong> ruido ....................................................................... 56Funciones <strong>de</strong> ruido Perlin ............................................................. 57Ruidos en Blen<strong>de</strong>r 3D .................................................................. 59Terrynoise .......................................................................................... 60Psicofisiología <strong>de</strong> la percepción ............................................. 63El sistema visual ................................................................................ 63Aspectos funcionales <strong>de</strong> la retina ................................................. 64Aspectos funcionales <strong>de</strong> la visión ................................................. 66Aspectos psicológicos <strong>de</strong> la percepción ............................................ 70Leyes <strong>de</strong> la percepción ................................................................ 70La matemática <strong>de</strong> los gráficos 3D ........................................... 73Sistemas <strong>de</strong> coor<strong>de</strong>nadas ................................................................. 73Álgebra vectorial ................................................................................ 75Operaciones con vectores ............................................................ 75Interpretaciones geométricas ....................................................... 76Bases ........................................................................................... 77Geometría afín y proyectiva ............................................................... 78Planos .......................................................................................... 79Líneas .......................................................................................... 80Geometría <strong>de</strong> la inci<strong>de</strong>ncia y geometría métrica .......................... 81Matrices y transformaciones geométricas .......................................... 82Sumario proyectivo ....................................................................... 87Determinantes .............................................................................. 88Álgebra lineal numérica y resolución <strong>de</strong> ecuaciones ......................... 90La <strong>de</strong>scomposición LU ................................................................. 91Cálculo <strong>de</strong> <strong>de</strong>terminantes ............................................................. 92Resolución <strong>de</strong> sistemas <strong>de</strong> ecuaciones lineales .......................... 92Inversión <strong>de</strong> matrices ................................................................... 94Resolución <strong>de</strong> ecuaciones ............................................................ 94Geometría diferencial en cuatro palabras .......................................... 96Curvas .......................................................................................... 96Superficies .................................................................................... 97Interpolación y apro<strong>xi</strong>mación ........................................................... 100Fórmula <strong>de</strong> interpolación <strong>de</strong> Lagrange ....................................... 100Ajuste por mínimos cuadrados ................................................... 102


Tabla <strong>de</strong> Contenidos [ iii ]Mo<strong>de</strong>lado <strong>de</strong> curvas y superficies: splines ....................................... 104Splines naturales ........................................................................ 104Interpolantes <strong>de</strong> Hermite ............................................................ 105Curvas <strong>de</strong> Bézier ........................................................................ 105B-splines .................................................................................... 106NURBS ....................................................................................... 109Splines para superficies paramétricas ........................................ 110Tu cara me suena .................................................................... 111Inst... conceptos básicos .................................................................. 111¿Qué es el sonido? ..................................................................... 111Velocidad <strong>de</strong>l sonido, refracción, refle<strong>xi</strong>ón interferencias ........... 112Tono, timbre, intensidad ................................................................... 114Psicobiología <strong>de</strong> la percepción acústica ........................................... 115Estéreo, surround, efecto doppler ............................................... 117Zonas <strong>de</strong> percepción .................................................................. 118Algún día, todo será digital .............................................................. 120Formatos .................................................................................... 121Surfeando en la onda ................................................................. 122Conclusión y cierre .......................................................................... 122Visión Estereoscópica ............................................................ 123¿Qué es la visión estereoscópica? .................................................. 123Cómo imitiar la visión estereoscópica humana ................................ 124Métodos <strong>de</strong> visualización ................................................................. 125Visión Libre ................................................................................. 125Empleando dispositivos .............................................................. 125Áreas <strong>de</strong> aplicación .......................................................................... 129Principios matemáticos; cálculo <strong>de</strong> la distancia focal ....................... 130Configuración en Blen<strong>de</strong>r ................................................................ 132Referencias ...................................................................................... 132AnimaciónTécnicas <strong>de</strong> animación en Blen<strong>de</strong>r ....................................... 135Moviendo Blen<strong>de</strong>r ............................................................................ 135Python .............................................................................................. 138Dirigiendo el movimiento externamente: Drivers ........................ 138Aprovechando el Game-Engine ................................................. 139Esqueletos en Blen<strong>de</strong>r ..................................................................... 139Acciones ..................................................................................... 139Deformación <strong>de</strong> mallas .................................................................... 140Animación facial y sincronización labial ........................................... 142Creación <strong>de</strong> GUIs personalizados con drivers ................................. 144


[ iv ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DBlen<strong>de</strong>r y Doom 3 ................................................................... 145Vi<strong>de</strong>ojuegos y mods ......................................................................... 145¿Cómo puedo crear un mod? .......................................................... 146Id Software ................................................................................. 146Valve .......................................................................................... 147El apartado gráfico y Blen<strong>de</strong>r ........................................................... 148Creación <strong>de</strong> un personaje con Blen<strong>de</strong>r ............................................ 149Mo<strong>de</strong>lado <strong>de</strong>l personaje ............................................................. 149Creación <strong>de</strong>l mapa UV ............................................................... 151Ren<strong>de</strong>r to Texture y Normal Mapping ......................................... 154Creación <strong>de</strong> Esqueletos ............................................................. 155Skinning + Pesado <strong>de</strong> vértices ................................................... 156Cinemática directa e inversa ...................................................... 158Las Actions ................................................................................. 159Exportando a Doom 3 ...................................................................... 160Exportar personajes a MD5 ........................................................ 160Exportar objetos a ASE .............................................................. 161Preparando para importar el personaje en DoomEdit ................ 162Preparando para importar el objeto en DoomEdit ...................... 163Saltar al <strong>de</strong>sarrollo Indie .................................................................. 164Ren<strong>de</strong>rIluminando con Yafray ............................................................ 167¡Hágase la luz! ................................................................................. 167El Ruido ........................................................................................... 170Reduciendo el ruido ......................................................................... 172Qué hacer cuando las luces son pequeñas ................................ 173Configurar los fotones ................................................................ 174Casos comunes don<strong>de</strong> pue<strong>de</strong>n ayudar los fotones ......................... 176Pequeñas zonas iluminadas: estudio <strong>de</strong> dos casos ................... 176Objetos emisores ....................................................................... 178Luz difusa por una ventana ........................................................ 179¿Y ahora qué? ................................................................................. 179Irradiance Cache ........................................................................ 180Caústicas ......................................................................................... 183YafRid: Sistema Grid para Ren<strong>de</strong>r ........................................ 185Objetivos .......................................................................................... 185Arquitectura ..................................................................................... 187Servidor Yafrid ............................................................................ 188Proveedor ................................................................................... 195Resultados ....................................................................................... 195Resultados analíticos ................................................................. 195Resultados empíricos ................................................................. 197


Tabla <strong>de</strong> Contenidos [ v ]Análisis <strong>de</strong> los resultados ........................................................... 199Conclusiones sobre el rendimiento <strong>de</strong>l sistema ......................... 200Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>r ............................................. 201Síntesis <strong>de</strong> Imagen Fotorrealista ..................................................... 201Técnicas <strong>de</strong> Trazado <strong>de</strong> Rayos .................................................. 202Técnicas <strong>de</strong> Radiosidad ............................................................. 203Técnicas Mixtas .......................................................................... 205Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>rizado ............................................... 205Scanline ..................................................................................... 206Raytracing .................................................................................. 207Ambient Occlusion ..................................................................... 208Radiosidad ................................................................................. 209Pathtracing ................................................................................. 210Photon Mapping ......................................................................... 212Pathtracing Bidireccional ............................................................ 212Metrópolis ................................................................................... 213Comparación <strong>de</strong> tiempos en una escena ................................... 214Bibliografía ....................................................................................... 216DesarrolloYafRayNet: Hardware a medida para Yafray ........................ 219Diseño hardware .............................................................................. 222Porting <strong>de</strong> YafRayNet a coma fija .................................................... 223Exportación <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r ................................................... 225Entrando en el menú sin hacer mucho ruido .................................... 225Un vistazo a lo que necesitamos ..................................................... 228Un poco <strong>de</strong> matemáticas ............................................................ 228Blen<strong>de</strong>r (la madre <strong>de</strong>l cor<strong>de</strong>ro) ................................................... 229Facilitando la vida al usuario ...................................................... 230Los objetos vistos <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r .................................................... 231Los objetos <strong>de</strong>s<strong>de</strong> VRML ................................................................. 233Reutilizando cosas ..................................................................... 233El script completo ............................................................................. 234Programando Plugins <strong>de</strong> Texturas ........................................ 239Introducción a las texturas y a las texturas procedurales ................ 239Consiguiendo bmake ....................................................................... 240Estructura <strong>de</strong> un plugin <strong>de</strong> Texturas ................................................. 242Ejemplo: Smiley.c ............................................................................. 245Notas y más información ................................................................. 251El código <strong>de</strong>l plugin completo .......................................................... 252


[ vi ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DRediseño <strong>de</strong> Yafray: Parte 1. La luz ...................................... 255Estado actual ................................................................................... 255Valoración <strong>de</strong>l estado actual ............................................................ 258Interacción luz-sha<strong>de</strong>r ...................................................................... 259Propuesta <strong>de</strong> diseño para fuentes <strong>de</strong> luz ......................................... 260Iluminación montecarlo vía GPU ...................................................... 261Tareas a completar ..................................................................... 262Driver GPU ................................................................................. 263¿Por dón<strong>de</strong> empezar? ..................................................................... 265GPU hemilight ............................................................................ 265GPU spherelight ......................................................................... 267GPU ambient occlusion .............................................................. 268Conclusión ....................................................................................... 269Mo<strong>de</strong>lado 3D basado en Bocetos: MoSkIS .......................... 271Introducción ..................................................................................... 271Creación <strong>de</strong> un objeto ...................................................................... 272Construcción <strong>de</strong> la silueta .......................................................... 272Obtención <strong>de</strong> la superficie .......................................................... 273Detección y elevación <strong>de</strong> la espina dorsal .................................. 275Obtención <strong>de</strong>l volumen mediante metasuperficies ..................... 277Mejoras en la obtención <strong>de</strong>l volumen ......................................... 278Algoritmo <strong>de</strong> extrusión ..................................................................... 279Trazo <strong>de</strong>l usuario ........................................................................ 279Triangularización y generación <strong>de</strong> la espina ............................... 280Generación <strong>de</strong> la extrusión ......................................................... 281Resultados ....................................................................................... 282


PrefacioEste libro que tienes en tus manos es el resultado <strong>de</strong> varias ediciones<strong>de</strong> las jornadas Blendiberia, celebradas en Barcelona (2003/2004), Zaragoza(2005) y Ciudad Real (2006). En esta recopilación se han recogidoalgunas <strong>de</strong> los documentos realizados para ediciones anteriores <strong>de</strong>Blendiberia y todas las ponencias preparadas para la última edición,celebrada los días 7 y 8 <strong>de</strong> Julio en Ciudad Real, coincidiendo espacio­temporalmentecon la mayor concentración informática <strong>de</strong> Castilla­La Manchallamada Party Quijote 2006.Para <strong>de</strong>finir qué son las jornadas, citamos algunos párrafos originales<strong>de</strong> la primera edición, manteniendo los mismos objetivos, concentrando elinterés en torno a producciones infográficas y software basado en mo<strong>de</strong>lo<strong>de</strong> código abierto. El estudio técnico <strong>de</strong> la informática gráfica alcanza sumá<strong>xi</strong>mo exponente cuando el usuario es capaz <strong>de</strong> intervenir, modificar yadaptar el software a las necesida<strong>de</strong>s <strong>de</strong> la sociedad. En cada una <strong>de</strong> lascontribuciones <strong>de</strong>scubrimos la heterogeneidad <strong>de</strong> dos campos en frenéticoavance tecnológico: el Software Libre y la Informática Gráfica.«Suerte <strong>de</strong> laboratorio o encuentro eventual <strong>de</strong> estudiosos a las técnicas <strong>de</strong>producción y realización <strong>de</strong> imágenes <strong>de</strong> síntesis tridimensional y todaperiferia creativa que pueda emerger <strong>de</strong>l mismo. El guión lo firmacualquier colaboración ajena, abierta a cualquier persona o colectivo quetrate la circulación <strong>de</strong> la información con libertad <strong>de</strong> uso, interpretación ydistribución.Aunque no e<strong>xi</strong>sta un método <strong>de</strong> trabajo único, ni siquiera sucontinuidad, el esquema que le da forma es el <strong>de</strong> una suma <strong>de</strong> brevespiezas que <strong>de</strong>scriben un gran puzzle teórico­práctico que va <strong>de</strong>s<strong>de</strong> el goceabstracto <strong>de</strong> la programación gráfica a la reivindicación política, aunqueambas cosas se fun<strong>de</strong>n en muchos casos.Lo que sí se pue<strong>de</strong> afirmar es que todas las piezas tienen en comúnestar hechas <strong>de</strong>s<strong>de</strong> una libertad absoluta, <strong>de</strong> la que nos servimos con elobjeto y fin <strong>de</strong> explorar el género <strong>de</strong> la computación gráfica consi<strong>de</strong>randoel usuario como cómplice inteligente, capaz <strong>de</strong> enten<strong>de</strong>r y disfrutar <strong>de</strong>lviaje propuesto. Blendiberia <strong>de</strong>s<strong>de</strong> su contenido a un grupo <strong>de</strong>colaboradores que aportan i<strong>de</strong>as, refle<strong>xi</strong>ones o piezas según su estímulointelectual. Es obvio remarcar que la mayor parte <strong>de</strong> las intervencionesgiran alre<strong>de</strong>dor <strong>de</strong> dos herramientas Blen<strong>de</strong>r y Yafray, mo<strong>de</strong>los <strong>de</strong>software 3D basados en el marco jurídico GNU, pero también se haquerido añadir un acento al <strong>de</strong>sarrollo <strong>de</strong> proyectos propios que tomancomo punto <strong>de</strong> partida o referente la posibilidad <strong>de</strong>l código fuentedisponible. »[ 1 ]


[ 2 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLa maquetación <strong>de</strong>l documento ha intentado conservar la paginación,formato y tamaño <strong>de</strong> los gráficos originales 1 . Si hubiera algún error en lamisma, seguramente el responsible sea el maquetador y no los autoresoriginales <strong>de</strong>l artículo.En el diseño <strong>de</strong> la portada <strong>de</strong>l libro y las “separatas” entre secciones seha utilizado la mascota <strong>de</strong> blen<strong>de</strong>r (Suzanne), una primitiva 3D que fueoriginalmente ren<strong>de</strong>rizada por Javier Belanche 2 .Esperamos que esta documentación, fruto <strong>de</strong>l esfuerzo <strong>de</strong> todos loscolaboradores <strong>de</strong> Blendiberia 2006 sea <strong>de</strong> tu agrado, y si no lo es, siemprepodrás enviar tus quejas a /<strong>de</strong>v/null.Un saludo y happy blending!1 La conversión <strong>de</strong> algunos artículos ha sido posible gracias a la ayuda <strong>de</strong> pacientes escribanos(Luis F. Ruiz ) , auténticos parsers <strong>de</strong> fórmulas LaTeX a formato ODT.2 Sí, el mono­monocromático es obra suya.


Sección IFilosofíaFotograma <strong>de</strong> la Película <strong>de</strong> Animación“Elephants Dream” realizada con Blen<strong>de</strong>r© Copyright 2006, Blen<strong>de</strong>r FoundationNetherlands Media Art Institutewww.elephantsdream.org


monkeyFollow theMoVeMenT


Creative Commons:entre el copyright y la copiaFilosofíaQJavier Belanche Alonsoxbelanch@gmail.com ::uería comenzar esta charla sobre CREATIVECOMMONS pidiendo disculpas. Finalmente no voy ahablar <strong>de</strong>masiado sobre el constructor <strong>de</strong> licencias queactualmente está teniendo una gran proyección en ámbitos noexclusivos <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong> software.La última portada <strong>de</strong> la revista WIRED -responsable en gran medida<strong>de</strong>l nacimiento <strong>de</strong> CREATIVE COMMONS- regalaba <strong>de</strong> forma lúdica unCD con 16 canciones con una «nueva y radical» licencia y que susprotagonistas (David Byrne, The Rapture o Beastie Boys, entre otros)forman parte <strong>de</strong> una iniciativa no carente <strong>de</strong> dificulta<strong>de</strong>s por liberar laproducción musical <strong>de</strong> las actuales restricciones legales y creativas.Frente a las limitaciones que ha trazado la industria musical, los 13 artistasque suscriben la propuesta han grabado bajo una licencia diferente: la«Sampling Plus License», que nos permite a los usuarios compartirdigitalmente las canciones («file-sharing»), pero también nos ofrece laposibilidad <strong>de</strong> añadir a nuestras producciones comerciales partes o«samples» <strong>de</strong> estas canciones, siempre y cuando nuestro trabajo sea losuficiente «diferente» al original para que no resulte una burda copia. Enlugar <strong>de</strong> con<strong>de</strong>nar la habitual práctica <strong>de</strong> «piratería» que los gran<strong>de</strong>smedios acostumbran a bombar<strong>de</strong>ar, se prohibe la falta <strong>de</strong> creatividad. Estáprohibido crear una copia exacta con fines comerciales pero no un«sampleado» cuyos resultados <strong>de</strong>riven a un trabajo diferente, quizá másexcitante o genial. O que comercialmente pueda resultar un é<strong>xi</strong>toinesperado. Y tenemos prece<strong>de</strong>ntes. Cuando el grupo «The Orb» consiguiócon «Little Fluffy Clouds» un é<strong>xi</strong>to planetario a partir <strong>de</strong> fragmentos <strong>de</strong>composiciones <strong>de</strong>l famoso creador minimalista Steve Reich, el mismoartista no supo qué hacer. Finalmente renunció a <strong>de</strong>mandar al grupo«ambient house» consi<strong>de</strong>rando la acción misma <strong>de</strong> «<strong>de</strong>predar»fragmentos sonoros (no exclusivos <strong>de</strong> la música, también vale diálogos <strong>de</strong>series <strong>de</strong> televisión, ruidos <strong>de</strong> la calle) y obtener un resultado único, unasuerte <strong>de</strong> collage musical, in<strong>de</strong>pendiente <strong>de</strong> las fuentes utilizadas para sucreación, aunque el grupo The Orb no las cite.[ 5 ]


[ 6 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEs posible la respuesta <strong>de</strong> Steve Reich se <strong>de</strong>be al recuerdo <strong>de</strong> la historia <strong>de</strong>la música o la historia <strong>de</strong> las prácticas <strong>de</strong>l surrealismo y dadaísmo, don<strong>de</strong>el uso y recurso indiscriminado <strong>de</strong> imágenes tomadas <strong>de</strong> obras <strong>de</strong> terceroso incluso adoptando el estilo <strong>de</strong> creaciones <strong>de</strong> artistas marginales o tribalesera absolutamente aceptado y generalizado. Es obvio que Picassofundamentó las bases <strong>de</strong>l cubismo en la interpretación personal <strong>de</strong> lasmáscaras africanas, <strong>de</strong> la línea <strong>de</strong> Ingres y <strong>de</strong> la investigación pictórica <strong>de</strong>Cezanne. Incluso André Breton, padre intelectual <strong>de</strong>l movimientosurrealista, invitaba a los creadores plásticos la experiencia <strong>de</strong> «l'objetretrouvé». Nada <strong>de</strong> la vanguardia artística <strong>de</strong>l primer cuarto <strong>de</strong>l siglo XXpodía ser consi<strong>de</strong>rado acto ilegal. En este caso, el artista tomaba susreferencias <strong>de</strong> obras que, en cierta manera, po<strong>de</strong>mos consi<strong>de</strong>rarlas en laactualidad <strong>de</strong> «dominio público». Y en cierta manera y en otro frente,cuando Walt Disney basó gran parte <strong>de</strong> su genialidad como animador en laliteratura infantil <strong>de</strong> los hermanos Grimm y otra parte <strong>de</strong> sus logrosgráficos a la atmósfera permisiva <strong>de</strong> aquella época en la que los artistasdisfrutaban <strong>de</strong> gran libertad para crear obras «<strong>de</strong>rivadas» <strong>de</strong> otras.Paradójicamente, en la actualidad nadie se atrevería a tomar los personajesclásicos <strong>de</strong> Walt Disney para una nueva interpretación o, simplemente,para sumar nuevas historias a las ya forman parte <strong>de</strong> la historia.Sencillamente porque sería acusado <strong>de</strong> un acto criminal.¿Por qué en la actualidad se ha llegado a un excepcional y difícil horizontedon<strong>de</strong> está en juego las libre circulación <strong>de</strong> las i<strong>de</strong>as? En unos pocos años,el panorama occi<strong>de</strong>ntal en cuanto a las reglas <strong>de</strong> protección y <strong>de</strong>rechos <strong>de</strong>autor se ha incrementado increíblemente el número <strong>de</strong> licencias <strong>de</strong>carácter fuertemente restrictivo. Es más, en ámbitos como la producción ydiseño software hemos visto cómo en sus orígenes pertenecía a un campolibre <strong>de</strong> uso y lectura <strong>de</strong>l código fuente a su privatización en términolegales, sin olvidarnos que, en el tramo final, la práctica <strong>de</strong> patentar códigorepresenta la última frontera, el último paso a la exclusión <strong>de</strong> la cultura a lasociedad. Esta actuación única y focalizada - la exclusión, la privatizaciónfuerte <strong>de</strong> las i<strong>de</strong>as -, pero omnidireccional abierta en todos los mercadosculturales pue<strong>de</strong> observarse y <strong>de</strong>tectar sus consecuencias en mensajes quemanifiestan la inteligencia y la creatividad humana propiedad <strong>de</strong> uncerebro, <strong>de</strong> un individuo, conocido popularmente como «artista» o«científico», convirtiéndose <strong>de</strong>scaradamente en marcas registradas <strong>de</strong> lacultura popular. Así, Bill Gates es a la informática lo que Picassorepresenta en la evolución <strong>de</strong> la historia <strong>de</strong>l Arte <strong>de</strong>l siglo XX o,recuperando una historia anterior, lo que Walt Disney representa a lahistoria <strong>de</strong> la animación. Este pensamiento no permite la matización. Nose permite pensar que lo que generalmente conocemos como «invenciónindividual» es producto <strong>de</strong> un fenómeno más complejo don<strong>de</strong> intervienenun número <strong>de</strong> interferencias o «inteligencias». Ese lema llevado hasta laexasperación conduce claramente a un posicionamiento ultra conservador


Creative Commons: entre el copyright y la copia [ 7 ]que, tal como he comentado antes, <strong>de</strong>fen<strong>de</strong>rá hasta el último aliento unafórmula <strong>de</strong> estandarización abusiva: un sólo producto, un solo nombre, unmonopolio comercial <strong>de</strong> la cultura.Frente a esta dictadura <strong>de</strong> la comercialización y producción exclusiva <strong>de</strong> lacultura, tenemos otra corriente, un movimiento fractal que, sin entrar ensu propia recursividad, lucha abiertamente por la libre circulación <strong>de</strong> lasi<strong>de</strong>as. Dentro <strong>de</strong> esta postura se dibujan otras, quizá menos visibles, perono por eso menos importantes. Vuelvo a incidir en la cuestión <strong>de</strong> launicidad creativa. Según estos movimientos <strong>de</strong> resistencia, la creativida<strong>de</strong>s propiedad <strong>de</strong> la humanidad y fomentada en la agrupación <strong>de</strong> personascon afinida<strong>de</strong>s e intereses comunes y reunidos en torno a una comunidad.El acento <strong>de</strong> esta revuelta se sitúa en términos <strong>de</strong> cooperación, <strong>de</strong> «bazar»en palabras <strong>de</strong> Eric Raymond. Este movimiento cuestiona abiertamenteunas leyes que tuvieron su razón en otro momento histórico, pero que, enla actualidad, han perdido el sentido. La digitalización <strong>de</strong> la cultura hatrastornado radicalmente el tráfico incesante <strong>de</strong> la cultura, <strong>de</strong> las i<strong>de</strong>as. Ladigitalización ha transformado completamente el contexto, el marco en elque la tecnología empujó a <strong>de</strong>finir el significado <strong>de</strong> Copyright como formalegal <strong>de</strong> proteger las inversiones en la creación <strong>de</strong> una obra y la creaciónmisma: la copia. En estos momentos, los centros <strong>de</strong> producción masiva <strong>de</strong>cultura se han <strong>de</strong>scentralizado. Cualquier persona, <strong>de</strong>s<strong>de</strong> su casa, pue<strong>de</strong>ser fuente <strong>de</strong> producción <strong>de</strong> información; pue<strong>de</strong> copiar, reproducir eincluso compartir sin pérdida en la calidad <strong>de</strong> la información <strong>de</strong> los bienesinmateriales con otras personas. Pero, contradictoriamente a lo queparecía una actividad inocua hace unas décadas como el préstamo <strong>de</strong> unlibro a un amigo o grabarle a un vecino una canción, en el día <strong>de</strong> hoy, estasy otras activida<strong>de</strong>s se han criminalizado con el fin <strong>de</strong> proteger, según laóptica monopolista <strong>de</strong>l negocio cultural, los <strong>de</strong>rechos <strong>de</strong>l autor. No esextraño que bajo esta atmósfera prohibitiva <strong>de</strong> la circulación <strong>de</strong> la culturahayan cristalizado movimientos como el <strong>de</strong>l software libre, «copyleft» o«all rights reversed». Movimientos que han permitido respirar libertad yque ofrecen <strong>de</strong> manera legal - y es bastante triste confirmarlo - el po<strong>de</strong>rcompartir bienes inmateriales con tu vecino sin riesgo <strong>de</strong> ser juzgado comoun criminal.Uno <strong>de</strong> los aspectos más interesantes que contradice los monopolios <strong>de</strong>lcomercio cultural y que pue<strong>de</strong> ser motivo <strong>de</strong> una larga refle<strong>xi</strong>ón es elfenómeno japonés conocido por «doujinshi». Todos conocemos laindustria <strong>de</strong>l cómic en Japón, «manga». Los japoneses son verda<strong>de</strong>rosfanáticos <strong>de</strong> los cómics. Un 40% <strong>de</strong> las publicaciones en la actualidad soncómics y socialmente cubren todas las eda<strong>de</strong>s: <strong>de</strong>s<strong>de</strong> los más pequeñoshasta las personas <strong>de</strong> edad avanzada. A diferencia <strong>de</strong> la cultura occi<strong>de</strong>ntal,el «manga» no forma parte <strong>de</strong> un uso exclusivo <strong>de</strong> un grupo o perfil <strong>de</strong>personas. En España, el cómic siempre ha arrastrado diferentes complejosy prejuicios. Sólo en paises como Francia o Estados Unidos pue<strong>de</strong> <strong>de</strong>cirse


[ 8 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Dque hay una fuerte tradición y que la sociedad acepta su creación comoparte <strong>de</strong> la cultura social. Sin entrar en más <strong>de</strong>talles sobre el «manga», loque realmente me interesa explicar es este fenómeno, «doujinshi», que entérminos legales o bajo el paraguas restrictivo <strong>de</strong>l Copyright actual estaríaen el terreno <strong>de</strong> la ilegalidad.«Doujinshi» son cómics, pero un tipo <strong>de</strong> cómic especial. Los creadores odibujantes <strong>de</strong> «doujinshi» tienen permisos para crear obras <strong>de</strong>rivadas <strong>de</strong>«mangas» oficiales: no copian, modifican en términos <strong>de</strong> contribución y<strong>de</strong>sarrollo <strong>de</strong>l original. Un «dounjinshi» pue<strong>de</strong> tomar los personajes <strong>de</strong> un«manga» y cambiarlos <strong>de</strong> manera significativa en sus atuendos; o crearnuevas historias para los personajes cambiando su contexto geográfico ohistórico; o simplemente continuar historias allá don<strong>de</strong> el cómic originalha terminado. En Japón, los «dounjinshi» son permitidos en términoslegales. No estamos hablando <strong>de</strong> copias, sino <strong>de</strong> obras <strong>de</strong>rivadas <strong>de</strong> otrasconsi<strong>de</strong>radas «oficiales». En Japón el mercado «dounjinshi» mueve a33.000 círculos <strong>de</strong> creadores y dos veces al año se organizan encuentrosdon<strong>de</strong> 450.000 japoneses se reúnen para el intercambio o venta <strong>de</strong>«dounjinshi». Este mercado e<strong>xi</strong>ste paralelamente al mercado oficial«manga» y el segundo no teme por su florecimiento. En términosocci<strong>de</strong>ntales, «doujinshi» equivale a «obra <strong>de</strong>rivada» y, por lo tanto, ilegal.¿Qué es lo más sorpren<strong>de</strong>nte <strong>de</strong> este movimiento «legal» en Japón? Sue<strong>xi</strong>stencia. Y al revés <strong>de</strong> lo que podría pensarse, el mercado «manga» no ha<strong>de</strong>crecido en absoluto. Al contrario. La e<strong>xi</strong>stencia <strong>de</strong> este mercado <strong>de</strong>aficionados al «manga» favorece el crecimiento <strong>de</strong> la industria oficial entérminos <strong>de</strong> circulación <strong>de</strong> información. Esta situación no era muy distintaen los primeros tiempos <strong>de</strong>l cómic americano, don<strong>de</strong> los dibujantesaprendían los unos <strong>de</strong> los otros, copiando su estilo, modificándolo oadaptándolo, y <strong>de</strong>l que Walt Disney es un ejemplo. En el día <strong>de</strong> hoy, laindustria <strong>de</strong>l cómic americano, siguiendo la historia, la adaptación o laobra <strong>de</strong>rivada está prohibida. Es más. Personajes como Superman u otrossuper-héroes tienen bien <strong>de</strong>finidos su rol. Hay cosas que pue<strong>de</strong>n hacer,pero otras que formen parte <strong>de</strong> la <strong>de</strong>finición <strong>de</strong> otro super-héroe no.Contrariamente, la <strong>de</strong>rivación en el universo <strong>de</strong>l manga permite una mayorfle<strong>xi</strong>bilidad y promiscuidad creativa. Y el mundo <strong>de</strong> las obras <strong>de</strong>rivadas, talcomo ocurre con el «doujinshi», en lugar <strong>de</strong> restar movimiento al mercadooficial parece ayudar su continuidad.Retomando la interpretación polarizada <strong>de</strong> la situación actual, la posturaque persigue la mercantilización <strong>de</strong> la cultura fundamenta su argumentoen la protección férrea <strong>de</strong> los intereses <strong>de</strong>l autor. Recor<strong>de</strong>mos que en laactualidad, cualquier autor -especialmente escritores y músicos- quebusque una difusión <strong>de</strong> su obra en los circuitos comerciales, firmará con uneditor o «publisher», casa discográfica o distribuidora un contratoeconómico en el que se <strong>de</strong>limita la autoría intelectual <strong>de</strong> la obra. En 1710,


Creative Commons: entre el copyright y la copia [ 9 ]los <strong>de</strong>rechos <strong>de</strong> autor en el primer estatuto <strong>de</strong> Inglaterra se <strong>de</strong>finen comoun <strong>de</strong>recho que equilibra dos partes interesadas: el reconocimiento <strong>de</strong>lautor y, por lo tanto, la protección <strong>de</strong> la expresión <strong>de</strong> un contenido, no elcontenido <strong>de</strong>l mismo y, en palabras textuales, «animar a los hombresiluminados a componer y a escribir libros útiles». Si bien el autor tiene elmonopolio legal <strong>de</strong> permitir la representación <strong>de</strong> su obra con suconsentimiento, la sociedad ha <strong>de</strong> po<strong>de</strong>r acce<strong>de</strong>r a la misma conconsecuencias creativas. La obra no ha <strong>de</strong> representar un objeto cerrado ala sociedad y ésta ha <strong>de</strong> beneficiarse <strong>de</strong> las creaciones. Para alcanzar esteconsenso se fijó una caducidad a los <strong>de</strong>rechos <strong>de</strong> autor que permitiera quela obra formara parte <strong>de</strong>l dominio público <strong>de</strong>spués <strong>de</strong> un número <strong>de</strong> años.En la ley <strong>de</strong> la propiedad intelectual española (LPI) y muy similares enotros países, tomaron como referencia su <strong>de</strong>sarrollo las bases redactadasen el Convenio <strong>de</strong> Berna para la protección <strong>de</strong> trabajos literarios yartísticos <strong>de</strong> 1886 don<strong>de</strong> se diferencian <strong>de</strong>rechos morales y patrimoniales.Los <strong>de</strong>rechos morales protegen in<strong>de</strong>finidamente la autoría y la integridad<strong>de</strong> la obra; los <strong>de</strong>rechos patrimoniales hablan <strong>de</strong>l <strong>de</strong>recho fundamental <strong>de</strong>la explotación económica <strong>de</strong> la obra y pue<strong>de</strong>n ser cedidos a un tercero <strong>de</strong>forma parcial o total <strong>de</strong> forma exclusiva o no, según el contrato que se fijeentre creador y la empresa encargada <strong>de</strong> la explotación económica <strong>de</strong> laobra. Los <strong>de</strong>rechos patrimoniales tienen una duración <strong>de</strong> 70 años <strong>de</strong>spués<strong>de</strong> la muerte <strong>de</strong>l autor, en el caso <strong>de</strong> la ley española para pasar <strong>de</strong>spués aformar parte <strong>de</strong>l dominio público.La cesión <strong>de</strong> <strong>de</strong>rechos <strong>de</strong>l autor a un tercero se <strong>de</strong>fine mediante uncontrato <strong>de</strong>nominado «licencia». En términos amplios, cada licencia<strong>de</strong>fine los permisos <strong>de</strong>l uso <strong>de</strong> la obra, como por ejemplo su explotación ono económica, la creación <strong>de</strong> obras <strong>de</strong>rivadas, etc; la licencia protegeasímismo la atribución o autoría <strong>de</strong> la obra como el impedimento legal <strong>de</strong>cualquier modificación <strong>de</strong> la misma como <strong>de</strong> la licencia. Por otro lado, lalicencia permitirá a un tercero - con exclusividad o no -, tal como hemoscomentado anteriormente, a la copia, distribución y representación <strong>de</strong> laobra.Dentro <strong>de</strong> esa <strong>de</strong>finición amplia y general <strong>de</strong> licencia quiero retomar la«Creative Commons» y así cumplir con el objetivo <strong>de</strong> esta charla. Fundadaen el 2001 y dirigidos por expertos en materia legal <strong>de</strong> la propiedadintelectual, <strong>de</strong>recho en la sociedad <strong>de</strong> la información e informática, la«Creative Commons» viene a ser una suerte <strong>de</strong> meta-licencia que permitaen el panorama digital <strong>de</strong> la información una ayuda y cobertura legal a loscreadores protegiendo su autoría (excepto el caso <strong>de</strong> dominio público) peroque a un mismo tiempo sea factible la circulación legal <strong>de</strong> la obra. El lemaes evi<strong>de</strong>nte: «Creative Commons is a nonprofit that offers a fle<strong>xi</strong>blecopyright for creative work». Hablar <strong>de</strong> fle<strong>xi</strong>bilidad es sencillamentehablar <strong>de</strong> ciertas liberta<strong>de</strong>s en cuanto a copia, distribución y creación <strong>de</strong>obras <strong>de</strong>rivadas. El é<strong>xi</strong>to popular que está adquiriendo esta metalicencia es


[ 10 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Dbásicamente por tres motivos: el autor pue<strong>de</strong> <strong>de</strong>finir la licencia que más leinterese en apenas tres pasos; una vez <strong>de</strong>finida, el autor tendrá a sudisposición tres versiones <strong>de</strong> la licencia: una versión legible para cualquierpersona (Commons Deed), una segunda versión especializada en términoslegales (Legal Co<strong>de</strong>) y, finalmente, una tercera que pueda ser interpretadadigitalmente por aplicaciones y motores <strong>de</strong> búsqueda que i<strong>de</strong>ntifiquen laautoría y los términos <strong>de</strong> licencia. En segundo lugar comprobamos que, adiferencia <strong>de</strong> licencias como la GNU, la Creative Commons extien<strong>de</strong> sucobertura a disciplinas como la música, vi<strong>de</strong>o, imágenes, texto e inclusoeducación. Finalmente, Creative Commons ha encontrado traducción legalen un número gran<strong>de</strong> <strong>de</strong> países, en los que incluimos España y Catalunya,gracias a la colaboración <strong>de</strong>sinteresada <strong>de</strong> la Universitat <strong>de</strong> Barcelona.La creación <strong>de</strong> una licencia a partir <strong>de</strong> Creative Commons se fundamentaen la combinación <strong>de</strong> cuatro condiciones: la atribución, la nocomercialidad,la negación a trabajos <strong>de</strong>rivados y, cuarto, el permiso atrabajos <strong>de</strong>rivados (share-alike), siempre y cuando la obra <strong>de</strong>rivada use yrespete la misma licencia que el original. Pero siempre manteniendo doscondiciones previas: afirmar la autoría <strong>de</strong> la obra y el permiso a terceros acopiar y distribuir la obra con los cuatro condicionantes antes comentados.Permitir, sin lugar a dudas, que la cultura y la circulación <strong>de</strong> las i<strong>de</strong>as noesté sujeta a sólo intereses comerciales y revivir el concepto <strong>de</strong> creatividadcomo una actuación <strong>de</strong>rivada, no única y genial.


¿Qué pasa en este país?Alejandro Conty Estévezaconty@gmail.com ::FilosofíaEste articulo recoge una serie <strong>de</strong> impresiones personalessobre el mundo laboral <strong>de</strong>l programador en España. Lasdirectivas que en él se recogen no son evi<strong>de</strong>ntementeaplicables como norma. La intención <strong>de</strong>l texto es la <strong>de</strong> <strong>de</strong>nunciaruna serie <strong>de</strong> aspectos a mi juicio profundamente perjudicialespara el sector.Como se menciona en "The mythical man-month": Recogiendo patatasel individuo más productivo pue<strong>de</strong> tener una relación <strong>de</strong> 2, como mucho 3a 1 contra el menos productivo. En el mundo <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong> software, larelación entre el más productivo y el menos productivo pue<strong>de</strong> ser <strong>de</strong> 10 eincluso 100 a 1. Sin embargo, el más productivo aceptará trabajar sólo porel triple.Esta ventaja que en principio tienen los empresarios pasa totalmente<strong>de</strong>sapercibida en este país. Hay ya unos cuantos programadores quepue<strong>de</strong>n ser productivos. También hay unos pocos programadoresbrillantes que podrían, en el entorno a<strong>de</strong>cuado, generar verda<strong>de</strong>rasfortunas. Pero el programador no es una persona respetada en el mundolaboral. Ni siquiera se le respeta en la calle.Uno se encuentra programadores cobrando menos que los <strong>de</strong>l servicio <strong>de</strong>limpieza. No es que éstos <strong>de</strong>ban cobrar menos, es que los programadores<strong>de</strong>berían cobrar más. A<strong>de</strong>más nos da una i<strong>de</strong>a <strong>de</strong> como valora la empresael papel <strong>de</strong>l programador. Al fin y al cabo, en la industria <strong>de</strong>l software sonlos programadores los que crean riqueza <strong>de</strong> la nada. Es difícil enten<strong>de</strong>rcomo pue<strong>de</strong>n tener una valoración tan baja. También es sorpren<strong>de</strong>nte quelos propios programadores lo consientan.Todos sabemos lo que supone reemplazar a un programador en medio <strong>de</strong>un proyecto. Pue<strong>de</strong> significar un retraso <strong>de</strong> 6 meses en el mejor <strong>de</strong> loscasos. El atasco completo <strong>de</strong>l proyecto en el peor <strong>de</strong> ellos. Pero nadie en ladirección <strong>de</strong> las empresas se da cuenta. Es más, ni siquiera les importa. EnEspaña el 90% <strong>de</strong> las empresas se <strong>de</strong>dican a ven<strong>de</strong>r humo o a hacerproyectos con la Administración cuyo buen fin preocupa a muy pocos. Noes <strong>de</strong> extrañar que <strong>de</strong> aquí no salga ninguna empresa espectacular comoSkype, Keyhole, o no digamos ya, Google. Debe e<strong>xi</strong>stir algún motivo.[ 11 ]


[ 12 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DTrabajando como programador uno se enfrentará a un montón <strong>de</strong>iluminados visionarios que, sin tener ningún conocimiento, proponen cadadía i<strong>de</strong>as como "¿Y si hacemos un sistema <strong>de</strong> telefonía por internet?".Normalmente estos ataques <strong>de</strong> creatividad ocurren al día siguiente <strong>de</strong> quesalga por la tele la noticia <strong>de</strong> que alguien ha hecho lo mismo en algunaparte. A los dos años cuando la i<strong>de</strong>a esté ya implantada podrán <strong>de</strong>cir "esose me ocurrió a mí, pero nadie me apoyó".Todo este entorno frena a cualquier programador <strong>de</strong> provecho <strong>de</strong> hacernada útil ni revolucionario. A diferencia que en otros paises, las empresas<strong>de</strong> tecnología no están dirigidas por personal técnico. Están dirigidas porgente <strong>de</strong> mucho dinero o tipos que ganaron algo <strong>de</strong> dinero haciendo otracosa y ahora quieren apuntarse al carro. Nunca saldremos <strong>de</strong>l agujerotecnológico hasta que esto cambie.En mi corta experiencia como programador he ido <strong>de</strong>sarrollando fuertesalergias a prácticas comunes. Como ahora están <strong>de</strong> moda los estatutos, he<strong>de</strong>cidido empezar a redactar un Estatuto <strong>de</strong> los Programadores. Paragenerar polémica, todo estatuto tiene que tener un preámbulo incendiarioque reclame <strong>de</strong>rechos <strong>de</strong> nación o algo similar. Como no está el horno parabollos, hemos <strong>de</strong> maquillarlo un poco para que no suene muy radical.El preámbulo propuesto es el siguiente:«El mundo <strong>de</strong> la programación es una realidadprostitucional»Dicho esto proce<strong>de</strong>mos con el primer y más importante artículo:Artículo 1: Toda persona incapaz <strong>de</strong> realizarlas tendrá,terminantemente prohibido, tener i<strong>de</strong>as.Lleva un poco <strong>de</strong> refle<strong>xi</strong>ón darse cuenta <strong>de</strong> cuánto beneficio haría unanorma como ésta. Primero invito a pensar si podría en algún caso hacerdaño a la sociedad. ¿Ha habido alguna vez una buena i<strong>de</strong>a tecnológica ocientífica que surgiera <strong>de</strong> mano <strong>de</strong> alguien incapaz <strong>de</strong> <strong>de</strong>sarrollarla?Aunque así fuera (que no es), la i<strong>de</strong>a se hubiera echado a per<strong>de</strong>r por lamala gestión <strong>de</strong> la misma. Resulta impensable que el jefe <strong>de</strong> la oficina <strong>de</strong>patentes don<strong>de</strong> Einstein trabajaba se presentara un día en el trabajodiciendo:


¿Qué pasa en este país? [ 13 ]"Albert, he pensado que quizás la velocidad <strong>de</strong> la luz es unaconstante universal no sujeta a la medición relativa que sufrentodas las <strong>de</strong>más mediciones. Las consecuencias pue<strong>de</strong>n ser muyinteresantes, po<strong>de</strong>mos llegar incluso a la energía nuclear. Quieroque <strong>de</strong>diques todos los días un par <strong>de</strong> horas a <strong>de</strong>sarrollar esto.Tiene que estar listo en seis meses.Los hitos <strong>de</strong>l proyecto son:1905 - relatividad especial (un primer boceto <strong>de</strong> la i<strong>de</strong>a)1915 - relatividad general (<strong>de</strong>sarrollo matemático ygeneralización)1950 - centrales nucleares"Es mucho más probable que lo que ocurriera fuera algo como:"Albert, el futuro es <strong>de</strong>sarrollar unas nubes tan <strong>de</strong>nsas que la gentepueda volar en ellas y viajar prescindiendo <strong>de</strong>l avión, que es uninvento obsoleto. En dos años ya se habrá superado y no po<strong>de</strong>mosquedarnos atrás. Así que <strong>de</strong>ja esos papeles que garabateas todoslos días y ponte con esto ya."Las i<strong>de</strong>as son mucho más que una simple frase. En el mundo <strong>de</strong> laprogramación no cuenta sólo la i<strong>de</strong>a, sino la i<strong>de</strong>a <strong>de</strong> comó llevar a cabo lai<strong>de</strong>a. A los fundadores <strong>de</strong> Google no se les ocurrió simplemente hacer unbuscador. Eso lo hacía todo el mundo por aquel entonces. Se les ocurrieroni<strong>de</strong>as para hacer uno mucho mejor que el <strong>de</strong> los <strong>de</strong>más. Y eso nunca podríahabérsele ocurrido a un tipo que reunió unos millones vendiendocamisetas y ahora quiere revolucionar la informática (porque él lo vale).Un día el jefe llega y dice "Vamos a hacer un programa <strong>de</strong> CAD que<strong>de</strong>sbanque al AutoCAD". Uno se queda esperando por lo que <strong>de</strong>bería venira continuación. A ver cuáles son esas i<strong>de</strong>as para un programa <strong>de</strong> CADrevolucionario. Pero no las hay, eso ya lo hará el programador quecontratemos. Al final, si a caso el jefe nos dirá don<strong>de</strong> colocar los botones <strong>de</strong>dibujado para que el programa sea bueno <strong>de</strong> verdad.Este tipo <strong>de</strong> casos tendrían que conllevar incluso penas <strong>de</strong> cárcel. Es porello que el artículo 1 es fundamental. Las prácticas como ésta llevan a untotal <strong>de</strong>sperdicio <strong>de</strong> tiempo, dinero, paciencia y todo tipo <strong>de</strong> recursos.Vamos ahora con el segundo artículo <strong>de</strong> nuestro estatuto:


[ 14 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DArtículo 2: El uso <strong>de</strong>l PowerPoint y herramientas similaresserá perseguido y castigado.Admito que pue<strong>de</strong> parecer <strong>de</strong>masiado radical. Cierto es que a la hora<strong>de</strong> exponer algo a un público, unas transparencias pue<strong>de</strong>n venir bien. Peroen los últimos años, estas herramientas se han convertido en el únicoobjetivo <strong>de</strong> trabajo <strong>de</strong> un montón <strong>de</strong> <strong>de</strong>sorientados. Es uno <strong>de</strong> los casosdon<strong>de</strong> el medio acaba convirtiéndose en el propio fin. ¿A cuántaspresentaciones vacías <strong>de</strong> contenido hemos <strong>de</strong> asistir para darnos cuenta?Una herramienta que permite a cualquiera hacer una presentaciónconsigue implantar la creencia <strong>de</strong> que todos tienen algo importantísimoque <strong>de</strong>cir.Ahora mismo la relación señal/ruido en cuanto a presentaciones esbajísima en todas partes. Montones <strong>de</strong> personas en esta industria llegancada día al trabajo para abrir inmediatamente el powerpoint y ponerse ahacer la presentación <strong>de</strong> mañana. Ven<strong>de</strong>mos humo, pero ven<strong>de</strong>mos humocon colorines, animaciones, gráficas dinámicas y sobre todo, mucha negritae imágenes <strong>de</strong>l catálogo "bussines".Nadie que quiera <strong>de</strong>cir algo necesita esa parafernalia. Siempre se hanhecho "diapositivas", pero se hacían <strong>de</strong> otra forma, y no se hacía unapresentación cada dos días. Lo que estos programas han creado, es una"cultura <strong>de</strong>l powerpoint". El lector pue<strong>de</strong> estar pensando ahora que elhecho <strong>de</strong> que un cuchillo pueda usarse para matar, no quiere <strong>de</strong>cir quehaya que prohibir los cuchillos. Efectivamente, pero si nos fijamos en elartículo 2, nadie habla <strong>de</strong> prohibir las herremientas. Se trata <strong>de</strong> perseguir ycastigar su uso. ¿Cuántas veces hemos querido <strong>de</strong>cir "Ese gráfico no dicenada, es más, causa confusión, vas a ir a la carcel chaval" ?. Que ocurraalguna vez es aceptable, pero no que ocurra todos los días, miles <strong>de</strong> veces,en todas las empresas al mismo tiempo.Y finalemente vamos con el tercer y último artículo por ahora:Artículo 3: Se prohíbe el <strong>de</strong>sarrollo <strong>de</strong> ningúnprograma que no sea susceptible <strong>de</strong> serprogramado por una sola persona.Esto no quiere <strong>de</strong>cir que no puedan trabajar varios en él. Pero un programaque no pueda ser hecho por un sólo programador está, sencillamente, malpensado. ¿Qué pasa con los gran<strong>de</strong>s sistemas complejos? Antiguamente setendía al <strong>de</strong>sarrollo <strong>de</strong> gran<strong>de</strong>s programas monolíticos que tenían unmontón <strong>de</strong> funcionalida<strong>de</strong>s. Enormes sistemas <strong>de</strong> gestión que controlabanhospitales enteros, sistemas operativos que lo controlaban todo con elmismo código.


¿Qué pasa en este país? [ 15 ]Ahora, la ten<strong>de</strong>ncia en el mundo ha cambiado. Esos gran<strong>de</strong>s sistemas se<strong>de</strong>sglosan en pequeños programas. Los sistemas <strong>de</strong> gestión se componenahora <strong>de</strong> muchos servicios distintos que se interconectan usando múltiplesprotocolos. Los programas complejos <strong>de</strong> por si se reducen al mínimo <strong>de</strong>funcionalida<strong>de</strong>s y se <strong>de</strong>jan puertas a la integración con otros programasque hacen otras cosas.Con esta política <strong>de</strong> <strong>de</strong>sarrollo, sin duda mejor que la otra, se consiguenprogramas que hacen unas pocas cosas muy bien. Los programas son máspequeños y por tanto más mantenibles. Incluso los sistemas operativos sedivi<strong>de</strong>n ahora en módulos totalmente in<strong>de</strong>pendientes encargados <strong>de</strong> tareasespecíficas. Los clientes prefieren también estas soluciones, porquecuando quieren añadir algo nuevo al sistema no tienen que reemplazarlotodo. Pue<strong>de</strong>n comprar el sistema <strong>de</strong> visualización <strong>de</strong> esta empresa, lagestión <strong>de</strong> bases <strong>de</strong> datos <strong>de</strong> esta otra y el interfaz web <strong>de</strong> la <strong>de</strong> más allá.Pero aquí los empresarios no parecen haberse dado por enterados. Salvounas pocas muy buenas, la mayoría <strong>de</strong> pequeñas empresas que quierencrecer se obsesionan con sacar un programa que lo haga todo. Tiene queservir para hablar por teléfono, para grabar cd's, para gestionar losclientes, para mandar un mail, etc ... Sólo las gran<strong>de</strong>s compañías parecenadaptarse a este nuevo mo<strong>de</strong>lo <strong>de</strong> <strong>de</strong>sarrollo. Pero es que en España, éstasllevan tiempo haciendo meras tareas <strong>de</strong> fontanería informática. En laspequeñas que se <strong>de</strong>dican a nuevos proyectos se cometen muchos errores.Incluso aunque parezca que los productos que se plantean son muyespecializados, al final se le pi<strong>de</strong> al programador que implemente todo tipo<strong>de</strong> funcionalida<strong>de</strong>s que en ese programa no tienen ningún sentido. Elresultado son programas que hacen un montón <strong>de</strong> cosas, pero ningunabien.Hay unos pocos ejemplos <strong>de</strong> empresas en España que triunfan conproductos específicos y <strong>de</strong> calidad. No sólo por el personal <strong>de</strong> calidad,a<strong>de</strong>más tienen muy claro el objetivo <strong>de</strong>l <strong>de</strong>sarrollo. Por <strong>de</strong>sgracia empresasasí no abundan. Pero con pocas que sean, se <strong>de</strong>muestra que no esimposible.Aquí acaba este primer boceto <strong>de</strong>l estatuto <strong>de</strong>l programador. Aunque sonsólo tres directivas, son cruciales para arreglar el <strong>de</strong>sastre local quesufrimos. Todo el mundo está invitado a intentar completar la lista <strong>de</strong>artículos en caso <strong>de</strong> que me haya olvidado <strong>de</strong> algún aspecto.Ahora llegamos a la pregunta final. ¿Qué hacer? Lo primero abandonar esetipo <strong>de</strong> empresas y convertirnos en su competencia. Muchosprogramadores <strong>de</strong>ci<strong>de</strong>n muy acertadamente ponerse a trabajar por cuentapropia. No todo el mundo se atreve <strong>de</strong>bido a diversas razones. Entre ellashay dos muy comunes.


[ 16 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLa primera es el miedo a per<strong>de</strong>r la tranquilidad <strong>de</strong> que vas a cobrar a final<strong>de</strong> mes. Pero esta tranquilidad no es más que una ilusión. Si en unmomento dado la empresa <strong>de</strong>ja <strong>de</strong> funcionar <strong>de</strong>jarás <strong>de</strong> cobrar. Y elproblema es que no pue<strong>de</strong>s hacer nada al respecto. Es <strong>de</strong>cir, es posible,muy posible, que un grupo <strong>de</strong> inconscientes estrelle la empresa contigo<strong>de</strong>ntro. Cuando sólo <strong>de</strong>pen<strong>de</strong>s <strong>de</strong> ti mismo o <strong>de</strong> otros como tú al mismonivel, sí se pue<strong>de</strong> hacer algo. Depen<strong>de</strong> sólo <strong>de</strong> que hagas las cosas bien.La segunda es una extraña concepción <strong>de</strong> la moral. Hay gente queconsi<strong>de</strong>ra incorrecto o <strong>de</strong>sleal irse <strong>de</strong> una empresa para ir a hacerle lacompetencia. Hay que <strong>de</strong>shacerse <strong>de</strong> esa barrera imaginaria. La empresano dudaría ni un segundo en prescindir <strong>de</strong> tus servicios si ya no te necesita.Tampoco verás un céntimo <strong>de</strong> la riqueza que hayas podido generar másallá <strong>de</strong> tu mísero sueldo. No sólo se <strong>de</strong>be hacer por uno mismo, losprogramas merecen ser bien hechos.Por <strong>de</strong>sgracia uno no pue<strong>de</strong> <strong>de</strong>cirle a su jefe que va a ser 10 veces másproductivo y que quiere cobrar por lo tanto diez veces más. Tomo prestadaesta frase <strong>de</strong> Paul Graham. Entre sus ensayos po<strong>de</strong>mos encontrar unmontón <strong>de</strong> consejos a la hora <strong>de</strong> lanzar iniciativas <strong>de</strong> empresa. Al contrarioque yo, él es un hombre con experiencia en este campo. Su colección <strong>de</strong>"bombazos" empieza en el 95 con un sistema <strong>de</strong> comercio electrónico quevendió a Yahoo y que le hizo inmensamente rico.Obviamente no estamos hablando <strong>de</strong>l típico que hizo dinero vendiendoADSL y que ahora quiere hacer programas. Estamos hablando <strong>de</strong> un granprogramador.La falta <strong>de</strong> ambición es otro gran problema local. Nadie piensa ni <strong>de</strong> lejosque pue<strong>de</strong> llegar a hacerse inmensamente rico con un producto. Algunos lodicen, pero ni ellos ni los que les ro<strong>de</strong>an creen realmente en ello. La genteaspira a ganar un poco <strong>de</strong> dinero para comprar un BMW y po<strong>de</strong>r presumiren el barrio como "hombre <strong>de</strong> negocios".Como advertencia a todo aquél que vaya a salir al mundo laboral <strong>de</strong> laprogramación como asalariado, aquí viene lo que encontrará:●Salarios bajos. Dependiendo <strong>de</strong> la región, el sueldo <strong>de</strong>principiante va <strong>de</strong>s<strong>de</strong> los 15000 a los 24000 euros al año.Teniendo ya cierta experiencia se pue<strong>de</strong> llegar con suerte a los30000. A modo <strong>de</strong> comparación, en Inglaterra, un sueldo <strong>de</strong>programador raso es <strong>de</strong> 50000 libras. Unos 80000 euros. Al igualmás o menos que el resto <strong>de</strong> Europa. No mencionamos ya lossueldos <strong>de</strong> Estados Unidos por no <strong>de</strong>primir al lector. La excusa <strong>de</strong>lprecio <strong>de</strong> la vida ya no es válida. Aunque un DVD cueste más queaquí, en Alemania se pue<strong>de</strong> alquilar un piso por 300 euros.


¿Qué pasa en este país? [ 17 ]● Régimen <strong>de</strong> <strong>de</strong>sprecio. Generalmente se apila a losprogramadores en algún cuarto apartado. Si viene alguienimportante, o simplemente, el gerente <strong>de</strong> otra empresa, en caso <strong>de</strong>que los llegue a ver será a modo <strong>de</strong> "Y estos son losprogramadores". Igual que si se tratara <strong>de</strong> una jaula <strong>de</strong> monos.Muchas veces he querido colocar un cartel <strong>de</strong> "no <strong>de</strong>n <strong>de</strong> comer alos programadores". Este trato se <strong>de</strong>be a muchos motivos. Pero <strong>de</strong>todos ellos, el más sangrante es el miedo. El miedo a que alguien<strong>de</strong> fuera acabe haciendo una oferta a alguno <strong>de</strong> los programadorespara que se vaya con él.●Total anonimato. No tienes <strong>de</strong>recho a ningún reconocimientoexterno por tu trabajo. El producto es <strong>de</strong> la empresa. Mejor dicho,<strong>de</strong>l presi<strong>de</strong>nte <strong>de</strong> la empresa. Nadie vendrá a felicitarte por lo quehas hecho y mucho menos verás un céntimo <strong>de</strong> los beneficios. Eneste país hay empresarios que serían capaces <strong>de</strong> poner a MiguelAngel a esculpir, hacer millones con sus esculturas y pagarle unamiseria <strong>de</strong> sueldo. Porque al fin y al cabo, el mármol que usa esmío ... ¿Te gustan las esculturas que hace mi empresa?Si no nos queda otro remedio que trabajar para una <strong>de</strong> estas empresasporque haya que pagar una hipoteca o cualquier cosa, mi consejo es elsiguiente: Jamas regalar ni una sola i<strong>de</strong>a a la empresa. Si se te ocurrecualquier forma <strong>de</strong> hacer mejor las cosas, lo haces en casa. Lo <strong>de</strong>sarrollaspor tu cuenta y ya lo ven<strong>de</strong>rás, lo darás como código libre o lo queapetezca. Ya que nos tratan como a ganado, actuemos como ganado. Nohacer nada que no se or<strong>de</strong>ne explícita y <strong>de</strong>talladamente.No ha sido mi intención mostrar al programador como un individuoextramadamente valioso ni superior al resto <strong>de</strong> los mortales. El énfasis nose <strong>de</strong>be a una especial estima por la profesión sino al profundo agujero enel que se haya hundida. Pero e<strong>xi</strong>ste el riesgo <strong>de</strong> que como pasó con otroscolectivos marginados, se produzca un efecto rebote hacia lasobrevaloración. Convendría no esperar a que la herida fuera <strong>de</strong>masiadoprofunda o que todos hayan emigrado hacia otros paises. Este mal no esa<strong>de</strong>más exclusivo <strong>de</strong> la industria <strong>de</strong>l software. Todos conocemos elfenómeno <strong>de</strong> la fuga <strong>de</strong> cerebros que sufren todas las disciplinasintelectuales en España. Este caso es sólo uno más <strong>de</strong> la lista.


[ 18 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DReferenciasEnsayos <strong>de</strong> Paul Graham:http://www.paulgraham.com/articles.htmlSobre PowerPoint:■■http://www.norvig.com/Gettysburg/http://www.unc.edu/~healdric/Powerpoint.html


YafRay <strong>de</strong> la Y a la yRefle<strong>xi</strong>ones sobre los Proyectos <strong>de</strong> Software LibreFilosofíaCLuis Fernando Ruiz Gagoluis@yafray.org ::uando uno oye hablar <strong>de</strong>l software libre por primera vezle asaltan un montón <strong>de</strong> dudas. ¿Quien <strong>de</strong>sarrolla esesoftware? ¿Por qué se llama libre y no gratis? ¿¡Gratis!?¿Por qué se <strong>de</strong>sarrolla y cómo? Si los roedores pudieran roerrobles, ¿Cuántos robles roería un roedor? Intentaremos contestara estas preguntas en el presente documento, siguiendo elciclo <strong>de</strong> vida <strong>de</strong>l proyecto en el que me he visto involucrado (enel sentido más amplio <strong>de</strong> la palabra) en los últimos años:YafRay.YafRay. Bajo este nombre <strong>de</strong> lavavajillas se escon<strong>de</strong> Yet Another FreeRaytracer, un raytracer gratuito y multiplataforma, creado por mi granamigo Alejandro Conty Estévez. Un raytracer es un programa que sevale <strong>de</strong> una técnica llamada raytracing para generar imágenesfotorrealistas con un computador.Su <strong>de</strong>sarrollo comenzó en Julio <strong>de</strong> 2002. Inicialmente se trataba <strong>de</strong> unraytracer básico para el sistema operativo GNU/Linux. Posteriormente sele fueron añadiendo funcionalida<strong>de</strong>s, una <strong>de</strong> las más importantes fue elcargador <strong>de</strong> escenas en un formato propio utilizando XML. De este modofue posible la exportación <strong>de</strong> escenas <strong>de</strong>s<strong>de</strong> programas <strong>de</strong> mo<strong>de</strong>lado parala posterior generación <strong>de</strong> la imagen utilizando YafRay.Este hecho produjo un gran interés en comunida<strong>de</strong>s internacionalesrelacionadas con el mundo <strong>de</strong> los gráficos tridimensionales (Elysiun -ahoraBlen<strong>de</strong>r Artists-, Blen<strong>de</strong>r.org, Wings3D.org, entre otras), creándoseprogramas que permitían la exportación <strong>de</strong> escenas <strong>de</strong>s<strong>de</strong> los mo<strong>de</strong>ladoresmás importantes <strong>de</strong>ntro <strong>de</strong>l software libre como son Blen<strong>de</strong>r yWings3D.Como fruto <strong>de</strong> ese interés se amplió el <strong>de</strong>sarrollo <strong>de</strong> YafRay a otrossistemas operativos a parte <strong>de</strong> GNU/Linux. Primero se llevó a cabo latraducción para sistemas operativos Windows. De manera casi simultánease <strong>de</strong>sarrollaron versiones para Mac OS X.Actualmente, YafRay se basa en un mo<strong>de</strong>lo <strong>de</strong> plugins, en el cual el motor<strong>de</strong> ren<strong>de</strong>r está contenido en una librería separada <strong>de</strong>l cargador XML. Deesta manera, es relativamente sencillo construir cargadores o invocarlo[ 19 ]


[ 20 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D<strong>de</strong>s<strong>de</strong> otros programas. A su vez, el motor <strong>de</strong> ren<strong>de</strong>r (librería principal) esel encargado <strong>de</strong> cargar, en tiempo <strong>de</strong> ejecución, los plugins relativos a losmétodos <strong>de</strong> iluminación (sha<strong>de</strong>rs, luces, etc). Esta modularidad hafacilitado su integración con Blen<strong>de</strong>r.En un principio todo el trabajo <strong>de</strong> <strong>de</strong>sarrollo recaía sobre Alejandro Conty.A medida que pasaba el tiempo y el interés por YafRay aumentaba,aparecían nuevos <strong>de</strong>sarrolladores y colaboradores. Lo que empezó comoun proyecto personal para pasar las horas <strong>de</strong>l verano <strong>de</strong> 2002, se acabóconvirtiendo en un largo proyecto <strong>de</strong> software libre que involucra aprogramadores <strong>de</strong> todo el mundo y con una comunidad <strong>de</strong> cientos <strong>de</strong>usuarios.Antes <strong>de</strong> entrar <strong>de</strong> lleno en el proyecto YafRay, me gustaría sentar las bases<strong>de</strong>l mo<strong>de</strong>lo <strong>de</strong> software libre, sin preten<strong>de</strong>r un análisis exhaustivo sobre elciclo <strong>de</strong> vida <strong>de</strong>l mismo. No hablaré aquí sobre herramientas <strong>de</strong> ingenieríao <strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong> una manera profunda. El objetivo <strong>de</strong> este documento,que es el apoyo a la charla <strong>de</strong>l mismo nombre, es introducir al lector en laproblemática <strong>de</strong>l software libre, refle<strong>xi</strong>onando sobre las motivaciones <strong>de</strong>sus <strong>de</strong>sarrolladores, entendiendo el funcionamiento <strong>de</strong> las comunida<strong>de</strong>sque orbitan alre<strong>de</strong>dor <strong>de</strong> estos proyectos y sopesando las ventajas einconvenientes <strong>de</strong> este mo<strong>de</strong>lo.E<strong>xi</strong>sten multitud <strong>de</strong> estudios a este respecto mucho más precisos que este,en su mayoría elaborados con rigor científico por personas máscapacitadas, pero ¡No <strong>de</strong>jes <strong>de</strong> leer aún! Aunque no vayas a encontrar aquíuna fuerte base teórica <strong>de</strong> ingeniería <strong>de</strong>l software (libre), pue<strong>de</strong> que teresulte interesante la experiencia <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong>l YafRay, cómo se nutre<strong>de</strong> aportaciones <strong>de</strong>sinterasadas y sobre todo, cómo esta pequeñacomunidad <strong>de</strong> <strong>de</strong>sarrolladores y usuarios se apoya en otras comunida<strong>de</strong>smayores.Software LibreEs <strong>de</strong> suponer que alguien que lee sobre la evolución <strong>de</strong> proyectos <strong>de</strong>software libre sabe a qué se refiere ese tipo <strong>de</strong> software. Pero como todoshemos sido lectores <strong>de</strong>spistados en alguna ocasión, hay que comentar unavez más que el software libre, según la <strong>de</strong>finición <strong>de</strong>l proyecto GNU, esaquel software que brinda al usuario las siguientes liberta<strong>de</strong>s:●●Libertad 0: La libertad <strong>de</strong> usar el programa, con cualquierpropósito.Libertad 1: La libertad <strong>de</strong> estudiar cómo funciona el programa, yadaptarlo a tus necesida<strong>de</strong>s. El acceso al código fuente es unacondición previa para esto.


YafRay <strong>de</strong> la Y a la y [ 21 ]●Libertad 2: La libertad <strong>de</strong> distribuir copias, con lo que pue<strong>de</strong>sayudar a tu vecino.● Libertad 3: La libertad <strong>de</strong> mejorar el programa y hacer públicaslas mejoras a los <strong>de</strong>más, <strong>de</strong> modo que toda la comunidad sebeneficie. El acceso al código fuente es un requisito previo paraesto.En internet se pue<strong>de</strong> encontrar una inmensa cantidad <strong>de</strong> literatura,documentación y FAQ's sobre el esta filosofía. El lector que no estéfamiliarizado con el término <strong>de</strong>bería <strong>de</strong>tenerse en este punto y buscarinformación al respecto, no sólo para po<strong>de</strong>r seguir con flui<strong>de</strong>z estedocumento, sino porque la i<strong>de</strong>a que subyace bajo el concepto es digna <strong>de</strong>ser meditada. No hay que olvidar que dicha i<strong>de</strong>a se ha convertido paramuchos en toda una forma <strong>de</strong> vida.Quizás el software libre parezca una i<strong>de</strong>a actual, una vuelta <strong>de</strong> tuerca a lasprotestas contra el sistema. Incluso en EEUU han llegado a tachar <strong>de</strong>actitu<strong>de</strong>s comunistas los principios en los que se basa. Pero realmente,aunque estemos acostumbrados al mo<strong>de</strong>lo <strong>de</strong> software propietario(comercial), en los inicios <strong>de</strong> la informática era imposible concebir elsoftware como un producto aislado, susceptible <strong>de</strong> ser vendido. Laslicencias por el uso <strong>de</strong>l software y las restricciones para ejecutarlo ocopiarlo, sencillamente no e<strong>xi</strong>stían.En aquellos tiempos los programas y las máquinas que los ejecutabanestaban íntimamente ligados. No e<strong>xi</strong>stía el concepto <strong>de</strong> programa comopieza separada que se tiene hoy. Tampoco había usuarios domésticos, sinoque las personas que ejecutaban los programas solían tener muchosconocimientos <strong>de</strong> programación y por lo general eran científicos eingenieros.Entre estos usuarios expertos, lo normal era intercambiar y mejorar losprogramas, compartiendo sus modificaciones, que a veces recibían elnombre <strong>de</strong> hacks (<strong>de</strong> ahí la palabra hacker, tan mal utilizada en los últimostiempos).Uno <strong>de</strong> aquellos usuarios expertos era Richard Mathew Stallman (aveces nombrado por el acrónimo RMS, basado en su nombre <strong>de</strong> usuario enlos computadores <strong>de</strong>l MIT), un personaje a la vez genial y controvertido,imprescindible para compren<strong>de</strong>r el software libre.Este físico, graduado en 1974 en Harvard, trabajaba en el laboratorio <strong>de</strong>inteligencia artificial <strong>de</strong>l Instituto <strong>de</strong> Tecnología <strong>de</strong> Massachussetts (MIT)<strong>de</strong>s<strong>de</strong> 1971. En su laboratorio disponían <strong>de</strong> una impresora que tenía ciertosproblemas con la alimentación <strong>de</strong> papel, <strong>de</strong> manera que se atascabahabitualmente y no había otra forma <strong>de</strong> <strong>de</strong>scubrirlo que <strong>de</strong>splazarse hastadon<strong>de</strong> estaba.


[ 22 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DRichard se puso en contacto con los fabricantes, con la i<strong>de</strong>a <strong>de</strong> modificar elsoftware que controlaba la impresora y hacer que enviase una señal alatascarse, <strong>de</strong> forma que no se perdiese tanto tiempo <strong>de</strong> trabajo.Sin embargo, éstos se negaron a facilitarle el código fuente, que son como"los planos" <strong>de</strong> un programa y que hace posible modificar sucomportamiento. Este episodio le contrarió mucho e hizo que terminase <strong>de</strong>consolidarse su i<strong>de</strong>a <strong>de</strong> que el código fuente <strong>de</strong> los programas tenía queestar accesible para todo el mundo.Movido por este <strong>de</strong>seo, abandonó el MIT en enero <strong>de</strong> 1984, para iniciar elproyecto GNU. GNU es un acrónimo recursivo que significa GNU's NotUnix, GNU No Es UNIX, en referencia a que el proyecto busca <strong>de</strong>sarrollarun sistema operativo <strong>de</strong> tipo UNIX, pero libre.En sus comienzos, el proyecto GNU se concentró en <strong>de</strong>sarrollar lasherramientas necesarias para construir un sistema operativo, comoeditores y compiladores y en las utilida<strong>de</strong>s básicas para la gestión <strong>de</strong>lsistema. Sobre 1985, Richard Stallman creó la licencia GPL (GeneralPublic License) como mecanismo para proteger el software libre,sustentado sobre el concepto <strong>de</strong> copyleft. Mediante este concepto, se le dala vuelta a la i<strong>de</strong>a <strong>de</strong> copyright, <strong>de</strong>finiendo las cuatro liberta<strong>de</strong>smencionadas anteriormente.Uno <strong>de</strong> los conceptos que se suelen mezclar con el software libre(reconozco que me suce<strong>de</strong> habitualmente) es el <strong>de</strong> Open Source (códigoabierto). Po<strong>de</strong>mos consi<strong>de</strong>rarlo como un error justificable, ya que en lapráctica el software Open Source y el software libre comparten las mismaslicencias. Aunque la FSF (Free Software Foundation) opina que elmovimiento Open Source es filosóficamente diferente <strong>de</strong>l movimiento <strong>de</strong>lsoftware libre.Apareció en 1998 con un grupo <strong>de</strong> personas, entre los que cabe <strong>de</strong>stacar aEric S. Raymond (autor <strong>de</strong> "La Catedral y el Bazar" y <strong>de</strong> fetchmail) yBruce Perens (padre <strong>de</strong>l proyecto Debian), que formaron la Open SourceInitiative (OSI). Buscaban darle mayor relevancia a los beneficios prácticos<strong>de</strong>l compartir el código fuente, e interesar a las principales casas <strong>de</strong>software y otras empresas <strong>de</strong> la industria <strong>de</strong> la alta tecnología en elconcepto. Estos <strong>de</strong>fensores ven que el término Open Source evita laambigüedad <strong>de</strong>l termino Inglés free en free software.Mucha gente reconoce el beneficio cualitativo <strong>de</strong>l proceso <strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong>software cuando cualquiera pue<strong>de</strong> usar, modificar y redistribuir el códigofuente <strong>de</strong> un programa. Esta es la i<strong>de</strong>a subyacente <strong>de</strong> la obra <strong>de</strong> Raymond,"La Catedral y el Bazar", que analizaremos más a<strong>de</strong>lante. El movimiento<strong>de</strong>l software libre hace especial énfasis en los aspectos morales o éticos <strong>de</strong>lsoftware, viendo la excelencia técnica como un producto secundario


YafRay <strong>de</strong> la Y a la y [ 23 ]<strong>de</strong>seable <strong>de</strong> su estándar ético. El movimiento Open Source ve la excelenciatécnica como el objetivo prioritario, siendo la compartición <strong>de</strong>l códigofuente un medio para dicho fin. Por dicho motivo, la FSF se distanciatanto <strong>de</strong>l movimiento Open Source como <strong>de</strong>l propio término.Ingeniería <strong>de</strong>l SoftwareLa ingeniería <strong>de</strong> software es la rama <strong>de</strong> la ingeniería que crea y mantienelas aplicaciones <strong>de</strong> software aplicando tecnologías y prácticas <strong>de</strong> lasciencias computacionales, manejo <strong>de</strong> proyectos, ingeniería, el ámbito <strong>de</strong> laaplicación, y otros campos.Este término es relativamente nuevo, ya que no apareció hasta finales <strong>de</strong>los 60, cuando ya e<strong>xi</strong>stían gran<strong>de</strong>s compañías informáticas. En aquellaépoca, una serie <strong>de</strong> estudios sobre <strong>de</strong>sarrollo <strong>de</strong> software llegaron a laconclusión <strong>de</strong> que e<strong>xi</strong>stía una "crisis <strong>de</strong>l software". Esta crisis tiene lossiguientes síntomas:●●El software no es fiable y necesita <strong>de</strong> un mantenimientopermanente.El software se entrega muy a menudo con retrasos y con unoscostes superiores a los presupuestados.●A menudo el software es imposible <strong>de</strong> mantener, carece <strong>de</strong>transparencia y no se pue<strong>de</strong> modificar ni mejorar.Como solución a esta crisis surge la i<strong>de</strong>a <strong>de</strong> aplicar un proceso <strong>de</strong>ingeniería para el <strong>de</strong>sarrollo <strong>de</strong> software. Según la <strong>de</strong>finición <strong>de</strong>l IEEE, laingeniería <strong>de</strong>l software es "un enfoque sistemático y cuantificable al<strong>de</strong>sarrollo, operación (funcionamiento) y mantenimiento <strong>de</strong>l software: es<strong>de</strong>cir, la aplicación <strong>de</strong> la ingeniera <strong>de</strong>l software".La ingeniería, no sólo la <strong>de</strong>l software, preten<strong>de</strong> aplicar con criterio elconocimiento matemático y científico obtenido a través <strong>de</strong>l estudio, laexperiencia, y la práctica. En la mayor parte <strong>de</strong> las ramas <strong>de</strong> la ingenieríaes posible cuantificar con exactitud plazos, recursos humanos, costes ytécnicas que lleven a cabo un <strong>de</strong>terminado producto. Pero cuando eseproducto se trata <strong>de</strong> software surgen los problemas, ya que aún no se hanencontrado métodos <strong>de</strong> <strong>de</strong>sarrollo y técnicas que permitan producirsoftware <strong>de</strong> gran calidad con unos recursos limitados.A pesar <strong>de</strong> que la ingeniería <strong>de</strong>l software ha conseguido notables é<strong>xi</strong>tos, noes menos cierto que no ha sido capaz <strong>de</strong> superar la crisis <strong>de</strong>l software. Hayquien piensa que más que <strong>de</strong> una crisis, estamos hablando <strong>de</strong> una


[ 24 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Denfermedad crónica. Es una refle<strong>xi</strong>ón plausible, más aún viendo como enlos últimos años se han retomado viejos caminos bajo nuevas fórmulas <strong>de</strong>ingeniería. Quien sabe, quizás sean los nuevos mo<strong>de</strong>los <strong>de</strong> <strong>de</strong>sarrollo losque permitan al software librarse <strong>de</strong> esta crisis, hasta hoy irresoluble.Ingeniería <strong>de</strong>l Software tradicional: SoftwarepropietarioDentro <strong>de</strong>l mo<strong>de</strong>lo propietario, la propia forma <strong>de</strong> <strong>de</strong>sarrollar softwareha sido quien ha llevado a la ingeniería <strong>de</strong>l software a la crisis. No es unaafirmación a la ligera ya que, como afirma Gregorio Robles, "el formatobinario <strong>de</strong>l software, la opacidad en los mo<strong>de</strong>los <strong>de</strong> negocios, los secretosy barreras comerciales se encuentran entre las principales causas quehan imposibilitado estudios cuantitativos y cualitativos a gran escala <strong>de</strong>lsoftware cuyos resultados pudieran ser verificados sistemáticamente porequipos <strong>de</strong> investigación in<strong>de</strong>pendientes".Es paradójico ver como el propio mo<strong>de</strong>lo <strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong>stinado a evitarque un software robusto y potente pueda ser aprovechado por lacompetencia, impi<strong>de</strong> la consecución <strong>de</strong>l objetivo primordial: Conseguir unsoftware robusto y potente.Ingeniería <strong>de</strong>l Software LibreNo hay que enten<strong>de</strong>r al software libre como un competidor directosobre el software propietario. Hay diferencias <strong>de</strong> base, como las razonesmotivacionales, casi filosóficas, <strong>de</strong> los <strong>de</strong>sarrolladores. Tampoco se pue<strong>de</strong>comparar a nivel económico, ya que el software libre sigue sus propiaspautas <strong>de</strong> mercado y <strong>de</strong>s<strong>de</strong> luego, no suele coincidir con el softwarepropietario en la forma <strong>de</strong> obtener beneficios. Y lo que es más importante,la forma <strong>de</strong> producir software es totalmente diferente.La ingeniería <strong>de</strong>l software no es ajena a todo esto y <strong>de</strong>s<strong>de</strong> hace unos cincoaños viene estudiando este nuevo mo<strong>de</strong>lo <strong>de</strong> <strong>de</strong>sarrollo. En un principiopo<strong>de</strong>mos pensar que la propia naturaleza <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong> software libreva a hacer fracasar cualquier intento <strong>de</strong> aplicación <strong>de</strong> ingeniería. Porejemplo, si en el caso propietario la medición <strong>de</strong> costes es difícilmentecuantificable, en el caso <strong>de</strong>l software libre tendremos que acudir a magos yhechiceros para que nos resuelvan la papeleta. Sin embargo, latransparencia en todos los procesos, la disponibilidad <strong>de</strong>l código y en lamayor parte <strong>de</strong> los casos <strong>de</strong> todas las versiones <strong>de</strong> <strong>de</strong>sarrollo, permiten quepodamos analizar profundamente cualquier proyecto.


YafRay <strong>de</strong> la Y a la y [ 25 ]No <strong>de</strong>bemos caer en la tentación <strong>de</strong> reducir el análisis a un simple punto <strong>de</strong>vista estadístico. Hay muchas características <strong>de</strong>ntro <strong>de</strong> un <strong>de</strong>sarrollo libreque caen <strong>de</strong>ntro <strong>de</strong>l campo <strong>de</strong> lo sociológico. Analizar la comunidad <strong>de</strong>usuarios y <strong>de</strong>sarrolladores que orbita alre<strong>de</strong>dor <strong>de</strong> un proyecto <strong>de</strong> softwarelibre nos dará una gran información sobre la naturaleza <strong>de</strong> las <strong>de</strong>cisiones,fallos o aciertos, que se hayan tomado durante el <strong>de</strong>sarrollo. Nuevamenteel carácter abierto <strong>de</strong> estas comunida<strong>de</strong>s nos brinda la posibilidad <strong>de</strong>lanálisis, ya que las bases <strong>de</strong>l conocimiento suelen estar contenidas en forosy listas <strong>de</strong> distribución.Las comunida<strong>de</strong>s son el auténtico motor <strong>de</strong>l software libre. Habitualmentelas forman indistintamente usuarios y <strong>de</strong>sarrolladores. No suele estar muyclara la distinción entre ambos roles ya que, incluso los usuarios que nogeneran código, se convierten en parte <strong>de</strong>l proceso <strong>de</strong> <strong>de</strong>sarrollo realizandouna <strong>de</strong> las labores más tediosas en la producción <strong>de</strong> software: las pruebas.Este es uno <strong>de</strong> los gran<strong>de</strong>s aportes <strong>de</strong>l software libre, puesto que losusuarios influyen, directa e indirectamente, en el <strong>de</strong>sarrollo. La evolución<strong>de</strong> la comunidad pues, forma parte <strong>de</strong> la evolución <strong>de</strong>l propio software.Veamos el caso <strong>de</strong> YafRay. En un principio no era más que un proyectopersonal <strong>de</strong> su autor, planteado como programa in<strong>de</strong>pendiente y con unaspocas funcionalida<strong>de</strong>s. Esto suele ser una constante en el software libre,don<strong>de</strong> los proyectos surgen por acciones puramente personales.Normalmente el <strong>de</strong>sarrollador <strong>de</strong>ci<strong>de</strong> publicar el código cuando ve limitadasu capacidad, no necesariamente en conocimientos, sino que también sesuele <strong>de</strong>ber a falta <strong>de</strong> tiempo para realizar todo el trabajo. En el caso <strong>de</strong>YafRay el código se liberó <strong>de</strong>s<strong>de</strong> un principio, ya que no pretendía ser másque un experimento <strong>de</strong>l autor con el fin <strong>de</strong> apren<strong>de</strong>r y aplicar conceptossobre raytracing.Los usuarios <strong>de</strong> la comunidad fueron los que convirtieron el proyecto enalgo más serio y <strong>de</strong> alguna forma, marcaron el camino sobre quéfuncionalida<strong>de</strong>s <strong>de</strong>berían ser implementadas primero. A<strong>de</strong>más crearon lanecesidad <strong>de</strong> integrar este motor <strong>de</strong> ren<strong>de</strong>r al mo<strong>de</strong>lador Blen<strong>de</strong>r, ya queen aquellos momentos Blen<strong>de</strong>r sufría <strong>de</strong> muchas carencias en el proceso <strong>de</strong>ren<strong>de</strong>rizado. Esa “presión” <strong>de</strong> la comunidad llevó a YafRay a lo que esahora, un raytracer tan funcional que pue<strong>de</strong> ser (y <strong>de</strong> hecho, es) utilizadoprofesionalmente.A día <strong>de</strong> hoy tiene una alta integración con Blen<strong>de</strong>r y Wings3D, y elproyecto a crecido tanto que en estos momentos se está llevando a cabouna fase <strong>de</strong> rediseño, con el fin <strong>de</strong> solventar ciertas problemas <strong>de</strong>bidos aeste nuevo rumbo que la comunidad ha querido que YafRay tomara.A<strong>de</strong>más, el nuevo rediseño se está pensando para que atraiga a más<strong>de</strong>sarrolladores a la comunidad, y los que ya e<strong>xi</strong>sten se sientan másinvolucrados tomando <strong>de</strong>cisiones “<strong>de</strong>s<strong>de</strong> abajo”.


[ 26 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DPero... ¿Quienes son los miembros <strong>de</strong> las comunida<strong>de</strong>s? Al hablar <strong>de</strong>comunida<strong>de</strong>s <strong>de</strong> software libre nos suele venir a la cabeza un grupo <strong>de</strong>frikis discutiendo sobre Star Wars y las posibles consecuencias <strong>de</strong>enfrentar a Batman y a La Masa. Es una injusticia que a las personas queamamos el software libre se nos encasille <strong>de</strong> esta manera, así que es hora<strong>de</strong> <strong>de</strong>smitificar la leyenda. De todos modos, espero que que<strong>de</strong> claro que LaMasa patearía el culo a Batman.Las comunida<strong>de</strong>s <strong>de</strong> software libre son actualmente el objetivo <strong>de</strong> estudio<strong>de</strong> economistas, psicólogos y sociólogos. Se trata <strong>de</strong> una nueva forma <strong>de</strong>comunidad virtual, con reglas y jerarquías propias, y en muchos aspectostotalmente diferentes a las que conocemos en la sociedad tradicional.Saber quién forma parte <strong>de</strong> estas comunida<strong>de</strong>s y cuáles son susmotivaciones es <strong>de</strong>terminante para enten<strong>de</strong>r este movimiento. En el caso<strong>de</strong> los <strong>de</strong>sarrolladores las incógnitas son aún mayores, <strong>de</strong>bido a que enuna sociedad <strong>de</strong> consumo es difícil enten<strong>de</strong>r por qué las personas <strong>de</strong>dicansu tiempo libre a una actividad, aparentemente costosa y con beneficiosdirectos prácticamente nulos.Hay una gran cantidad <strong>de</strong> recientes estudios científicos que intentan<strong>de</strong>finir el perfil <strong>de</strong>l <strong>de</strong>sarrollador <strong>de</strong> software libre. En el documento"Introducción al software libre" <strong>de</strong> la UOC po<strong>de</strong>mos leer:«Los <strong>de</strong>sarrolladores <strong>de</strong> software libre son generalmente personasjóvenes. La media <strong>de</strong> edad está situada en torno a los 27 años. Lavarianza <strong>de</strong> la edad es muy gran<strong>de</strong>, ya que el grupo predominante seencuentra en una horquilla que va <strong>de</strong>s<strong>de</strong> los 21 a los 24 años, siendola mediana - el valor que aparece con mayor frecuencia - los 23 años.Es interesante observar cómo la edad <strong>de</strong> incorporación almovimiento <strong>de</strong> software libre tiene sus má<strong>xi</strong>mos entre los 18 y 25años, siendo especialmente pronunciada entre los 21 y 23 años , loque equivaldría a la edad universitaria. Esta evi<strong>de</strong>ncia contrasta conla afirmación <strong>de</strong> que el software libre es cosa principalmente <strong>de</strong>adolescentes, aunque su presencia es evi<strong>de</strong>nte (alre<strong>de</strong>dor <strong>de</strong> un 20%<strong>de</strong> los <strong>de</strong>sarrolladores tiene menos <strong>de</strong> 20 años). En <strong>de</strong>finitiva,po<strong>de</strong>mos ver como los <strong>de</strong>sarrolladores suelen ser mayoritariamenteveinteañeros (un 60%), mientras que los menores <strong>de</strong> 20 y losmayores <strong>de</strong> 30 se reparten a partes iguales el 40% restante.»En el mismo texto se hace referencia a otros estudios, en los que se llega ala conclusión <strong>de</strong> que la mayor parte <strong>de</strong> los <strong>de</strong>sarrolladores, el 60%, tienenpareja e incluso un 16% tiene hijos. Con esto se acaba <strong>de</strong> <strong>de</strong>smoronar elmito <strong>de</strong>l <strong>de</strong>sarrollador <strong>de</strong> software libre como una persona adolescente yaislada, sin más conocimientos ni relación con el mundo exterior que losque llegan a través <strong>de</strong> su computadora. El hecho <strong>de</strong> que el perfil <strong>de</strong>l<strong>de</strong>sarrollador coincida con el <strong>de</strong>l universitario medio no <strong>de</strong>beríachocarnos, a fin <strong>de</strong> cuentas el movimiento <strong>de</strong>l software libre tiene sus


YafRay <strong>de</strong> la Y a la y [ 27 ]orígenes en ambientes universitarios. Richard Stallman recuerda sutrabajo en el Artificial Intelligence Lab <strong>de</strong>l MIT en los años setenta,cuando el software compartido se consi<strong>de</strong>raba parte fundamental <strong>de</strong>lproceso:«A nuestro software no lo llamábamos software libre, porque esetérmino aún no e<strong>xi</strong>stía, pero es exactamente lo que era. Cuando gente<strong>de</strong> otra universidad o una empresa querían un programa parahacerlo compatible y utilizarlo, se lo prestábamos con mucho gusto.Si veías a alguien usar un programa <strong>de</strong>sconocido que te interesaba,siempre podías pedir que te <strong>de</strong>jaran ver el código fuente para asípo<strong>de</strong>r leerlo, cambiarlo o <strong>de</strong>smontarlo para crear un nuevoprograma.»Sin embargo, otro <strong>de</strong> los gran<strong>de</strong>s mitos se torna real en las encuestas. Elsoftware libre es <strong>de</strong>sarrollado en su mayor parte por varones. La presencia<strong>de</strong> las mujeres en las comunida<strong>de</strong>s varían entre el 1% y un 3%, compitiendodúramente por el protagonismo en las gráficas estadísticas con el error <strong>de</strong>muestreo...Mientras que es relativamente sencillo saber la distribución <strong>de</strong> los<strong>de</strong>sarrolladores según su edad, sexo y estatus social, averiguar lasmotivaciones por las cuales se emplea tiempo y, en ocasiones, dinero,resulta una tarea mucho más complicada. A veces los propios<strong>de</strong>sarrolladores no tienen <strong>de</strong>masiado claras las motivaciones o, lo que esmuy habitual, e<strong>xi</strong>ste una conjunción <strong>de</strong> varios factores. Des<strong>de</strong> luego lasencuestas nos sirven para eliminar posibles causas <strong>de</strong> participación.La primera causa en ser <strong>de</strong>scartada es la económica porque, aunque estotalmente factible obtener beneficios económicos con el software libre,estos beneficios nunca se podrán obtener <strong>de</strong> una forma directa por la venta<strong>de</strong> licencias, como en el caso <strong>de</strong>l software propietario. Aún así, el 50% <strong>de</strong>los <strong>de</strong>sarrolladores encuestados afirman haber obtenido recompensaeconómica como causa <strong>de</strong> su implicación en un proyecto <strong>de</strong> software libre.Sin embargo, hay muchos que no lo ven tan claro. El propio RichardStallman, ante la pregunta <strong>de</strong> qué <strong>de</strong>be hacer un <strong>de</strong>sarrollador <strong>de</strong> softwarelibre para ganar dinero, suele respon<strong>de</strong>r: "pue<strong>de</strong> trabajar <strong>de</strong> camarero".Personalmente opino que quitando la palabra libre a la pregunta, larespuesta no varía.Al ser preguntados por su ocupación profesional, los <strong>de</strong>sarrolladores se<strong>de</strong>finen como ingenieros software (33%), estudiantes (21%),programadores (11%), consultores (10%), profesores <strong>de</strong> universidad (7%),etc. Es interesante observar como, a pesar <strong>de</strong> que en el software libre no seaplican técnicas clásicas <strong>de</strong> ingeniería <strong>de</strong>l software, hay tres veces más <strong>de</strong>personas que se <strong>de</strong>finen a sí mismos como ingenieros <strong>de</strong> software antesque programadores.


[ 28 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DUna vez <strong>de</strong>scartada la motivación económica se suele recurrir al ego <strong>de</strong> los<strong>de</strong>sarrolladores. Si el lector estaba pensando en <strong>de</strong>sarrollar software librebuscando la fama, pue<strong>de</strong> ir olvidando la i<strong>de</strong>a. En el documento:"Free/libre and open source soft-ware: Survey and study - part IV" <strong>de</strong>Ghosh, Glatt, Krieger y Robles (2002) se incluyó una pregunta, dirigida alos <strong>de</strong>sarrolladores, para que indicaran a qué colegas <strong>de</strong> una lista dadaconocían, no necesariamente <strong>de</strong> manera personal. Los resultados fueron<strong>de</strong>terminantes.La mayor parte <strong>de</strong> las personas conocían a pesos pesados <strong>de</strong>l <strong>de</strong>sarrollo,personas como Stallman, Icaza (GNOME) o Torvalds (Linux), eranconocidas por la práctica totalidad <strong>de</strong> los encuestados. Nique <strong>de</strong>cir tiene que son personas que se <strong>de</strong>dican a algo más que al<strong>de</strong>sarrollo y que tienen gran<strong>de</strong>s connotaciones filosofico-históricas <strong>de</strong>ntro<strong>de</strong>l mundo <strong>de</strong>l software libre. Lo curioso es que otros gran<strong>de</strong>s<strong>de</strong>sarrolladores que venían en la lista, como Jörg Schilling (cdrecord),Marco Pressenti Gritti (Galeon), Guenther Bartsch (<strong>xi</strong>ne) o BryanAndrews (Apache toolbox) tenían el mismo grado <strong>de</strong> popularidad queMartin Hoffste<strong>de</strong> o Angelo Roulini, personas ine<strong>xi</strong>stentes y hábilmenteañadidas por los encuestadores para averiguar el margen <strong>de</strong> error <strong>de</strong> lasencuestas.Así que, amigo lector, olvi<strong>de</strong> el <strong>de</strong>sarrollo <strong>de</strong>l software libre como vehículopara obtener fama y fortuna. A menos, claro está, que sea realmentebueno sirviendo copas y que su aspiración sea obtener la misma fama quelas personas que no e<strong>xi</strong>sten.Aunque no se han realizado estudios rigurosos, po<strong>de</strong>mos afirmar que elproyecto YafRay encaja en los valores medios comentados anteriormente.Comparte una parte <strong>de</strong> su comunidad con Blen<strong>de</strong>r. Martine Aalbers <strong>de</strong> laAmsterdam University realizó un estudio sociológico entre 746 personas<strong>de</strong> la comunidad <strong>de</strong> <strong>de</strong>sarrolladores y usuarios <strong>de</strong> Blen<strong>de</strong>r, entre los quenos encontramos gran parte <strong>de</strong> los miembros <strong>de</strong>l proyecto YafRay.Se refrendaron algunos datos anteriormente comentados, como la bajaparticipación femenina. No obstante, en el caso <strong>de</strong> Blen<strong>de</strong>r, la horquilla <strong>de</strong>edad es mayor (un 85% entre 15 y 35 años), sin duda <strong>de</strong>bido a que e<strong>xi</strong>steuna gran cantidad <strong>de</strong> usuarios adolescentes. Sin embargo, sólo un 21% <strong>de</strong>los encuestados reconocían haber <strong>de</strong>sarrollado parte <strong>de</strong>l software.Un dato interesante es que el 91% <strong>de</strong> los encuestados se consi<strong>de</strong>rabanusuarios <strong>de</strong> Blen<strong>de</strong>r, lo cual supone que los <strong>de</strong>sarrolladores son, a<strong>de</strong>más,usuarios <strong>de</strong>l producto final.En cuanto a las motivaciones que llevan a las personas a formar parte <strong>de</strong> lacomunidad <strong>de</strong> Blen<strong>de</strong>r, la respuesta obtenida fué la siguiente (or<strong>de</strong>nada <strong>de</strong>mayor a menor motivación):


YafRay <strong>de</strong> la Y a la y [ 29 ]●●●●●●●Entretenimiento. Participar por diversión.Altruismo. Querer ayudar a la gente sin obtener nada a cambio.Ayuda a la comunidad. Participar porque estas comprometido conla comunidad.Reciprocidad. Querer ayudar a la gente y esperar recibir algo acambio.Reputación. Participar para labrarse una reputación.Mejoras en el software. Participar por querer o necesitar mejorasen el software.Recompensa económica. Participar para ganar dinero.Como se ve, las motivaciones que se pue<strong>de</strong>n consi<strong>de</strong>rar más "egoístas" sonlas que están menos presentes. De hecho, en el propio estudio se resalta lainesperada posición <strong>de</strong>l altruismo entre las motivaciones.La Catedral y el BazarEn 1997 Eric S. Raymond escribió el primer documento que trataba <strong>de</strong><strong>de</strong>scribir las características <strong>de</strong> los mo<strong>de</strong>los <strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong> software libre,comparándolas con el mo<strong>de</strong>lo propietario. El artículo, como hemosmencionado antes, se titula "La catedral y el bazar" y se ha convertido enuno <strong>de</strong> los más conocidos y criticados <strong>de</strong>l mundo <strong>de</strong>l software libre, hastael punto que para algunos supone el comienzo <strong>de</strong> la ingeniería <strong>de</strong>l softwarelibre.Raymond establece una analogía entre el modo <strong>de</strong> construir las catedralesmedievales y la forma <strong>de</strong> clásica <strong>de</strong> producir software. En ambos casose<strong>xi</strong>ste una distribución <strong>de</strong> tareas diferenciada, en la que el diseñador estápor encima <strong>de</strong> todo, controlando el <strong>de</strong>sarrollo <strong>de</strong> la actividad. También laplanificación está totalmente <strong>de</strong>tallada <strong>de</strong>s<strong>de</strong> el principio, marcando lasfunciones <strong>de</strong> cada uno <strong>de</strong> los participantes y las técnicas que han <strong>de</strong> utilizarpara llevar a cabo su labor.Dentro <strong>de</strong> esta i<strong>de</strong>a <strong>de</strong> catedral no sólo está incluido el <strong>de</strong>sarrollo clásico <strong>de</strong>software propietario. Raymond encuentra que proyectos <strong>de</strong> software librecomo GNU o NetBSD están fuertemente centralizados, ya que unas pocaspersonas son las que realizan el diseño e implementación <strong>de</strong>l software. Siuna persona quiere entrar a formar parte <strong>de</strong>l equipo <strong>de</strong> <strong>de</strong>sarrollo, lossupervisores <strong>de</strong>l proyecto le asignaran un rol y una tarea. A<strong>de</strong>más, este tipo<strong>de</strong> proyectos tiene unas entregas <strong>de</strong>l software releases espaciadas en eltiempo siguiendo una planificación bastante estricta.


[ 30 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEn contraposición al mo<strong>de</strong>lo <strong>de</strong> la catedral está, según Raymond, elmo<strong>de</strong>lo <strong>de</strong>l bazar. En un bazar no e<strong>xi</strong>ste una autoridad que controle todoslos procesos que se están <strong>de</strong>sarrollando ni que realice una planificación <strong>de</strong>lo que ha <strong>de</strong> suce<strong>de</strong>r. Los roles <strong>de</strong> los participantes son difusos, ya que losven<strong>de</strong>dores se pue<strong>de</strong>n convertir en clientes, y viceversa, sin indicaciónexterna.Al contrario que en el mo<strong>de</strong>lo <strong>de</strong> la catedral, en el bazar hay entregastempranas <strong>de</strong>l software (release early). En el caso <strong>de</strong> YafRay, como se hadicho, se liberó <strong>de</strong>s<strong>de</strong> prácticamente el primer momento. Esto suelemotivar que aparezcan rápidamente personas que tenían el mismoproblema (en el caso <strong>de</strong> YafRay, que querían <strong>de</strong>sarrollar un raytracer) oque puedan estar interesadas en la solución (que necesitan lo que YafRayles pue<strong>de</strong> ofrecer).Las pruebas son, como se ha comentado, una <strong>de</strong> las labores más pesadasen el <strong>de</strong>sarrollo <strong>de</strong> software. Afortunadamente son un proceso altamenteparalelizable. La release early <strong>de</strong> YafRay permitió que muchas personas sepusieran a probar el software simultáneamente, llevando así a cabo la fase<strong>de</strong> pruebas. Su uso aumentó drásticamente cuando Andrea Carbone realizóla primera versión <strong>de</strong> Yable, un exportador <strong>de</strong> escenas <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>rprogramado en Python. De este modo Andrea, usuario <strong>de</strong> Blen<strong>de</strong>r, seconvirtió en <strong>de</strong>sarrollador <strong>de</strong> parte <strong>de</strong>l proyecto <strong>de</strong>ntro <strong>de</strong>l bazar YafRay.Este tipo <strong>de</strong> relación en que todo el mundo pue<strong>de</strong> aportar algo esaltamente productiva. Los usuarios encuentran motivación en encontrar,notificar y corregir errores, ya que saben que su petición va a ser atendidacasi inmediatamente. A<strong>de</strong>más e<strong>xi</strong>ste cierta satisfacción personal por haberaportado algo, algo así como un "yo también he puesto mi granito <strong>de</strong>arena" <strong>de</strong> cara al reconocimiento <strong>de</strong> la comunidad. De hecho, algunascomunida<strong>de</strong>s se apoyan en una meritocracia, es <strong>de</strong>cir, las <strong>de</strong>cisiones másimportantes las toman las personas que más aportan a la comunidad.El mo<strong>de</strong>lo <strong>de</strong>l bazar, con frecuentes entregas <strong>de</strong>l software, pue<strong>de</strong> asustar ausuarios que buscan la estabilidad. Algunos proyectos, como Blen<strong>de</strong>r,mantienen ramas diferentes <strong>de</strong> <strong>de</strong>sarrollo. Una más estable, en la que lasnuevas funcionalida<strong>de</strong>s sólo se aña<strong>de</strong>n <strong>de</strong>spués <strong>de</strong> muchas pruebas,asegurándose que no repercuten en la estabilidad <strong>de</strong>l producto final. Yotras experimentales como Tuhopoo, the evil tree o la reciente ramaOrange, creada específicamente durante el <strong>de</strong>sarrollo <strong>de</strong>l cortoElephant Dreams.Pero el bazar no es solo aplicable a los <strong>de</strong>sarrolladores. En ocasiones lavorágine <strong>de</strong>l bazar intimida a nuevos usuarios, lo cuales pue<strong>de</strong>n llegar aencontrar bruscos algunos comportamientos <strong>de</strong> los usuarios más antiguos.Este recelo <strong>de</strong> los veteranos <strong>de</strong> la comunidad suele ser <strong>de</strong>bido a larepetición sistemática <strong>de</strong> los mismos errores por parte <strong>de</strong> los nuevosmiembros.


YafRay <strong>de</strong> la Y a la y [ 31 ]Como ejemplo <strong>de</strong> esto, en la tristemente extinta comunidad <strong>de</strong> usuarios <strong>de</strong>Blen<strong>de</strong>r hispanos, Nicodigital, los nuevos usuarios realizaban las mismaspreguntas <strong>de</strong> novato una y otra vez. Los usuarios más veteranos secansaban <strong>de</strong> repetir las mismas respuestas continuamente. Se llegó a hacerfamosa la frase ¡¡usa el buscador!!, en relación al poco uso que daban losnovatos al buscador <strong>de</strong>l foro para encontrar posibles respuestas a suspreguntas. Con el doble fin <strong>de</strong> evitar preguntas innecesarias por parte <strong>de</strong>los nuevos y motivar a los veteranos a contestar, el administrador <strong>de</strong>l foro(Nicolás Morenas, alias Caronte) creó un sistema <strong>de</strong> créditos. Los créditosse obtenían, entre otras formas, por visitar la web y contestar preguntas;mientras que se perdían por realizarlas. A los pocos meses se creo toda unasociedad basada en el intercambio <strong>de</strong> créditos. Es una lástima no haberpodido seguir la evolución <strong>de</strong> este experimento, ya que la imposibilidad <strong>de</strong>mantenerse económicamente, junto con una serie <strong>de</strong> <strong>de</strong>savenencias,precipitaron el cierre <strong>de</strong> la comunidad.A pesar <strong>de</strong> la buenas intenciones en el mo<strong>de</strong>lo <strong>de</strong>l bazar, las <strong>de</strong>cisionestienen que estar controladas. Raymond supone que todo proyecto <strong>de</strong>software libre ha <strong>de</strong> contar con un dictador benevolente, una especie <strong>de</strong>lí<strong>de</strong>r que generalmente coinci<strong>de</strong> con el fundador <strong>de</strong>l proyecto, para guiarloreservándose siempre la última palabra en la toma <strong>de</strong> <strong>de</strong>cisiones. Sobre elpapel, esa persona ha <strong>de</strong> saber motivar y coordinar un proyecto, enten<strong>de</strong>r alos usuarios y <strong>de</strong>sarrolladores, buscar consensos e integrar a todo aquelque pueda aportar algo al proyecto. Pero la realidad es que esa persona,como queda dicho, suele ser el propulsor original <strong>de</strong> la i<strong>de</strong>a. Por tanto esun <strong>de</strong>sarrollador al que le apasiona producir software pero que,habitualmente, se preocupa poco por los usuarios y las relaciones <strong>de</strong>ntro<strong>de</strong> la comunidad. Este tipo <strong>de</strong> <strong>de</strong>sarrolladores suele ver como una perdida<strong>de</strong> tiempo las labores <strong>de</strong> ingeniería social organizativa.YafRay: <strong>de</strong> la catedral al bazar organizado.YafRay ha seguido <strong>de</strong>s<strong>de</strong> un principio el mo<strong>de</strong>lo <strong>de</strong> procesos en elsoftware libre. Surge como un proyecto personal y la persona que lanza el<strong>de</strong>sarrollo es la que realiza las labores <strong>de</strong> dictador, consi<strong>de</strong>rado por todosbenevolente porque si no, nos pegará...Inicialmente, en la primera etapa <strong>de</strong> liberación <strong>de</strong>l código (versión 0.0.1),la página web <strong>de</strong> YafRay era un simple documento html <strong>de</strong> fondo blancocon letras negras. Contenía una pequeña explicación <strong>de</strong>l proyecto, un par<strong>de</strong> imágenes y un enlace al código. Si YafRay hubiese sido una empresa,esta presentación tan pobre habría <strong>de</strong>senca<strong>de</strong>nado un suicidio colectivo<strong>de</strong>l <strong>de</strong>partamento <strong>de</strong> marketing. Desafortunadamente, YafRay no pudohacer este favor a la humanidad ya que era un proyecto <strong>de</strong> un estudiante <strong>de</strong>informática. Aprovecho la ocasión para saludar a los chicos <strong>de</strong> marketing<strong>de</strong> mi empresa.


[ 32 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DA pesar <strong>de</strong> esta puesta en escena tan austera, el proyecto tomó gran interéspor parte <strong>de</strong> los usuarios <strong>de</strong> Blen<strong>de</strong>r, que por aquel entonces no contabacon un motor <strong>de</strong> ren<strong>de</strong>r <strong>de</strong> calidad. Este interés obligó a mejorar aquellaweb, incluyendo documentación extra y un foro para que los usuariospudieran solventar sus dudas. Deberíamos refle<strong>xi</strong>onar cómo una buenai<strong>de</strong>a, en el momento a<strong>de</strong>cuado, crece por si misma sin necesidad <strong>de</strong>envolverla en una nube <strong>de</strong> bullshit <strong>de</strong>ntro <strong>de</strong> extensas presentaciones <strong>de</strong>Powerpoint.Ya hemos dado el primer paso <strong>de</strong> la catedral al bazar casi sin darnoscuenta. La necesidad <strong>de</strong> crear un foro <strong>de</strong> usuarios surge <strong>de</strong> la imposibilidad<strong>de</strong> Jandro para contestar a todos los correos <strong>de</strong> los usuarios, queemocionados con el nuevo raytracer no paraban <strong>de</strong> hacer preguntas. Elarquitecto <strong>de</strong> la catedral pier<strong>de</strong> más tiempo en resolver dudas sobre elproyecto que en su <strong>de</strong>sarrollo. La solución está clara, permitir que lacomunidad se comunique para que los usuarios más experimentadospuedan ayudar a los nuevos.De manera casi simultánea al anuncio <strong>de</strong>l proyecto, el holandés Alfredo <strong>de</strong>Greef comenzó a aportar código, convirtiéndose en uno <strong>de</strong> los gran<strong>de</strong>simpulsores <strong>de</strong>l proyecto haciéndose responsable <strong>de</strong> la intergración conBlen<strong>de</strong>r. Otros vinieron <strong>de</strong>spués, casi todas fueron pequeñas peroimportantes aportaciones. En poco más <strong>de</strong> un año YafRay contaba con unacomunidad <strong>de</strong> usuarios gran<strong>de</strong>, teniendo en cuenta el reducido ámbito <strong>de</strong>lproyecto.En 2004, durante las jornadas BoingBoingBlend, tuve la oportunidad<strong>de</strong> realizar una ponencia similar a esta. Entonces la situación <strong>de</strong> YafRay erabastante <strong>de</strong>licada. El proyecto estaba en crisis. Alejandro no tenía tiempopara <strong>de</strong>dicar al <strong>de</strong>sarrollo, Alfredo estaba volcado en otros proyectos y noaparecían nuevos programadores. Por otra parte, la poca documentaciónque e<strong>xi</strong>stía estaba <strong>de</strong>sfasada y la web lleva años sin cambiar <strong>de</strong> aspecto.Mis conclusiones <strong>de</strong> entonces eran bastante pesimistas. El proyecto estabaen una situación <strong>de</strong> interbloqueo. Las pocas personas interesadas encolaborar, bien <strong>de</strong>sarrollando código o documentando, no sabían comohacerlo porque la poca documentación e<strong>xi</strong>stente era <strong>de</strong> mala calidad. Todala información estaba en la cabeza <strong>de</strong> los <strong>de</strong>sarrolladores, queprecisamente carecían <strong>de</strong> tiempo para documentar. La pescadilla que semuer<strong>de</strong> la cola.El código no estaba libre <strong>de</strong> problemas. El diseño inicial, pensado para unpequeño raytracer ya no soportaba más parches para introducir las nuevasfuncionalida<strong>de</strong>s que los usuarios requerían. Eso llevó a Alejandro a pensaren empezar un nuevo diseño <strong>de</strong>s<strong>de</strong> cero, mejor estructurado y conalgoritmos <strong>de</strong> raytracer más avanzados. Para un programador interesadoen colaborar era muy complicado ampliar el viejo código y el nuevo no eramás que un esbozo.


YafRay <strong>de</strong> la Y a la y [ 33 ]Con este panorama, las pocas personas que intentaban ayudar, al pocotiempo escapaban <strong>de</strong>l <strong>de</strong>sastre organizativo que era el proyecto.Necesitábamos más compromiso y para ello optamos por un armainfalible: la vergüenza pública. Durante aquellas jornadas <strong>de</strong> Barcelona,en mitad <strong>de</strong> la ponencia pedimos a ciertas personas que colaborasen con elproyecto y que se comprometieran allí mismo, cara a cara con otrosmiembros <strong>de</strong> la comunidad. La jugada no salió mal: Apenas recibimosamenazas <strong>de</strong> muerte y conseguimos que Javier Galán diseñase una nuevaimágen para YafRay y su web, mucho más profesional.En mi opinión aquello fue clave para el estado actual <strong>de</strong> YafRay. Dos años<strong>de</strong>spués, la documentación está creciendo gracias al ingente trabajo <strong>de</strong>Alvaro Luna. Mathias Wein ha tomado las riendas <strong>de</strong>l proyecto,introduciendo gran<strong>de</strong>s mejoras al código original, mientras el nuevorediseño (llamado Fry) va madurando. Quiero agra<strong>de</strong>cer <strong>de</strong>s<strong>de</strong> aquí a estaspersonas y a tantas otras que con su trabajo, sus mensajes en los foros ysus trabajos artísticos <strong>de</strong> calidad profesional están consiguiendo queYafRay crezca cada día más.Desarrollo libre para el software libreHemos hablado <strong>de</strong> la cooperación <strong>de</strong> las comunida<strong>de</strong>s en el <strong>de</strong>sarrollo <strong>de</strong>proyectos <strong>de</strong> software libre, pero ¿Cómo se comunican sus miembros?¿Qué herramientas se utilizan para coordinar los esfuerzos?Afortunadamente la comunidad <strong>de</strong> software libre se retroalimenta ye<strong>xi</strong>sten multitud <strong>de</strong> herramientas libres útiles para el <strong>de</strong>sarrollo <strong>de</strong>software y la cooperación entre personas <strong>de</strong> todo el mundo.Los foros y las listas <strong>de</strong> correo son el epicentro <strong>de</strong> las comunida<strong>de</strong>s. Dehecho son la parte visible <strong>de</strong> la comunidad. Ambas herramientas permitenla comunicación y las dos comparten la i<strong>de</strong>a <strong>de</strong> facilitar el envío <strong>de</strong>mensajes a todos los miembros. Su diferencia fundamental el sentido en elque viaja la información. En las listas <strong>de</strong> correo la información llegapasivamente a los usuarios, los mensajes enviados a la lista llegan a toda lacomunidad. Sin embargo en los foros son los usuarios los que se “acercan”a la información. Por esto, las listas se <strong>de</strong>berían utilizar para intercambiarinformación útil para todos sus <strong>de</strong>stinatarios. Un ejemplo clásico es unalista para los <strong>de</strong>sarrolladores, don<strong>de</strong> cada miembro envía un registro <strong>de</strong>sus modificaciones.En los foros, sin embargo, el usuario es el que <strong>de</strong>ci<strong>de</strong> leer o no un mensaje.Se divi<strong>de</strong>n en secciones y cada usuario lee sólo la que le interesa. Lainformación está ahí, sólo hay que ir a buscarla. Son una herramienta útiltanto para usuarios como para <strong>de</strong>sarrolladores. No sólo se utilizan para


[ 34 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Dresolver dudas sobre el uso <strong>de</strong> un software, sino que sirven para poner encontacto a los <strong>de</strong>sarrolladores y los usuarios.Una <strong>de</strong> las herramientas que está invadiendo la escena <strong>de</strong>l software libre esel Wiki. Del hawaiano wiki wiki, “rápido”, es una forma <strong>de</strong> sitio web endon<strong>de</strong> se acepta que usuarios creen, editen, borren o modifiquen elcontenido <strong>de</strong> una página web, <strong>de</strong> una forma interactiva, fácil y rápida.Dichas facilida<strong>de</strong>s lo convierten una herramienta efectiva para la escrituracolaborativa. En el proyecto YafRay, la instalación <strong>de</strong> un wiki (una wikipara algunos (algunas para algunos/as)) le ha permitido salir <strong>de</strong> la penosasituación documental que se encontraba durante el último año. Se estáredon<strong>de</strong>ando una documentación completa y actualizada. A<strong>de</strong>más la wikiha permitido que los usuarios pudieran traducir por si mismos ladocumentación a otros idiomas, como el español, portugués o chino.En cuanto al <strong>de</strong>sarrollo en si, hay que <strong>de</strong>cir que YafRay empezó siendo<strong>de</strong>sarrollado con herramientas libres, <strong>de</strong>s<strong>de</strong> el compilador GNU hasta elVim con el que Jandro tecleó las primeras lineas. Actualmente el únicosoftware propietario que se utiliza es el compilador Visual C Toolkit (laversión gratuita <strong>de</strong>l compilador <strong>de</strong> Microsoft para Windows,). Aunqueinicialmente se utilizó el Cygwin como herramienta <strong>de</strong> compilación paraWindows, la i<strong>de</strong>a se abandono ya que la integración con Blen<strong>de</strong>r, usandoYafRay como plugin, requería el uso <strong>de</strong>l compilador <strong>de</strong> los <strong>de</strong> Redmond.En el momento en el que más <strong>de</strong> una persona aportaba código al proyectose hizo necesario el uso <strong>de</strong> una herramienta para el control <strong>de</strong> versiones,CVS en el caso <strong>de</strong> YafRay. El CVS (Concurrent Versions System),implementa un sistema <strong>de</strong> control <strong>de</strong> versiones: mantiene el registro <strong>de</strong>todo el trabajo y los cambios en la <strong>de</strong>sarrollo <strong>de</strong> un proyecto (<strong>de</strong> programa)y permite que distintos programadores colaboren. La mayor parte <strong>de</strong> losproyectos <strong>de</strong> software libre utilizan esta herramienta o la más avanzadasubversion.Para terminar este pequeño repaso por las herramientas <strong>de</strong> <strong>de</strong>sarrolloquiero hacer una mención a las utilida<strong>de</strong>s <strong>de</strong> tipo Bugtracker, literalmente“rastreador <strong>de</strong> errores”. Se trata <strong>de</strong> una especie <strong>de</strong> foro (en muchasocasiones se utiliza como tal) en el que los usuarios <strong>de</strong>jan constancia <strong>de</strong> losfallos que van encontrando en el software, permitiendo en muchos casosañadir sugerencias sobre nuevas funcionalida<strong>de</strong>s (feature requests). ElBugtracker permite asignar programadores al problema, que serán losencargados <strong>de</strong> investigar las causas <strong>de</strong>l error y subsanarlo. Es unaherramienta muy potente y que recomiendo a todos aquellos proyectos queempiecen a tomar cierta relevancia.


YafRay <strong>de</strong> la Y a la y [ 35 ]ConclusionesEl ámbito <strong>de</strong> aplicación y <strong>de</strong>sarrollo <strong>de</strong>l software propietario suele (o <strong>de</strong>be)estar <strong>de</strong>finido <strong>de</strong> antemano. Se pue<strong>de</strong> realizar una predicción, más omenos acertada, sobre la envergadura <strong>de</strong>l proyecto así como <strong>de</strong>l número yperfil <strong>de</strong> los usuarios finales.Pero el software libre es totalmente impre<strong>de</strong>cible. Un proyectoinicialmente pequeño, comenzado <strong>de</strong>s<strong>de</strong> cero por una única persona pue<strong>de</strong>volverse muy gran<strong>de</strong> en muy poco tiempo.El <strong>de</strong>sarrollador que empezó por diversión empieza a ver que los usuarios<strong>de</strong>mandan su ayuda y pi<strong>de</strong>n nuevas funcionalida<strong>de</strong>s al software. Aparecenlos primeros bugs que hay que resolver, lo que genera nuevas peticiones <strong>de</strong>los usuarios. Todo empieza a <strong>de</strong>jar <strong>de</strong> ser divertido. Usuarios curiososinundan la cuenta <strong>de</strong> correo <strong>de</strong>l programador. Aparecen nuevas personasintentando colaborar. En este caos organizativo el <strong>de</strong>sarrollador <strong>de</strong>beasumir que su proyecto es <strong>de</strong> interés para la comunidad, utilizando parte<strong>de</strong> su tiempo en la organización <strong>de</strong> la comunidad que se ha formadoalre<strong>de</strong>dor <strong>de</strong> su software. Muchos lo verán como una perdida <strong>de</strong> tiempo,pero es necesario, ya que una buena planificación a tiempo favorecerá un<strong>de</strong>sarrollo más fluido <strong>de</strong>l proyecto.Los <strong>de</strong>sarrolladores han <strong>de</strong> tener en cuenta que afortunadamente no estánsólos, ya que e<strong>xi</strong>sten una amplia gama <strong>de</strong> herramientas libres que permitencrear comunida<strong>de</strong>s organizadas. Sabiendo el potencial <strong>de</strong> estasherramientas se podrá poner en las manos <strong>de</strong> los usuarios la oportunidad<strong>de</strong> colaborar. Conociendo las alternativas y eligiendo los instrumentosa<strong>de</strong>cuados se pue<strong>de</strong> formar una comunidad que se “automantenga”,haciendo que sean los usuarios los que contesten sus dudas y escriban ladocumentación.Uno <strong>de</strong> los principales errores <strong>de</strong> YafRay fue <strong>de</strong>scuidar estos aspectos y hacostado mucho levantar el vuelo. Si tú, amigo lector, estás empezando a<strong>de</strong>sarrollar software libre ten en cuenta que <strong>de</strong>berás <strong>de</strong>dicar parte <strong>de</strong> tutiempo al cuidado <strong>de</strong> las personas que se agrupan alre<strong>de</strong>dor <strong>de</strong> tu proyecto.Si por el contrario lo tuyo no es programar y el menú <strong>de</strong>l ví<strong>de</strong>o es todo unmisterio para ti, no te preocupes. Hay mucha labor que hacer en elproyecto <strong>de</strong> tu software favorito. Cualquier pequeña aportación, comoayudar a los usuarios más inexpertos, pue<strong>de</strong> hacer mejorar el software.No quiero terminar sin agra<strong>de</strong>cer a Alejandro Conty la oportunidad <strong>de</strong>participar en un proyecto como YafRay. Mil gracias también a Alfredo <strong>de</strong>Greef, Javier Galán, Mathias Wein, Alvaro Luna y a toda la comunidadhispana e internacional <strong>de</strong> usuarios <strong>de</strong> YafRay, con especial cariño a los <strong>de</strong>Blen<strong>de</strong>r...


[ 36 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLlegados a este punto sólo queda contestar a una pregunta: ¿Cuantosrobles roería un roedor, si los roedores royesen robles? Bien... un roedorno roería robles, ya que los roedores no roen robles, pero si un roedorpudiera roer y royera alguna cantidad <strong>de</strong> robles, ¿cuántos robles roería unroedor? Aunque un roedor pudiera roer robles y aunque un roedor royerarobles, ¿<strong>de</strong>be un roedor roer robles? Un roedor <strong>de</strong>bería roer si un roedorpudiera roer robles, siempre que el roedor royera robles.Oh, ¡callate!Referencias Gregorio Robles. “Ingeniería <strong>de</strong>l Software Libre. Una visiónalternativa a la ingeniería <strong>de</strong>l software tradicional”. 2002. Jesús González Barahona, Joaquin Seoane, Gregorio Robles.“Introducción al software libre”. 2003 Eric S. Raymond. “La catedral y el bazar”. 1997Martine Aalbers, “Motivation for participating in an online opensource software community”. 2004http://pulsar.unizar.es/gluz/manual-sl/c35.htmlhttp://es.wikipedia.org


¿La Retrocomputación está <strong>de</strong> moda?¿Javier Belanche Alonsoxbelanch@gmail.com ::La retrocomputación está <strong>de</strong> moda? Es evi<strong>de</strong>nte que sí. Elsentimiento <strong>de</strong> nostalgia por la tecnología <strong>de</strong>l or<strong>de</strong>nadorpersonal, consolas y máquinas recreativas (no puedoencontrar un nombre mejor) <strong>de</strong> la época comprendida entremediados <strong>de</strong> los 70 y 80, ha ido tomando mayor fuerza yvisibilidad en el momento actual.FilosofíaEsta charla tratará <strong>de</strong> <strong>de</strong>scribir las diferentes manifestaciones <strong>de</strong> laretrocomputación y, en particular, <strong>de</strong> la necesidad para muchos <strong>de</strong> volver arepetir el embargo emocional que representa jugar, programar, construir ycoleccionar la informática <strong>de</strong> 8 bits.Un poco <strong>de</strong> historiaEl punto <strong>de</strong> partida es la aparición <strong>de</strong>l primer vi<strong>de</strong>ojuego comercial enEstados Unidos en 1974. Pong, i<strong>de</strong>a y diseño <strong>de</strong> Nolan Bushnell yformalizado por el ingeniero <strong>de</strong> Al Alcorn, inaugura el festival <strong>de</strong>l ocioinformático popular como la industria que, a excepción <strong>de</strong> un tiempo <strong>de</strong>crisis a mediados <strong>de</strong> la década <strong>de</strong> los 80, en la actualidad factura unvolumen <strong>de</strong> ingresos superior a la <strong>de</strong>l cine.De la primera máquina recreativa surge la i<strong>de</strong>a, poco más tar<strong>de</strong>, <strong>de</strong> NolanBushnell <strong>de</strong> trasladar la experiencia <strong>de</strong> las máquinas recreativas al entornodoméstico; reiventa un proyecto tan fallido como visionario, la consolaMagnavox Odissey. La edición "home" <strong>de</strong>l Pong fue un é<strong>xi</strong>to <strong>de</strong> ventas <strong>de</strong>las navida<strong>de</strong>s <strong>de</strong>l 75. Es la época <strong>de</strong> confrontación entre Atari yColecovision por dominar el mercado <strong>de</strong> máquinas recreativas y consolasdomésticas. Frente a la producción masiva <strong>de</strong> Colecovisión, la Atari <strong>de</strong>Nolan Bushnell <strong>de</strong>terminará, mediante el acto <strong>de</strong> la innovación, un tercerpaso hacia la <strong>de</strong>finición contemporánea <strong>de</strong> la consola: la invención <strong>de</strong>l"cartucho" o la posibilidad <strong>de</strong> intercambiar juegos en la misma consola.Seguirán años <strong>de</strong> creatividad e innovación en cuanto al diseño yproducción <strong>de</strong> juegos para dos mundos que conviven inevitablemente, el<strong>de</strong> las máquina recreativas, superior en calidad gráfica al segundo, y el <strong>de</strong>las consolas domésticas. Space Inva<strong>de</strong>rs, PacMan, Donkey Kong, Asteroids[ 37 ]


[ 38 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Dse convertirán rápidamente en la primera colección <strong>de</strong> clásicos <strong>de</strong> lahistoria <strong>de</strong> los vi<strong>de</strong>ojuegos. No sorpren<strong>de</strong>, por lo tanto, que seran objeto <strong>de</strong>variaciones, con mejor o peor gusto hasta nuestros días y que tendránrepresentación en soportes y medios tan diferentes como singulares.La segunda parte <strong>de</strong> esta historia la ocupa el or<strong>de</strong>nador doméstico. Tresaños <strong>de</strong>spués <strong>de</strong>l é<strong>xi</strong>to <strong>de</strong> Pong, Steve Jobs y Steve Wozniak presentan en1977 el Apple ][, con el procesador 6502 <strong>de</strong> la casa MOS y que tendrá unenorme eco comercial, en parte por su cualidad técnica y en gran medidapor la aplicación <strong>de</strong> ofimática Visicalc, la primera hoja <strong>de</strong> cálculo <strong>de</strong> lahistoria.Pero el principal interés que nos traeaquí la obra <strong>de</strong> Wozniak y Jobs es por unmotivo clave para la evolución <strong>de</strong>lvi<strong>de</strong>ojuego: gracias al intérprete <strong>de</strong>BASIC, los usuarios podían <strong>de</strong>sarrollar yprogramar sus propios juegos,almacenarlos y, finalmente compartirlos oven<strong>de</strong>rlos. De nuevo, como fue en el caso<strong>de</strong> Atari, la empresa Apple <strong>de</strong>scubre unadoble industria (la <strong>de</strong>l software y la <strong>de</strong>lhardware) que, en poco años, se inundará<strong>de</strong> un largo número <strong>de</strong> or<strong>de</strong>nadoresdomésticos, <strong>de</strong> los que <strong>de</strong>stacamos laproducción <strong>de</strong>l Commodore 64, SinclairZXSpectrum 48k, MSX y CPC 464 <strong>de</strong>AMSTRAD. Durante los primeros cincoaños <strong>de</strong> los 80, la explosión <strong>de</strong> creación <strong>de</strong>


¿La retrocomputación está <strong>de</strong> moda? [ 39 ]vi<strong>de</strong>ojuegos para los mo<strong>de</strong>los antes mencionados se verá reforzada por el<strong>de</strong>sarrollo, entre profesional y el amateur, <strong>de</strong> muchos jóvenes queapren<strong>de</strong>n a programar ensamblador para dos micros, el z80 y el 6502, ensus habitaciones, aspirando a po<strong>de</strong>r vivir <strong>de</strong> sus propios trabajos. Noresulta extraño que, <strong>de</strong>s<strong>de</strong> la perspectiva actual, se consi<strong>de</strong>ra ese momentocomo la edad <strong>de</strong> oro <strong>de</strong>l software español. Edad que vió su punto másálgido con la obra maestra <strong>de</strong>l programador Paco Menén<strong>de</strong>z, "La abadía<strong>de</strong>l Crimen".Punto final a esta historia lo pondrá Nintendo o, por qué no, <strong>de</strong>l encuentroentre Yamauchi y Shigeru Miyamoto. En 1985 aparece la consola NES <strong>de</strong>Nintendo y su juego estrella, Super Mario Bros, y que culmina dos añosmás tar<strong>de</strong> con The Legend of Zelda.IntencionesHe clasificado el contenido <strong>de</strong> esta ponencia en función <strong>de</strong> unos pocosconceptos que engloban la gran totalidad <strong>de</strong> proyectos que han giradoalre<strong>de</strong>dor <strong>de</strong> la informática <strong>de</strong> 8 bits.●●●●ColeccionismoLowProgramming/HardWiringEmulación/RecreaciónReinterpretación/ReinvenciónLa mayor parte <strong>de</strong> manifestaciones o acciones "retro" pue<strong>de</strong> referirse aestos cuatro apartados básicos, y que, si bien se pue<strong>de</strong>n tomar porapartados in<strong>de</strong>pendientes, la estrecha relación entre ellas se hará evi<strong>de</strong>ntea lo largo <strong>de</strong> la explicación <strong>de</strong> este texto. Empezaremos con el más pasivo<strong>de</strong> los cuatro, coleccionar, y acabaremos por el que más se aleja <strong>de</strong> laretroinformática y sí se apro<strong>xi</strong>ma al medio <strong>de</strong> la práctica <strong>de</strong>l arte actual.ColeccionismoColeccionar, reunir o agrupar objetos <strong>de</strong> una misma índole o tema, que<strong>de</strong>spiertan un sentimiento entre nostalgia, pasión y <strong>de</strong>seo, esprobablemente la categoría más pasiva <strong>de</strong> las cuatro. La acumulación <strong>de</strong>or<strong>de</strong>nadores domésticos <strong>de</strong> 8 bits, consolas, calculadoras no es diferente <strong>de</strong>la <strong>de</strong> coleccionar sellos, sin ocuparnos ahora si hay sospechas <strong>de</strong> un futurofórum retroinformático. En España contamos con algunos <strong>de</strong> lascolecciones privadas <strong>de</strong> retroinformática más importante a escalainternacional.


[ 40 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DSin duda, el componente <strong>de</strong> interés <strong>de</strong>lcoleccionismo es el encuentro con lodiferente, la excepción o la singularidad y,por lo tanto, con el objeto más preciado.Quiero <strong>de</strong>stacar varias piezas, explicar suexcepcionalidad como la magia y encantoque han suscitado <strong>de</strong>s<strong>de</strong> su <strong>de</strong>saparición enel mercado informático. Es probable que laelección no sea la correcta, la mejor o lamás representativa, pero cada vez queaparecen en subasta, los precios finalesrebasan habitualmente los seiscientoseuros.En primer lugar, Jupiter Ace <strong>de</strong> Cantab,or<strong>de</strong>nador británico que, literalmente,nació muerto a principios <strong>de</strong> los 80. Creadopor Richard Altwasser y Steven Vickers,parte escindida <strong>de</strong>l equipo original <strong>de</strong>l<strong>de</strong>sarrollo <strong>de</strong>l ZX Spectrum, el Jupiter Aceheredaba <strong>de</strong>l ZX81 su fisonomía, pero <strong>de</strong>superficie blanca. Micro Z80 a 3.25 MHzcon 3k <strong>de</strong> RAM ampliables a un má<strong>xi</strong>mo <strong>de</strong>48 y una resolución gráfica <strong>de</strong> 24x32caracteres en blanco y negro, el Jupiter Acese fundamentó en la estandarización <strong>de</strong> suscomponentes digitales. El Ace, a diferencia<strong>de</strong> las ULA (Unidad Aritmético Lógica) <strong>de</strong> la línea Sinclair, se diseñó bajoel paraguas <strong>de</strong> la lógica transistor-transistor y, por lo tanto, con chips <strong>de</strong>serie. Quizá, su peculiaridad mayor fue el intérprete <strong>de</strong> Forth en lugar <strong>de</strong>lhabitual BASIC. El Ace contenía una ROM <strong>de</strong> 8k con el SO y el intérprete<strong>de</strong> Forth. Aunque la velocidad <strong>de</strong>ejecución era superior al resto <strong>de</strong>intérpretes <strong>de</strong> BASIC <strong>de</strong>l momento,el Jupiter Ace se encontraba en<strong>de</strong>sventaja frente a otras máquinas<strong>de</strong>bido a su insuficiente capacidadgráfica como <strong>de</strong> sonido, limitandolas ventas <strong>de</strong>l Ace hasta el punto <strong>de</strong>su <strong>de</strong>saparición tres años mas tar<strong>de</strong>.En segundo lugar, el Sam Coupé,también británico, hace su apariciónen 1989, cuando el mercado <strong>de</strong> losor<strong>de</strong>nadores domésticos <strong>de</strong> 8 bits haentrado en caída libre. La empresa


¿La retrocomputación está <strong>de</strong> moda? [ 41 ]responsable fue Miles GordonTechnology. Al igual que elJupiter Ace, el Sam Coupé teníael z80 <strong>de</strong> Zilog por microprocesador,a 6Mhz <strong>de</strong> reloj, 256Kb <strong>de</strong>RAM ampliables a 512kb. Unacaracterística que luego seconvertió en motivo <strong>de</strong>confusión fue la posibilidad <strong>de</strong>ejecutar juegos <strong>de</strong> la gamaSinclair gracias al chip ASIC,compatible con el ULA <strong>de</strong>l ZXSpectrum 48k. Confusión quellevó a enten<strong>de</strong>rse el Sam Coupé como un clónico ampliado <strong>de</strong>l ZXSpectrum. Lamentablemente, <strong>de</strong>spués <strong>de</strong> tres cambios <strong>de</strong> propietarios, laproducción <strong>de</strong>l Sam Coupé finaliza en 1992, tras 16000 unida<strong>de</strong>s vendidasy con el imparable mercado <strong>de</strong>l PC compatible como fondo.Finalmente, el Rainbow-I fue un or<strong>de</strong>nador <strong>de</strong> 8 bits que apareció en 1989en la localidad <strong>de</strong> Manchester, bajo el diseño <strong>de</strong> los hermanos Ian yStephen Smith, dos jóvenesapasionados <strong>de</strong> la electrónicadigital, la informática, la música<strong>de</strong> "Madcheter", la literatura yarte <strong>de</strong>ca<strong>de</strong>nte inglés <strong>de</strong>l sigloXIX y las drogas. El Rainbow-Inunca superó las 100 unida<strong>de</strong>s:la caja era <strong>de</strong> ma<strong>de</strong>ra <strong>de</strong> cerezo,con grabados <strong>de</strong> ornamentaciónen gran parte <strong>de</strong> su superficie, sevendía a petición personal o seregalaba a colegas. Más en lalínea <strong>de</strong>l romanticismo <strong>de</strong>l "homebrew computer" que <strong>de</strong> la produccióncomercial, el Rainbow-I tuvo un cierto eco en revistas especializadas<strong>de</strong>bido al uso <strong>de</strong> dos micros z80 en paralelo, mejorandoconsi<strong>de</strong>rablemente la profundidad <strong>de</strong> color. Un año más tar<strong>de</strong>, Ian Smithse suicidó <strong>de</strong>struyendo toda la información y el poco stock disponible <strong>de</strong>los Rainbow-I. De muy vez en cuando, aparece como artículo <strong>de</strong> subasta <strong>de</strong>ebay, en particular <strong>de</strong> la región <strong>de</strong>l Reino Unido, algun prototipo <strong>de</strong>lRainbow-I, superando los 2500 euros.


[ 42 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEmulación/RecreaciónHablar <strong>de</strong> la vida <strong>de</strong> estas máquinas nos lleva a la segunda categoría, laemulación/recreación. La emulación es la solución pobre <strong>de</strong> unaexperiencia real, pero si sumamos la recreación, la sensación es mayor ymás pró<strong>xi</strong>ma al sentimiento original. La retro-emulación es un extrañovirus: se extien<strong>de</strong> con suma facilidad a todas los dispositivos digitalesactuales, <strong>de</strong>s<strong>de</strong> relojes hasta las consolas <strong>de</strong> última generación, pasandopor pdas. El interés <strong>de</strong> la emulación es doble: la satisfacción que produce elreproducir el comportamiento <strong>de</strong> una vieja máquina, una cierta necrofiliadigital y, una línea quizá menos habitual, pero no por ello menos atractivay enriquecidora, la programación <strong>de</strong> emuladores <strong>de</strong> máquinas <strong>de</strong> 8 bits.El principio que subyace la emulación en el campo <strong>de</strong> la informática es lacompatibilidad. Que el software <strong>de</strong> un primer or<strong>de</strong>nador sea compatiblecon un segundo es posible si, gracias si está disponible el código fuente ypodamos compilar el binario en la segunda máquina. Tarea esta últimadifícil si entre las dos máquina la arquitectura és diferente. Un caminoalternativo es la "ilusión" <strong>de</strong> po<strong>de</strong>r "emular" el comportamiento <strong>de</strong>l primeror<strong>de</strong>nador en el segundo. De esta manera podríamos ejecutar el software<strong>de</strong>l primer or<strong>de</strong>nador sin dificultad en el segundo.Los primeros emuladores <strong>de</strong> máquinas viejas <strong>de</strong> 8 bits aparecen aprincipios <strong>de</strong> los 90, con la <strong>de</strong>sventaja <strong>de</strong> la todavía precaria velocidad <strong>de</strong>lmicro para ejecutar con suavidad el sistema emulado, como un emulador<strong>de</strong>l Commodore 64 para Amiga.Con el rápido incremento <strong>de</strong> la velocidad <strong>de</strong> los microprocesadores paralos PC compatible, la aparición a mediados <strong>de</strong> los 90 <strong>de</strong> una "emuscene" secristalizó en los primeros emuladores <strong>de</strong> la serie <strong>de</strong> máquinas <strong>de</strong> 8 bits <strong>de</strong>principios <strong>de</strong> los 80, Sinclair ZX Spectrum, MSX, Commodore 64, Amiga eincluso Apple ][, pero también las primeras consolas como la NES, la SuperNES o la Sega Master System. La ventaja en cuanto a implementación yprogramación <strong>de</strong> estos emuladores es que todas estas máquinas guardansimilitu<strong>de</strong>s técnicas y <strong>de</strong> diseño muy parecidas; muchos compartían micros<strong>de</strong> 8 bits, Interl 8080, Motorola 6809, Zilog Z80 o MOS 6502. Lasdiferencias venían por los dispositivos externos (teclado, cintas o disco <strong>de</strong>almacenamiento) o el chip gráfico (la ULA famosa <strong>de</strong>l ZX Spectrum) o <strong>de</strong>lsonido.Contrariamente a lo que podamos pensar, la documentación alre<strong>de</strong>dor <strong>de</strong>ldiseño y programación <strong>de</strong> emuladores es bastante limitada y dispersa si lacomparamos con el volumen <strong>de</strong> comunida<strong>de</strong>s, proyectos y usuariosinteresados en la emulación <strong>de</strong>s<strong>de</strong> su arista más lúdica. En general, lamotivación que hay <strong>de</strong>trás <strong>de</strong> la programación <strong>de</strong> emuladores es variada:apren<strong>de</strong>r más sobre computación y la arquitectura <strong>de</strong> los or<strong>de</strong>nadores y


¿La retrocomputación está <strong>de</strong> moda? [ 43 ]consolas <strong>de</strong> 8 bits, saber cómo funcionaban los vi<strong>de</strong>ojuegos <strong>de</strong> antes y quéhabía <strong>de</strong>trás <strong>de</strong> ellos -pregunta muy razonable cuando éramos niños- y,<strong>de</strong>s<strong>de</strong> un lado más humano, preservar la memoria <strong>de</strong> nuestra infancia.Acor<strong>de</strong> al movimiento <strong>de</strong> la 'emuscene' y <strong>de</strong>l sentimiento <strong>de</strong> preservación<strong>de</strong>l pasado <strong>de</strong> 8 bits, el 5 <strong>de</strong> febrero <strong>de</strong> 1997 Nicola Salmoria publica laversión 0.1 <strong>de</strong> MAME, acrónimo <strong>de</strong> Multi Arca<strong>de</strong> Machine Emulator,siguiendo una filosofía estricta <strong>de</strong> la emulación a nivel <strong>de</strong> registros einstrucciones, contrariamente a la técnicas High Level <strong>de</strong> Emulación. Lavelocidad <strong>de</strong> la emulación no es tan importante como el grado <strong>de</strong> realismo<strong>de</strong> la emulación, por lo que MAME <strong>de</strong>pen<strong>de</strong>rá siempre <strong>de</strong> velocida<strong>de</strong>s <strong>de</strong>reloj enormemente elevadas para una emulación fluida.MAME representa en la actualidad un gigante centro <strong>de</strong> gravedad en lo quese refiere al universo <strong>de</strong> la emulación <strong>de</strong> vi<strong>de</strong>ojuegos: el número <strong>de</strong> juegosque alcanza emular está en los 10000, aunque también se sabe quealre<strong>de</strong>dor <strong>de</strong> 600 se encuentran fuera <strong>de</strong> los límites <strong>de</strong> su emulación porMAME. Al mismo tiempo, MAME representa un quebra<strong>de</strong>ro legal: encuanto a emulador, la pertenencia y distribución <strong>de</strong> MAME es legal, suventa es ilegal. Respecto las ROM, la mayoría están sujetas en la actualidadal copyright <strong>de</strong> la empresa o autores propietarios y, por lo tanto, imposiblesu venta y distribución. Esta situación se vuelve surrealista en función <strong>de</strong> lasituación legal <strong>de</strong> cada país, en el hecho <strong>de</strong> que las ROMS <strong>de</strong>jaron <strong>de</strong> serobjeto <strong>de</strong> mercado hace tiempo o que, rozando el ridículo, algunasempresas propietarias <strong>de</strong> las ROMs <strong>de</strong>jaron <strong>de</strong> e<strong>xi</strong>stir. Estas ROMS pasana ser consi<strong>de</strong>radas huérfanas, pero mantienen paradójicamente sucopyright, sin que por ello beneficie económicamente a nadie. LawrenceLessig, padre <strong>de</strong>l Creative Commons, <strong>de</strong>bate y <strong>de</strong>nucia en la actualidad lairregularidad <strong>de</strong>l copyright <strong>de</strong> los juegos huérfanos y <strong>de</strong>fien<strong>de</strong> el traspasoal dominio público.He mencionado más arriba la técnica <strong>de</strong> emulación High Level, encontraposición <strong>de</strong> la filosofía seguida por los <strong>de</strong>sarrolladores <strong>de</strong> MAME.Dos años <strong>de</strong>spués <strong>de</strong> la primera versión pública <strong>de</strong> MAME, se anuncia unnuevo emulador, UltraHLE, que difiere en cuanto a metodología <strong>de</strong>emulación y por tanto, el enfoque conceptual <strong>de</strong> emulación. A diferencia <strong>de</strong>MAME, que representa la técnica LLE (Low Level Emulation) y concentrasus esfuerzos en emular a bajo nivel todo los componentes <strong>de</strong>l sistemaemulado, con especial atención en la CPU, UltraHLE intenta adivinar quenecesita el juego en cada momento y emula la petición con gran rapi<strong>de</strong>z.De hecho, UltraHLE se hizo enormemente popular en muy poco tiempo.Fue el primer emulador con é<strong>xi</strong>to <strong>de</strong> la Nintendo 64, <strong>de</strong> juegos imposibles<strong>de</strong> emular como Super mario 64 y Zelda: Ocarina of the Time.


[ 44 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DUltraHLE murió <strong>de</strong> é<strong>xi</strong>to repentino. Pocas horas <strong>de</strong>spués <strong>de</strong> supublicación, los <strong>de</strong>sarrolladores abandonaron el proyecto, aunque poco<strong>de</strong>spués, RealityMan, uno <strong>de</strong> los <strong>de</strong>sarrolladores, volvió a la carga parasucumbir <strong>de</strong>bido a las sugerencias <strong>de</strong> Nintendo para olvidar el proyecto,incluso la emulación.RecreaciónLa recreación es bicéfala: busca obtener una experiencia más rica aldotar a la emulación <strong>de</strong> un soporte físico específico y pró<strong>xi</strong>mo al original.Las retroMacas ilustran a la perfección esta i<strong>de</strong>a. La lástima es que estarecreación se limita a la habitación <strong>de</strong>l retrogeek. La recreación perfecta,casi como siempre, es colectiva y en este sentido la experiencia original se<strong>de</strong>bería completar en una sala llena <strong>de</strong> humo <strong>de</strong> tabaco negro, cenicerosquemados y llenos <strong>de</strong> nicotina, el estar a punto <strong>de</strong> conseguir una ban<strong>de</strong>ra10 en el Gala<strong>xi</strong>an mientras una multitud anónima y silenciosa admira tusmovimientos y, cómo no, un jubilado con mono azul y riñonera llena <strong>de</strong>monedas <strong>de</strong> 25 <strong>de</strong> las viejas pesetas.La aparición <strong>de</strong> MAME, su capacidadtécnica para emular fielmente losvi<strong>de</strong>juegos clásicos, lo convirtieron enel software i<strong>de</strong>al para la recreación <strong>de</strong>una máquina recreativa, o "maca". Laconstrucción/obtención/compra <strong>de</strong>una "maca" se ha convertido en sí mismoen fenómeno unido a la experiencia<strong>de</strong> la retro emulación. Po<strong>de</strong>moscomprarla <strong>de</strong> segunda mano, readaptarla,recuperarla <strong>de</strong>l cementerio <strong>de</strong>recreativas; po<strong>de</strong>mos construirla<strong>de</strong>s<strong>de</strong> cero (from scratch) y sernosotros quienes <strong>de</strong>finamos el diseño,entre el clásico y el "cocktail", o estilomesilla. El mercado <strong>de</strong> "kits <strong>de</strong>construcción" <strong>de</strong> macas es cada vezmayor; se ven<strong>de</strong>n accesorios como losmone<strong>de</strong>ros clásicos, las "arca<strong>de</strong>controls" y tarjetas gráficas <strong>de</strong>frecuencias <strong>de</strong> refresco inferiores a los60Hz, J-pac...


¿La retrocomputación está <strong>de</strong> moda? [ 45 ]Hago un alto. He <strong>de</strong> hablar <strong>de</strong> la GP2X, sucesora <strong>de</strong> la malograda GP32.Tras una tortuosa gestación y sin llegar al año <strong>de</strong> vida en el mercado virtual(la consola oficialmente sólo se distribuye a través <strong>de</strong> internet), la GP2X hasabido encontrar un público fiel y a<strong>de</strong>pto a la retroinformática. Gran parte<strong>de</strong> la atención recibida se <strong>de</strong>be a su orientación <strong>de</strong> <strong>de</strong>sarrollo libre <strong>de</strong>vi<strong>de</strong>ojuegos, aplicaciones y emuladores. Sin pasar <strong>de</strong>l límite <strong>de</strong> los 170euros, la GP2X contiene un firmware -finalmente- libre (basado enGNU/Linux) sobre un procesador ARM9 <strong>de</strong> doble núcleo, velocidad reloj<strong>de</strong> 200Mhz, almacenamiento en tarjetas SD, 64mb <strong>de</strong> RAM y resolución <strong>de</strong>pantalla <strong>de</strong> 320x240 (QVGA). Dispone <strong>de</strong> un SDK oficial igualmente bajolicencia GNU, aunque la mayoría <strong>de</strong> programadores prefieren usar SDLnativas <strong>de</strong> la GP2X.Destacar la importancia <strong>de</strong> la escena española concentrada en lacomunidad gp32spain, li<strong>de</strong>rada por Fran<strong>xi</strong>s.Al basar su sistema operativo en GNU/Linux, no ha sido raro que laconsola se beneficiera rápidamente <strong>de</strong> las comunida<strong>de</strong>s. Destacar que es laprimera consola <strong>de</strong> mano que tiene un intéprete <strong>de</strong> Python (Pygame) yRuby para el <strong>de</strong>sarrollo rápido <strong>de</strong> vi<strong>de</strong>ojuegos y aplicaciones.


[ 46 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DHardware EmulationLa má<strong>xi</strong>ma expresión <strong>de</strong> la emulación/recreación correspon<strong>de</strong> al uso<strong>de</strong> chips FPGA que traspasan la frontera misma <strong>de</strong>l la emulación porsoftware. I<strong>de</strong>ntificamos la clonación perfecta mediante la emulación porhardware al uso <strong>de</strong> la recreación <strong>de</strong> máquinas y consolas <strong>de</strong> 8 bits antiguas.Los chips <strong>de</strong> Altera y Xilinx, el lenguaje vhdl y un enorme conocimiento <strong>de</strong>la máquina a emular (y tiempo,miucho tiempo) se suman paraaparecer en forma <strong>de</strong> viejas máquinasrecreativas y antiguos or<strong>de</strong>nadoresdomésticos. Quizá, <strong>de</strong>l conjunto <strong>de</strong>proyectos basados en FPGAorientados a la retro experiencia,señalar sin duda el <strong>de</strong> Jeri Ellsworth,autodidacta en la programación <strong>de</strong>chips FPGA, el C-One.C-One representa una iniciativa <strong>de</strong>Jeri Ellsworth por mejorar elCommodore 64 original, pero quefinalmente <strong>de</strong>rivó en una placa baseque permitiera la clonación <strong>de</strong>cualquier máquina <strong>de</strong> 8 bits. C-Onees una suerte <strong>de</strong> multi-hardware (enlugar <strong>de</strong> multiplataforma) que,mediante el uso <strong>de</strong> FPGA y unaexpansión modular <strong>de</strong> la CPU (quepor <strong>de</strong>fecto incorpora el 65C186 <strong>de</strong>lCommodore 64) se logra implementar la emulación por hardware <strong>de</strong>cualquier máquina <strong>de</strong> 8 bits y que, por su naturaleza abierta y modular,permite nuevos diseños personalizados.Hardwiring/Low programmingEl año pasado, André LaMothe, autor especializado en la publicación <strong>de</strong>libros sobre diseño, creación y programación <strong>de</strong> vi<strong>de</strong>ojuegos (cuenta concasi una veintena <strong>de</strong> libros), da un giro radical <strong>de</strong> contenidos y celebra unavuelta radical al pasado: crear vi<strong>de</strong>ojuegos <strong>de</strong>s<strong>de</strong> una perspectiva "lowlevel":electrónica, diseño digital, programación en ensamblador,conocimiento <strong>de</strong>l conjunto <strong>de</strong> instrucciones <strong>de</strong>l micro. Esta vez el libro noes un simple recetario <strong>de</strong> algoritmos, ejemplos y código para nuestroenésimo proyecto <strong>de</strong> vi<strong>de</strong>juego fallido en DirectX. En su lugar, el libro es


¿La retrocomputación está <strong>de</strong> moda? [ 47 ]una mezcla <strong>de</strong> curso <strong>de</strong> electrónica y justificación <strong>de</strong> la elección <strong>de</strong>l diseño<strong>de</strong> la Xgamestation, una consola basada en el microcontrolador SX52 y <strong>de</strong>la que los usarios pue<strong>de</strong>n apren<strong>de</strong>r a programarla -en ensamblador, porsupuesto- o ampliar.¿Es la Xgamestation un caso aislado? Dentro <strong>de</strong>l libro, Andre LaMotheexplica el <strong>de</strong>sarrollo <strong>de</strong> una edición mínima <strong>de</strong>l Xgamestation, el PicoEdition. Un protoboard, el SX52 y un set <strong>de</strong> resistencias y algúncon<strong>de</strong>sador proporciona una infraestructura mínima en el que po<strong>de</strong>mosjugar a nivel <strong>de</strong> montaje (hardwiring) y <strong>de</strong> programación <strong>de</strong>l SX52 (lowprogramming).El Pico Edition no es novedad y André LaMothe <strong>de</strong>be suiniciativa a un anterior proyecto personal <strong>de</strong> un estudiante sueco <strong>de</strong>electrónica, Rickard Gunee, al utilizar microcontroladores <strong>de</strong> la familia PICy SX para diseñar sistemas <strong>de</strong> vi<strong>de</strong>ojuegos amateur. La sensibilidad"homebrew console" es evi<strong>de</strong>nte y trascien<strong>de</strong>n el simple acto recreativo alpuro cacharrismo "Make" (revista actual <strong>de</strong>dicada al hardware y tecnologíaamateur): nuevos proyectos <strong>de</strong> "homebrew computers" (incluso conintérpretes <strong>de</strong> BASIC!) y "homebrew games"."Homebrew games" representa un paso final que nace <strong>de</strong>s<strong>de</strong> el interés <strong>de</strong>la emulación <strong>de</strong> retro vi<strong>de</strong>ojuegos, pasando por el estudio <strong>de</strong> cómo estosjuegos se programaron entonces y finalmente programando un juego queprobaremos en nuestro emulador favorito y que, una vez conseguido,<strong>de</strong>searemos transformar el juego en un cartucho.La escena <strong>de</strong> los "homebrew games" es todavía muy incipiente. Programaren ensamblador en estos días parece un acto <strong>de</strong> excentricidad y <strong>de</strong>frikismo. Añadir la dificultad que ello comporta en cuanto al aprendizajecomo el <strong>de</strong> un suficiente control para po<strong>de</strong>r <strong>de</strong>splegar sprites y la


[ 48 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Danimación <strong>de</strong> éstos por la pantalla. El último reto, superado lo anterior,pasa por la fabricación <strong>de</strong>l cartucho. De nuevo el puente entre el lowprogrammingal hardwiring o viceversa. Habitualmente, los pocoscreadores <strong>de</strong> "homebrew games" tienen dos opciones: cambiar la ROM <strong>de</strong>un viejo cartucho y reemplazarla por la nueva ROM o, el más difíciltodavía, crear tu propio circuito impreso (PCB) y el packaging <strong>de</strong>l cartucho.Un ejemplo magistral <strong>de</strong> lo que hablo son las tiradas limitadas <strong>de</strong>l juego "I,Cyborg", <strong>de</strong> George Peloni, para la mítica consola "Vectrex".La retroinformática y el arte actual:la <strong>de</strong>construcción como reinvención <strong>de</strong> los clásicosHe querido <strong>de</strong>dicar el último apartado <strong>de</strong> esta charla a las relaciones que,<strong>de</strong>s<strong>de</strong> el 2000, se han ido estableciendo entre los vi<strong>de</strong>ojuegos y el arteactual y que, tal como ya dije al principio, es la cara <strong>de</strong> la otra moneda <strong>de</strong>lsentimiento <strong>de</strong>l retrocoleccionista. Gran parte <strong>de</strong> la exploración <strong>de</strong>l artistaen la iconografía <strong>de</strong> los vi<strong>de</strong>ojuegos remite a clásicos <strong>de</strong> los 70-80 comoArkanaoid, Asteroids, Space Inva<strong>de</strong>rs, Pong o Pac-Man. Generalmente, lafinalidad <strong>de</strong> estas intervenciones es <strong>de</strong>svirtuar el propósito original <strong>de</strong>ljuego (matar marcianos, vencer a tu contrincante, ganar a la máquina otomar todas las pastillas en un lugar oscuro bajo música electrónica.) ypresentar un discurso diferente, contrario o inmerso en la ironía.


¿La retrocomputación está <strong>de</strong> moda? [ 49 ]Si un estudio <strong>de</strong>tallado <strong>de</strong> la relación entre el arte actual y los vi<strong>de</strong>ojuegosescapa a los límites <strong>de</strong> esta charla, no pierdo la oportunidad <strong>de</strong> mencionarunos pocos, en particular dos: el proyecto spaceinva<strong>de</strong>rs y la PainStation.SpaceInva<strong>de</strong>rs es un proyecto personal <strong>de</strong>l frances "inva<strong>de</strong>rs" <strong>de</strong>intervención urbana: la invasión <strong>de</strong>l espacio cristalizada en forma <strong>de</strong>pequeños mosaicos que, no es casualidad la elección <strong>de</strong>l soporte,reivindican el píxel como unidad <strong>de</strong> medida gráfica. Sus mosaicos <strong>de</strong>inva<strong>de</strong>rs estan repartidos por toda la geografía <strong>de</strong>l primer mundo, enespecial Europa y Estados Unidos.PainStation es una "maca" especial <strong>de</strong>l tipo mesilla. Los jugadorescompiten en el clásico terreno <strong>de</strong>l Pong, a diferencia que, el jugador quepier<strong>de</strong> un tanto <strong>de</strong> partida recibe una pequeña <strong>de</strong>scarga eléctrica.


[ 50 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DPara saber un poco más●●●●●Forster, Winnie, "Game.Machines, The encyclopedia of Consoles,handhelds & home computers 1972-2005", 2005, GameplanMoya <strong>de</strong>l Barrio, Víctor, "Study of the techniques for emulationprogramming (by a bored and boring guy)", 2001, UPCKohler, Chris, "Retro Gaming hacks, tips & tools for playing theclassics", 2005, O'ReillyLaMothe, André, "The Black Art of Vi<strong>de</strong>o Game Console Design",2006, SAMSMartínez, David "De Super Mario a Lara Croft, la historia oculta <strong>de</strong>los vi<strong>de</strong>ojuegos", 2003, Dolmen Editorial


Sección IIFundamentosFotograma <strong>de</strong> la Película <strong>de</strong> Animación“Elephants Dream” realizada con Blen<strong>de</strong>r© Copyright 2006, Blen<strong>de</strong>r FoundationNetherlands Media Art Institutewww.elephantsdream.org


What's this?It's simple... Just amonkey


Texturas ProceduralesCarlos López Yrigarayklopes@unizar.es ::Fundamentos <strong>de</strong> los conjuntos fractalesConjuntos conceptualmente simples, como puntos o líneas en unespacio matemático común como el euclí<strong>de</strong>o, no <strong>de</strong>jan lugar a dudas sobresus propieda<strong>de</strong>s características. Un punto, por ejemplo, sabemos que tienedimensión 0 porque es la intersección <strong>de</strong> dos rectas que se cortan, eigualmente un segmento <strong>de</strong> curva tiene dimensión 1 porque, sin ser unpunto, pue<strong>de</strong> incluirse en una recta y cumple la e<strong>xi</strong>gencia intuitiva <strong>de</strong> algocontinuo.FundamentosCondiciones básicas <strong>de</strong> dimensiónNo todos los conjuntos son tan simples, a pesar <strong>de</strong> po<strong>de</strong>r serencerrados en trozos pequeños, o cualquier, po<strong>de</strong>r generarse sin levantar ellápiz <strong>de</strong>l papel, o por sencillas reglas recursivas. De hecho, la dificultad <strong>de</strong>la <strong>de</strong>finición <strong>de</strong>l conjunto no tiene que ver con la complejidad <strong>de</strong> surepresentación gráfica. Para estos conjuntos en los que las <strong>de</strong>finicionesintuitivas <strong>de</strong> sus propieda<strong>de</strong>s no parecen encajar, se hace necesaria una<strong>de</strong>finición rigurosa, como la <strong>de</strong>l caso que nos ocupa: el concepto <strong>de</strong>dimensión.Para abarcar las posibilida<strong>de</strong>s <strong>de</strong> la <strong>de</strong>finición <strong>de</strong> dimensión para unconjunto XR n , e<strong>xi</strong>giremos cumplirse las siguientes propieda<strong>de</strong>s:1. dim{p}=0, dim(I)=1, y en general, dim(I n )=n para el hipercubo n-dimensional I n2. Monotonía: Si XY entonces dim(X)


[ 54 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Ddim ∐ ∞j=1X j =sup dim X j j≥14. Invariancia: Para una aplicación arbitraria perteneciente a R ncierta subfamilia <strong>de</strong>l conjunto <strong>de</strong> homeomorfismos <strong>de</strong> en R n , setiene:dim X =dim X Las condiciones (1) y (2) se cumplen fácilmente, mientras que latercera se pue<strong>de</strong> fle<strong>xi</strong>bilizar requiriendo sólamente una cantidad finita <strong>de</strong>subconjuntos <strong>de</strong> R n :3'.Si X 1, X 2 ... X m son subconjuntos cerrados <strong>de</strong> R n , entoncesdim ∐ mj=1X j = max dimX j 1≤ j≤nLa condición (4) implica invariancia topológica <strong>de</strong>l concepto <strong>de</strong> dimensión.No es trivial ver que las condiciones (1) y (4) no se contradigan, comopodría parecer por la construcción que Peano hizo <strong>de</strong> una aplicacióncontinua <strong>de</strong> [0,1] en el cuadrado [0,1]x[0,1]. Afortunadamente, estaaplicación no es homeomorfismo por no ser biyectiva.Dimensiones topológica y <strong>de</strong> HaufsdorffUrysohn y otros construyeron una función dimensión que es invariantetopológica y toma valores enteros. A esta la llamaremos dimensióntopológica, dim T.Se basa en la i<strong>de</strong>a <strong>de</strong> dar el valor n+1 al conjunto <strong>de</strong>l cual otro que tienedimensión n es bor<strong>de</strong>, inductivamente. En topología general se <strong>de</strong>finentres tipos <strong>de</strong> dimensión sobre conjuntos <strong>de</strong> un espacio métrico contable.Po<strong>de</strong>mos llamar dimensión topológica a cualquiera <strong>de</strong> ellas, puesto que losvalores enteros son coinci<strong>de</strong>ntes en las tres.A finales <strong>de</strong>l siglo XIX, Borel investigó sobre la i<strong>de</strong>a <strong>de</strong> longitu<strong>de</strong>s, áreas yvolúmenes en busca <strong>de</strong> <strong>de</strong>finición precisa, lo que estimuló a Lebesgue en suteoría <strong>de</strong> la medida. Carthéodory generalizó este trabajo a la medida s-dimensional en R n y, finalmente Haufsdorff, viendo que s daba sentido a lateoría aún sin ser entero, <strong>de</strong>finió la dimensión que lleva su nombre.


Texturas Procedurales [ 55 ]La dimensión <strong>de</strong> Haufsdorff satisface las condiciones impuestas alprincipio tomando como familia <strong>de</strong> aplicaciones <strong>de</strong> la condición (4) elconjunto <strong>de</strong> funciones bi-Lipschitzianas. Denotamos a la dimensión <strong>de</strong>Haufsdorff como dim H.Conjuntos fractalesEn general, se cumple dim T(X) dim H(X). Decimos que un conjunto X<strong>de</strong> R n es fractal cuando:dim T X dim H X También <strong>de</strong>finimos <strong>de</strong> forma pareja, el grado fractal, que nos da lai<strong>de</strong>a <strong>de</strong> la complejidad gráfica <strong>de</strong>l conjunto: X =dim H X −dim T X Esto conlleva, en primer lugar, que conjuntos como puntos aislados osegmentos no son fractales, por ser su dimensión topológica un númeroentero y, por tanto, igual a la <strong>de</strong> Haufsdorff.Debemos, pues, alejar la i<strong>de</strong>a <strong>de</strong> que los conjuntos fractales son aquellosque lo parecen por ser gráficamente complejos, o los que albergan elconcepto <strong>de</strong> auto-similaridad que, si bien es característico en muchos <strong>de</strong>estos conjuntos, no es una propiedad exclusiva.Texturas iterativasComoquiera que la i<strong>de</strong>a <strong>de</strong> lo fractal implicaría la realización <strong>de</strong> infinitoscálculos, lo que po<strong>de</strong>mos conseguir mediante técnicas por or<strong>de</strong>nador esiterar el proceso <strong>de</strong> obtención <strong>de</strong> estos conjuntos para acercarlos al límite<strong>de</strong> lo distinguible por los sentidos. Esto no sólo nos permitirá representarestos conjuntos <strong>de</strong> forma satisfactoria, sino que podremos fle<strong>xi</strong>bilizar elproceso para conseguir dibujos con menos <strong>de</strong>talle que el que daría elcálculo completo, si así lo <strong>de</strong>seamos.Aquí abandonaremos la palabra fractal y lo que conlleva, para retomar eltema como la generación <strong>de</strong> gráficos complejos mediante técnicasiterativas.Las texturas que nos ocupan se basan en variaciones <strong>de</strong> un proceso <strong>de</strong>cálculo sencillo, que se aplica a conjuntos <strong>de</strong> números generados pordistintos tipos <strong>de</strong> ruidos. Veamos qué es esto.


[ 56 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFunciones <strong>de</strong> ruidoIniciamos la generación <strong>de</strong> texturas mediante ruido creando unafunción R[0,1] base, que no es más que la interpolación <strong>de</strong> un número(discreto) <strong>de</strong> puntos aleatorios P 1, P 2, ... , P m cuya segunda coor<strong>de</strong>nada estáelegida en el rango [0,1]. Esta interpolación <strong>de</strong>be hacerse, naturalmente, <strong>de</strong>manera que los valores intermedios no salgan <strong>de</strong> este rango.Comenzamos eligiendo como primeras coor<strong>de</strong>nadas <strong>de</strong> {P i} los valoresenteros 1,2,... ,m; <strong>de</strong> esta manera po<strong>de</strong>mos representar tal función así:Esto nos lleva a <strong>de</strong>finir conceptos análogos a los <strong>de</strong> teoría ondulatoriatradicional, como amplitud (que vendrá dado por el rango <strong>de</strong> la curvafuncional obtenida) o longitud <strong>de</strong> onda, que será la interdistancia entrepuntos consecutivos, consi<strong>de</strong>rando esta como una cantidad constante. Eneste caso inicial, esta longitud es 1. La frecuencia será, directamente, lainversa <strong>de</strong> la longitud <strong>de</strong> onda.En cuanto a la elección <strong>de</strong> los valores en {P i}, los hemos recorridoelegido en un intervalo [0,1] <strong>de</strong> manera equiprobable, pero podríamoshaber escogido cualquier función <strong>de</strong> probabilidad. Es más, un métodohabitual <strong>de</strong> escoger estos números es el utilizado para generar plasmas ysuperficies <strong>de</strong> Man<strong>de</strong>lbrot (su versión tridimensional):1. Se <strong>de</strong>terminan valores aleatorios en los extremos <strong>de</strong>l intervalo, obien en los vértices <strong>de</strong> una rejilla. El objetivo es calcular lasintensida<strong>de</strong>s en los <strong>de</strong>más puntos <strong>de</strong>l espacio. Elegimos unnúmero d <strong>de</strong> subdivisiones (habitualmente d=2), y una cantidad Hque <strong>de</strong>termina la variación en cada iteración. Habitualmente, entorno a 1/d. Hacemos i=1 para comenzar el proceso iterativo.


Texturas Procedurales [ 57 ]2. Se subdivi<strong>de</strong> el intervalo/rejilla en d partes, obteniendo nuevospuntos a los que les asignamos los valores por interpolación <strong>de</strong>algún tipo, respecto <strong>de</strong> los vértices originales adyacentes.3. Recurrimos a la función <strong>de</strong> ruido (pue<strong>de</strong> ser una cantidadaleatoria), o cualquiera <strong>de</strong> las que se explican más abajo. El valorobtenido se multiplica por (1/d) iHd4. Volvemos a 2 si los pixeles <strong>de</strong>l dibujo no se han completado.El proceso que preten<strong>de</strong>mos explicar es mecánicamente parecido, peropermite generalizar la generación <strong>de</strong> puntos iniciales y el uso <strong>de</strong> lasfunciones <strong>de</strong> ruido.Funciones <strong>de</strong> ruido PerlinKen Perlin creó las funciones que llevan su nombre sumando funciones<strong>de</strong> interpolación <strong>de</strong> ruido sucesivas, f1,f2,…, fn, cuyas amplitu<strong>de</strong>sdisminuyen progresivamente, mientras que las frecuencias vanaumentando. Estas variaciones son geométricas, es <strong>de</strong>cir, frecuencia yamplitud cambiarán en cada nueva función según factores multiplicadoresconstantes.Llamemos lacunarity y fracDim (lagunaridad y dimensión fractal) a lasvariables que representan, respectivamente, a estas cantida<strong>de</strong>s. A estasfunciones las llamaremos octavas, y darán el grado <strong>de</strong> <strong>de</strong>talle <strong>de</strong>seado a latextura. La función resultante queda, entonces:nP n x=∑ { fracDim i· f i x ·lacunarity i }i=1Por ejemplo, tomando lacunarity=2 y fracDim=0’5, po<strong>de</strong>mos obtenerun sucesión <strong>de</strong> funciones Perlin (según el número n <strong>de</strong> octavas) como esta:n=1 n=2


[ 58 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Dn=3 n=4Finalmente, po<strong>de</strong>mos comparar dos funciones en la quinta octava variandolos parámetros:fracDim=0.5lacunarity=2fracDim=0.7lacunarity=2fracDim=0.5lacunarity=2.1fracDim=0.7lacunarity=2.1


Texturas Procedurales [ 59 ]El dr. Forest Kenton (Ken) Musgrave, cuyo método se comenta másabajo, usó el término persistence para referirse directamente a la amplitud<strong>de</strong> cada sumando <strong>de</strong> la función <strong>de</strong> Perlin, <strong>de</strong> manera que:amplitud = persistencia^iSin ninguna dificultad, po<strong>de</strong>mos exten<strong>de</strong>r esta forma <strong>de</strong> trabajar adominios en R n , pudiendo obtener con este proceso, por ejemplo, un valornumérico para cada punto en el espacio bi- o tridimensional real. Porejemplo, dado un punto en una superficie que queremos texturizar,po<strong>de</strong>mos aplicar un sencillo algoritmo tipo Perlin para obtener hasta latercera octava, obteniendo como suma esta textura:+ + =Ruidos en Blen<strong>de</strong>r 3DPerlin, tal cual ha sido <strong>de</strong>finido, no es la única manera <strong>de</strong> crear ruidosen Blen<strong>de</strong>r, aunque sí la más a<strong>de</strong>cuada para crear paisajes y eventos <strong>de</strong>carácter natural: terrenos, texturas nubosas, superficies líquidas… E<strong>xi</strong>stenmétodos para dibujar escenas pseudoaleatorias que nos permiten crearentes más o menos regulares, basados en la misma suma <strong>de</strong> funciones <strong>de</strong>interpolación sobre puntos al azar, solo que ya no son tales funciones, sinoalgoritmos que generan otros tipos <strong>de</strong> funciones, y que pue<strong>de</strong>n requerirmás parámetros. Discutiremos la <strong>de</strong>finición y uso <strong>de</strong> la triangulación <strong>de</strong>Voronoi, sus parámetros (constantes <strong>de</strong> Worley), y los resultados <strong>de</strong>aplicarlo sobre distintas <strong>de</strong>finiciones <strong>de</strong> distancia:● euclí<strong>de</strong>a d = x 2 y 2 z 2● euclí<strong>de</strong>a al cuadrado d =x 2 y 2 z 2● Manhattan d =∣ x∣∣ y∣∣ z∣● n-Minkovskyd = 1/n ∣x∣ n ∣y∣ n ∣z∣ n(generaliza las anteriores)y se verá también el método <strong>de</strong> Musgrave, usado por Terragen y elgenerador <strong>de</strong> mundos <strong>de</strong>l propio autor, MojoWorld, para crear paisajes ynubes.


[ 60 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DTerrynoiseCuando Blen<strong>de</strong>r no disponía <strong>de</strong> texturas generadas por ruido, Alfredo DeGraaf, conocido como eeshlo en nuestros foros, escribió una librería en Cque contenía funciones para generar números aleatorios y basados enalgoritmos como los explicados anteriormente. El objeto <strong>de</strong> esta librería,llamada dynoise, era usarla como base para el proyecto Dynamica, con elque se pretendía crear un motor <strong>de</strong> partículas y simulador <strong>de</strong> tejidosfísicamente creíbles. Dynamica fue abandonado, pero dynoise seguíadisponible para quien quisiera acce<strong>de</strong>r a ella <strong>de</strong>s<strong>de</strong> sus scripts.Fue en esa época cuando programé Terrynoise, para aprovechar estacapacidad que tan lejos quedaba para Blen<strong>de</strong>r por aquel entonces.De las funciones disponibles, Terrynoise utilizaba:●●●●●●●●●MultiFractalRigged MultifractalHybrid MultifractalHeteroTerraincellNoiseTurbulencevlNoiseNoiseRandomEl script actuaba sobre los vértices aplicando en la coordcenada z unacantidad generada por la función elegida por el usuario. La primerafuncionalidad consistió en seleccionar qué vértices iban a ser afectados porel cálculo y en qué medida. Esto se consiguió usando el grupo <strong>de</strong> vérticesllamado 'DYNOISE', en homenaje a la librería <strong>de</strong> eeshlo.Blen<strong>de</strong>r integró en la versión 2.33 las funciones en su código, a<strong>de</strong>más <strong>de</strong>los nuevos tipos <strong>de</strong> textura procedurales:●●●Distorted Noise (calcula ruido usando como lagunaridad elvalor <strong>de</strong> otro)Voronoi (algoritmo <strong>de</strong> Voronoi <strong>de</strong> cercanía, con sus variantesW1-4)Musgrave (aplicar la síntesis espectral al ruido, previamenteampliado e interpolado)lo que, unido a los ya e<strong>xi</strong>stentes (Clouds, Marble, Wood) creó una nueva


Texturas Procedurales [ 61 ]forma <strong>de</strong> generar texturas con la nueva gama <strong>de</strong> ruidos:●●●●●●●●●●CellnoiseVoronoi CrackleVoronoi F2-F1Voronoi F4Voronoi F3Voronoi F2Voronoi F1Improved PerlinOriginal PerlinBlen<strong>de</strong>r Originallo que supuso un gran avance en la creación <strong>de</strong> materiales en Blen<strong>de</strong>r.Esto, unido a la implementación <strong>de</strong> mapas <strong>de</strong> <strong>de</strong>splazamiento en la versión2.32, hizo que Terrynoise fuese <strong>de</strong> repente obsoleto, ya que fue inclusosuperado por la e<strong>xi</strong>stencia <strong>de</strong> la opción 'simple subdivision', que permiteusar el mapa <strong>de</strong> <strong>de</strong>splazamiento sobre los vértices generados porsubdivisión en tiempo <strong>de</strong> ren<strong>de</strong>r.La ventaja, sin embargo, resi<strong>de</strong> siempre en la visualización <strong>de</strong>l ruidodurante el mo<strong>de</strong>lado, ya que se crea una nueva malla modificada, lo quepermite exportarla tal cual, o incluso usarla en el motor <strong>de</strong> juegos <strong>de</strong>Blen<strong>de</strong>r.La incorporación <strong>de</strong> texturas procedurales hizo que pronto los<strong>de</strong>sarrolladores <strong>de</strong>l API <strong>de</strong> Python programaran un acceso a estascaracteríscas funciones <strong>de</strong> ruido mediante métodos en una nueva librería,Blen<strong>de</strong>r.Noise.El paso siguiente fue obvio: programar la posibilidad <strong>de</strong> que los vérticesfueran afectados a lo largo <strong>de</strong> sus normales, para producir efectos <strong>de</strong> ruidosobre objetos ya e<strong>xi</strong>stentes, no sólo levantar meros paisajes sobre planos.La reciente intervención <strong>de</strong> Mathias Panzenböck (panzi) en el códigofuente fue <strong>de</strong>cisiva: realizó una limpieza <strong>de</strong> código, e implementó laposibilidad <strong>de</strong> que el usuario entrara sus propias funciones matemáticasimplícitas, usando como variables las coor<strong>de</strong>nadas <strong>de</strong> los vértices y losoperadores estándar, junto a las funciones matemáticas incluidas en lalibrería math <strong>de</strong> Python.Panzi también se encargó <strong>de</strong>l tratamiento <strong>de</strong> ficheros para grabar y salvarparámetros.Gracias a estas mejoras Terrynoise recibió un nuevo impulso, completandosus capacida<strong>de</strong>s más allá <strong>de</strong> sus aspiraciones iniciales, implementando


[ 62 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Dentre otras nuevas mejoras la posibilidad <strong>de</strong> animar la proyección <strong>de</strong>l ruidosobre la malla y su intensidad, consiguiendo efectos <strong>de</strong> burbujeo, oleaje,vuelos sobre terreno, o zoom, a<strong>de</strong>más <strong>de</strong> introducir el tiempo como nuevavariable para las funciones matemáticas.Finalmente, es <strong>de</strong> reseñar que pue<strong>de</strong> aplicarse sobre cualquier número <strong>de</strong>mallas, e<strong>xi</strong>stiendo un objeto activo sobre el que se trabaja, lo que permitea<strong>de</strong>más iterar ruidos si lo aplicamos sobre una malla previamentemodificada. Esto se consigue usando las propieda<strong>de</strong>s que e<strong>xi</strong>sten en elmotor <strong>de</strong> juegos para cada objeto, usándolas como variables <strong>de</strong>configuración.


Psicofisiología <strong>de</strong> la percepciónCFernando Arroba Rubiognotxor@gmail.com ::uando hablamos <strong>de</strong> percepción solemos ten<strong>de</strong>r a pensarinmediatamente en la percepción visual. Como sistemaperceptivo dominante es el que analizaremos a continuación,tanto <strong>de</strong>s<strong>de</strong> un punto <strong>de</strong> vista funcional como psicológico.El ojo es una esfera que cumple con la estructura <strong>de</strong> una cámaraoscura. Sus funciones son tanto ópticas como sensoriales. En sufuncionalidad óptica se comportaría como una cámara fotográfica: sucometido es recibir la luz, a través <strong>de</strong>l iris (diafragma) y enfocarla con susistema <strong>de</strong> lentes compuesta <strong>de</strong> córnea y cristalino, ajustando los rayosluminosos sobre la retina (película sensible).FundamentosEl sistema visualLa esclera o esclerótida correspon<strong>de</strong>ría con la caja o cuerpo <strong>de</strong> la cámara.(Hay que ver lo original que soy haciendo estas analogías). Aunque enrealidad la anología mejor no es la cámara fotográfica sino la <strong>de</strong> vi<strong>de</strong>o.Atravesamos las estructuras en la misma dirección que lo haría la luz yveremos su funcionalidad <strong>de</strong> manera rápida.El ojo está estructurado en tres capas: la superficial o fibrosa, quecompren<strong>de</strong> la esclera y la córnea; la túnica vascular, tracto uveal o úvea,que compren<strong>de</strong> la coroi<strong>de</strong>a, el cuerpo ciliar y el iris; y la túnica interior oretina, que incluye la porción fotosensible <strong>de</strong> la pared posterior <strong>de</strong>l ojo.La primera estructura que nos encontramos es la córnea. Tras atravesarlanos encontramos en la cámara ocular, un espacio lleno <strong>de</strong> líquido entre lacórnea y el cuerpo vítreo. Este espacio se encuentra dividido en dos(cámara anterior y cámara posterior) por el iris. El humor acuoso que lollena es el resultado <strong>de</strong> un ultrarrefinado <strong>de</strong> la sangre y su función esaportar nutrientes y oxígeno a la lente y a la córnea, que son avasculares.[ 63 ]


[ 64 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 1. Corte transversal <strong>de</strong>l ojo, vista sagital.Por último, en la parte posterior nos encontramos la retina. Es elelemento fotosensible. Po<strong>de</strong>mos distinguir en la retina varias formas oestructuras especiales. Destacando el “dico óptico” y la “mácula”. Elprimero es el punto ciego <strong>de</strong> la retina y la segunda presenta una fosa que esla zona más sensible a la luz.Aspectos funcionales <strong>de</strong> la retinaPo<strong>de</strong>mos consi<strong>de</strong>rar la retina como la parte móvil <strong>de</strong>l cerebro. Es unaestructura <strong>de</strong>l sistema nervioso central que se mueve con el ojo. Noentraremos en las subestructuras que la componen sino en lafuncionalidad <strong>de</strong> la misma, comenzando con los fotorreceptores, los“conos” y los “bastones”.Bastones y conosTanto los conos como los bastones son células receptoras alargadas.Ambos tipos <strong>de</strong> células difieren anatómicamente según se encuentren en elcentro <strong>de</strong> la retina o en la periferia. Los bastones pue<strong>de</strong>n medir 2 μm <strong>de</strong>diámetro en la zona central <strong>de</strong> la retina y llegar en las periféricas a 4 μm ó5 μm. Los conos <strong>de</strong> la fosa mi<strong>de</strong>n 1,5 μm mientras que los <strong>de</strong> las zonas quela ro<strong>de</strong>an alcanzan <strong>de</strong> 5 a 8 μm.


Psicofisiología <strong>de</strong> la percepción [ 65 ]La rodopsina es el fotopigmento <strong>de</strong> los bastones. Los conos, por su parte,pue<strong>de</strong>n contener tres fotopigmentos diferentes, sensibles a los 435 nm(azul) cianolabe, 535 nm (ver<strong>de</strong>) clorolabe y 565 nm (rojo) eritrolabe.La cantidad <strong>de</strong> energía radiante y las longitu<strong>de</strong>s <strong>de</strong> onda son los factoresfísicos <strong>de</strong> la luz esenciales para el proceso visual. La cantidad <strong>de</strong> energíaradiante se interpreta como “brillantez” mientras que las longitu<strong>de</strong>s <strong>de</strong>onda son la base para la discriminación <strong>de</strong>l color.Los bastones son los sensores ligados a la percepción <strong>de</strong>l blanco, gris ynegro, respondiendo a todas las radiaciones <strong>de</strong>l espectro visual e incluso alas <strong>de</strong> la banda ultravioleta. A diferencia <strong>de</strong> los bastones, los conos sólo sonsensibles a diferentes longitu<strong>de</strong>s <strong>de</strong> onda <strong>de</strong> manera selectiva.La visión en color <strong>de</strong>pen<strong>de</strong> <strong>de</strong> dos procesos. El primero es la actividadreceptora <strong>de</strong> tres tipos <strong>de</strong> conos. El segundo el procesamiento <strong>de</strong>ntro <strong>de</strong>lsistema nervioso central. Del primer proceso se sabe mucho y está bienestudiado, sin embargo <strong>de</strong>l segundo se <strong>de</strong>sconoce prácticamente todo.Teoría dual <strong>de</strong> la visiónLa teoría dual <strong>de</strong> la visión se basa en la concepción <strong>de</strong> la retina como sifuera un mosaico <strong>de</strong> “cuatro” tipo <strong>de</strong> receptores (los bastones y los trestipos <strong>de</strong> conos). Los bastones son sensibles a la luz <strong>de</strong> baja intensidad y losconos se especializan en la visión en color y en el registro <strong>de</strong> <strong>de</strong>talles finos.Las mo<strong>de</strong>rnas variante <strong>de</strong> esta teoría no hacen incapié en la distintafuncionalidad <strong>de</strong> conos y bastones, sino más bien en la interacción entreconos, bastones y otras neuronas retinianas.Sin embargo, el nombre <strong>de</strong> esta teoría evoca otra dualidad curiosa. Ladualidad <strong>de</strong> la luz, como “partícula” y como “onda”. Parecería que losbastones son sensibles a los fotones como partículas mientras que losconos lo serían como ondas.Campos receptores <strong>de</strong> la retinaEn la retina <strong>de</strong> cada ojo e<strong>xi</strong>sten unos 120 millones <strong>de</strong> bastones, 7millones <strong>de</strong> conos y algo más <strong>de</strong> un millón <strong>de</strong> células gaglionares cuyasfibras forman el nervio óptico. La <strong>de</strong>sigualdad entre el número <strong>de</strong>receptores y <strong>de</strong> células “transportadoras” evi<strong>de</strong>ncia el fenómeno <strong>de</strong>convergencia que opera en la retina. Esta convergencia es lo queconocemos como campos receptores. Un campo receptor es la superficieque cubren los receptores que estimulan al mismo neurocito ganglionar.


[ 66 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLa fosa o mácula carece <strong>de</strong> bastones y contiene entorno a los 4.000 conosy la misma cantidad <strong>de</strong> neurocitos. En ella, el campo receptor secorrespon<strong>de</strong> con los 2 μm apro<strong>xi</strong>madamente, lo que correspon<strong>de</strong> con unángulo corneal <strong>de</strong> sólo unos pocos minutos. Esta zona es la región <strong>de</strong>mayor discriminación <strong>de</strong> la retina y la parte <strong>de</strong>l objeto percibido con más<strong>de</strong>talle es el que se proyecta sobre esta zona.En la retina periférica un campo receptor pue<strong>de</strong> tener hasta $1mm$ <strong>de</strong>diámetro, lo que correspon<strong>de</strong> con un arco <strong>de</strong> 3º en el campo visual (queabarca 160º).Estos campos receptores extrafoveales con sensores mezclados (conos ybastones) no son muy precisos, pero a cambio pue<strong>de</strong>n trabajar conestimulaciones y umbrales más bajos.Aspectos funcionales <strong>de</strong> la visiónPara nosotros es imposible mantener los ojos quietos un solo instante,ni aún cuando concentramos nuestra mirada en algo, siempre se producenpequeños movimientos. Esta especie <strong>de</strong> “barrido” <strong>de</strong> alta frecuencia esesencial para mantener una imagen visual. Cuando experimentalmente seconsigue mantener la proyección <strong>de</strong> una imagen sobre la retina <strong>de</strong> formaestática, la misma tien<strong>de</strong> a <strong>de</strong>svanecerse, a disminuir su coloración y a quesus contornos se <strong>de</strong>svanezcan, como se pue<strong>de</strong> advertir en la figura 2.Figura 2. Si fijamos la vista en el punto central la “corola” parece difuminarse.


Psicofisiología <strong>de</strong> la percepción [ 67 ]Figura 3. El efecto <strong>de</strong> inhibir los bor<strong>de</strong>s tiene comoresultado la aparición <strong>de</strong> puntos negros fantasmas.Agu<strong>de</strong>za <strong>de</strong> contornos y contrasteEn la percepción <strong>de</strong> los contornos se encuentra implicado un fenómenoperceptivo que se conoce como inhibición lateral. El fenómeno es unmecanismo <strong>de</strong> interacción entre las neuronas para enfatizar los límites. Porejemplo, si colocamos un folio blanco sobre una zona negra. Los efectos <strong>de</strong>esta peculiaridad se pue<strong>de</strong>n apreciar en la figura 3.La percepción <strong>de</strong> los contornos, <strong>de</strong>l color y <strong>de</strong>l contraste, es por tanto, unaapreciación distorsionada <strong>de</strong>s<strong>de</strong> la misma recepción <strong>de</strong>l estímulo. Algunosefectos son llamativos como el <strong>de</strong>l ejemplo <strong>de</strong> Edward H. A<strong>de</strong>lson, que sepue<strong>de</strong> apreciar en la figura 4. En dicha figura los cuadros A y B sonexactamente el mismo tono <strong>de</strong> gris, sin embargo, el entorno y loscontrastes con las zonas adyacentes hacen que se interpreten comocromatismos diferentes.Adaptación, agu<strong>de</strong>za visual y visión cromáticaEl ojo no es sensible siempre a la misma cantidad <strong>de</strong> luz. Un ojoadaptado a la oscuridad pue<strong>de</strong> ser estimulado con una diezmilésima parte<strong>de</strong> la energía que estimularía al mismo ojo adaptado a la luz. Sin embargo,la velocidad a la que se adapta el ojo es variable. Se consi<strong>de</strong>ra que se tardauna media hora en que el ojo se adapte a la oscuridad, mientras que laadaptación a la luz se realiza en pocos segundos.


[ 68 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 4. Los cuadros marcados con la A y la B presentan el mismo matiz<strong>de</strong> gris sin embargo, son percibidos <strong>de</strong> manera distinta por el ojo.La capacidad que tiene el ojo para adaptarse a la oscuridad no <strong>de</strong>pen<strong>de</strong>sólo <strong>de</strong> la cantidad <strong>de</strong> luz. Se ha comprobado que <strong>de</strong>terminados estados <strong>de</strong>ánimo, la cantidad <strong>de</strong> oxígeno en sangre y otros factores influyen en laadaptación <strong>de</strong> la pupila.La agu<strong>de</strong>za visual <strong>de</strong>l ojo es la medida en que pue<strong>de</strong> distinguir <strong>de</strong>talles.Dicho <strong>de</strong> otro modo: la agu<strong>de</strong>za visual la po<strong>de</strong>mos medir como la distanciamínima entre dos puntos para que sean percibidos como tales y no comouna sola forma. Por supuesto la zona <strong>de</strong> mayor agu<strong>de</strong>za <strong>de</strong> la retina es lafóbea.Clínicamente la agu<strong>de</strong>za visual se mi<strong>de</strong> con una fracción cuyo numeradores siempre 20. Ese numero representa el número <strong>de</strong> pies (6 metrosapro<strong>xi</strong>madamente) que se toma por referencia. Es <strong>de</strong>cir, una persona conuna agu<strong>de</strong>za visual normal tendría un valor 20/20, es <strong>de</strong>cir a veinte piespue<strong>de</strong> distinguir letras que se distinguen a 20 pies. Si tiene una agu<strong>de</strong>zavisual <strong>de</strong> 20/100 quiere <strong>de</strong>cir que está distinguiendo a 100 pies las letrasque una persona normal distinguiría a 20. Si la agu<strong>de</strong>za visual es <strong>de</strong> 20/15quiere <strong>de</strong>cir que distingue las letras a tan sólo 15 pies.La visión cromática es la interpretación que hace el cerebro <strong>de</strong> la recepción<strong>de</strong> distintas longitu<strong>de</strong>s <strong>de</strong> onda y es por tanto una experiencia subjetiva. Lainterpretación <strong>de</strong> la luz amarilla cuando se estimulan simultáneamente


Psicofisiología <strong>de</strong> la percepción [ 69 ]receptores rojos y ver<strong>de</strong>s se consi<strong>de</strong>ra que es consecuencia <strong>de</strong>lprocesamiento cortical. La percepción <strong>de</strong>l color es algo limitado a algunosvertebrados diurnos. Parece que durante la filogenia la percepción <strong>de</strong>lcolor evolucionó <strong>de</strong> forma in<strong>de</strong>pendiente muchas veces.El tono <strong>de</strong> un color es la medida <strong>de</strong> la longitud <strong>de</strong> onda que se percibe; elrojo, ver<strong>de</strong>, azuly amarillo son tonos diferentes.El brillo <strong>de</strong> un color es la sensación subjetiva <strong>de</strong>terminada por la cantidad<strong>de</strong> negro en el color. El más negro es el menos brillante, es <strong>de</strong>cir, a mayorcantidad <strong>de</strong> negro se absorbe una mayor cantidad <strong>de</strong> luz y por tanto serefleja una cantidad menor.La saturación o pureza <strong>de</strong> un color es la sensación subjetiva<strong>de</strong>terminada por la cantidad <strong>de</strong> blanco <strong>de</strong>ntro <strong>de</strong>l mismo. El blanco alterael tono <strong>de</strong>bido a que está compuesto por colores. Cuanto menos blancotenga se dice que el color está “más saturado” o es “más puro su matiz”.El efecto PurkinjeEl efecto Purkinje <strong>de</strong>be su nombre a dicho experimentador queobservó que había diferencias <strong>de</strong> percepción cromática en situaciones <strong>de</strong>poca intensidad lumínica. Observó que las flores ligeramente azules lo eranmás a la caída <strong>de</strong> la tar<strong>de</strong>, mientras que en el crepúsculo las flores rojasparecían prácticamente negras. De hecho, esa es la explicación para laabundancia <strong>de</strong>l color rojo en el fondo marino, muchos peces, corales yanimales presentan dicho color para camuflarse en la oscuridad.El ojo adaptado a la oscuridad es más sensible al ver<strong>de</strong>, mientras que eladaptado a la luz lo es más al amarillo.PostimágenesLas postimágenes son sensaciones ópticas que persisten <strong>de</strong>spués <strong>de</strong>presentado el estímulo y pue<strong>de</strong>n ser <strong>de</strong> dos tipos: las postimágenesnegativas y las postimágenes positivas.Las postimágenes negativas se producen cuando miramos un estímulodurante unos 10 segundos y <strong>de</strong>spués fijamos la mirada en una superficieblanca. La imagen que se produce es complementaria al estímulo original.Tenemos un ejemplo en la figura 5.La postimagen positiva se produce cuando un estímulo iluminadointensamente se presenta durante 2 ó 3 segundos y <strong>de</strong>spués se cierran losojos. Esta postimagen se parece al estímulo original en color y forma,aunque no en intensidad.


[ 70 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 5. Mirar fijamente a la cruz durante unos 10 segundos y <strong>de</strong>spuésfijar la mirada en la cruz <strong>de</strong> la <strong>de</strong>recha, la postimagen formada <strong>de</strong>beríacorrespon<strong>de</strong>r con los colores <strong>de</strong> la ban<strong>de</strong>ra española 1 .Aspectos psicológicos <strong>de</strong> la percepciónUno <strong>de</strong> los factores que más influyen en la percepción es la atención.Todos conocemos la diferencia <strong>de</strong> actitud que hay entre ver y mirar o entreescuchar y oír. La atención es pues uno <strong>de</strong> los primeros factorespsicológicos que van a modificar la percepción.La atención dista bastante <strong>de</strong> ser una forma <strong>de</strong> información pasiva. Alcontrario, consiste en modificar el estado <strong>de</strong> vigilancia sobre <strong>de</strong>terminadosestímulos, <strong>de</strong> forma que aumenta el nivel <strong>de</strong> “alerta” que producen losmismos. La cantidad <strong>de</strong> estímulos a los que pue<strong>de</strong> aten<strong>de</strong>r el cerebrohumano <strong>de</strong> forma simultánea está limitada a un rango <strong>de</strong> 6 a 11, según loscasos. Esta limitación se ve compensada por la concurrencia <strong>de</strong> otrascaracterísticas o propieda<strong>de</strong>s funcionales.Esta limitación <strong>de</strong> amplitud e<strong>xi</strong>ge que se haga una selección <strong>de</strong> estímulosjuzgando la relevancia <strong>de</strong> unos y otros. En esencia, sirven para estableceresta relevancia factores como el contraste, el tamaño, la intensidad y elmovimiento <strong>de</strong> los objetos o estímulos.Leyes <strong>de</strong> la percepciónLas llamadas “leyes <strong>de</strong> la percepción” fueron formuladas en su mayoríapor los llamados “psicólogos <strong>de</strong> la forma” o Gestalt. El gran número <strong>de</strong>éstas po<strong>de</strong>mos reducirlo a tres grupos fundamentales: las que se refieren ala separación entre figura y fondo, las que alu<strong>de</strong>n a las propieda<strong>de</strong>s <strong>de</strong> las1 Nota <strong>de</strong>l maquetador: Suponiendo que la impresión <strong>de</strong> este documento que tienes en tusmanos es en color. :­) En la imagen a color, las bandas exteriores son <strong>de</strong> color ver<strong>de</strong> y lacentral <strong>de</strong> color azul.


Psicofisiología <strong>de</strong> la percepción [ 71 ]totalida<strong>de</strong>s figurales y las que precisan las condiciones por las que seagrupan estímulos en figuras.Por ejemplo, Helson <strong>de</strong>finió cinco principios:1. Ley <strong>de</strong> la primacía, en virtud <strong>de</strong> la cual los todos son primariosy aparecen con prioridad a las partes.2. Percibir todos es más natural que percibir partes. Ley <strong>de</strong> lapregnancia.3. Los todos (figuras) tien<strong>de</strong>n a articularse <strong>de</strong> la forma más completa,simétrica, sencilla y perfecta posible. Ley <strong>de</strong> la buena figura.4. La ley <strong>de</strong> la autonomía que los todos tien<strong>de</strong>n a ser reguladospor factores intrínsecos, más que por factores externos a ellos.5. Finalmente, las partes <strong>de</strong>rivan sus propieda<strong>de</strong>s <strong>de</strong> su posición, ofunción en el todo. De ahí la posibilidad <strong>de</strong> que un mismo estímulosirva <strong>de</strong> base a la percepción <strong>de</strong> figuras diferentes, como en el caso<strong>de</strong> las figuras reversibles. Ley <strong>de</strong> la fle<strong>xi</strong>bilidad <strong>de</strong>l contorno.Las leyes que rigen la agrupación <strong>de</strong> los estímulos mencionan lossiguientes factores:1. Pro<strong>xi</strong>midad: a igualdad <strong>de</strong> circunstancias, los estímulos máspró<strong>xi</strong>mos tien<strong>de</strong>n a percibirse como formando parte <strong>de</strong> un mismoobjeto.2. Semejanza: a igualdad <strong>de</strong> circunstancias, los estímulos mássemejantes tien<strong>de</strong>n a percibirse como formando parte <strong>de</strong> unmismo objeto.3. Continuidad: a igualdad <strong>de</strong> circunstancias, ten<strong>de</strong>mos a percibircomo formando parte <strong>de</strong> una misma figura los estímulos queguardan entre sí una continuidad <strong>de</strong> forma.4. Simetría: la ten<strong>de</strong>ncia a organizar los estímulos en una formasimétrica, pue<strong>de</strong> competir con alguna <strong>de</strong> las anteriores leyes, porejemplo, con la <strong>de</strong> la semejanza, y configurar unitariamenteestímulos heterogéneos.5. Constancia: la ten<strong>de</strong>ncia a precibir los objetos exteriores <strong>de</strong> unamanera estable. Por ejemplo, si observamos un objeto a un metro<strong>de</strong> distancia y nos separamos <strong>de</strong> él, su imagen en nuestra retina sehace más pequeña, sin embargo seguimos percibiendo sus<strong>de</strong>mensiones <strong>de</strong> manera constate.


[ 72 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 6. Algunas figuras que ejemplifican las leyes <strong>de</strong> la percepción.El número <strong>de</strong> las leyes <strong>de</strong> la percepción exce<strong>de</strong> con mucho lasexpuestas aquí. Sería imposible en este espacio <strong>de</strong> tiempo hablar <strong>de</strong> todasellas. Éstas, las expuestas por la Gestalt, junto con algunas otras como la <strong>de</strong>la constancia perceptiva, constituyen el cuerpo básico <strong>de</strong> las leyes <strong>de</strong> lapercepción siendo las <strong>de</strong>más meros <strong>de</strong>rivados o incluso redundancias <strong>de</strong>las mismas.


La Matemática <strong>de</strong> los Gráficos 3DJuan David González Cobascoba@epsig.uniovi.es ::Este documento aporta un repaso <strong>de</strong> matemáticaspertinentes a las tareas que afrontan cada día artistas y<strong>de</strong>sarrolladores 3D. Se incluyen aspectos <strong>de</strong> la geometría<strong>de</strong> los gráficos3D, la representación <strong>de</strong> objetos y sustransformaciones geométricas.Sistemas <strong>de</strong> coor<strong>de</strong>nadasFundamentosLa <strong>de</strong>scripción <strong>de</strong> escenas tridimensionales requiere usualmente el empleo<strong>de</strong> un sistema <strong>de</strong> coor<strong>de</strong>nadas cartesiano. Los puntos <strong>de</strong>l espacio quedan<strong>de</strong>terminados <strong>de</strong> forma única por sus tres coor<strong>de</strong>nadas cartesianas (x, y,z).Hay otros sistemas que no se emplean tanto en gráficos 3D. Los máscorrientes son las coor<strong>de</strong>nadas cilíndricas y esféricas.Los tres sistemas asignan coor<strong>de</strong>nadas a los puntos <strong>de</strong> acuerdo al esquema<strong>de</strong> la figura 1. Cada sistema usa tres <strong>de</strong> las dimensiones que allí sereferencian:cartesianas: (x,y,z)cilíndricas: (z)esféricas: (rLas ecuaciones que nos permiten cambiar entre un sistema y otro son:Cartesianas EsféricasCartesianas Cilíndricasx = r sin cos x = cos y = r sin sin z = r cos y = sin z = z[ 73 ]


[ 74 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 1. Sistemas <strong>de</strong> coor<strong>de</strong>nadas cartesianas, cilíndricas y esféricas.De mayor importancia en gráficos por computador son las coor<strong>de</strong>nadashomogéneas o proyectivas. Los puntos ordinarios <strong>de</strong>l espaciotridimensional reciben cuatro coor<strong>de</strong>nadas en lugar <strong>de</strong> tres:(x,y,z) (x,y,z,w)Esto introduce una redundancia evi<strong>de</strong>nte, <strong>de</strong> forma que a cada punto<strong>de</strong>l espacio le asignamos infinitas cuaternas <strong>de</strong> coor<strong>de</strong>nadas homogéneas,<strong>de</strong> acuerdo con la equivalencia:(x, y, z, w) (x', y' ,z' ,w') (x, y, z, w) = (x', y' , z ', w') para algún 0<strong>de</strong> forma que cuaternas proporcionales <strong>de</strong>noten el mismo punto. La ternausual (x, y, z) se i<strong>de</strong>ntifica con la cuaterna (x, y, z, 1), y la cuaterna (x, y, z,w) <strong>de</strong>nota un punto (x/w, y/w, z/w) <strong>de</strong>l espacio ordinario.Si w=0, tenemos un punto <strong>de</strong>l infinito; lo que logramos con la introducción<strong>de</strong> cuaternas es, precisamente, una coordinatización <strong>de</strong> la geometría <strong>de</strong>lespacio proyectivo tridimensional. Esta es la primera ventaja <strong>de</strong> larepresentación: no se necesita ningún tratamiento especial para puntos <strong>de</strong>linfinito casos especiales <strong>de</strong> paralelismo. Las transformaciones proyectivasse traducen fácilmente a transformaciones lineales en el espacio <strong>de</strong> 4-tuplas (es <strong>de</strong>cir, a matrices 4 x 4). Otra ventaja es que las transformacionesafines usuales también se tratan <strong>de</strong> forma regular como productos <strong>de</strong>matrices, como veremos en la sección 4.


La Matemática <strong>de</strong> los Gráficos 3D [ 75 ]Figura 2. Coor<strong>de</strong>nadas Proyectivas.Álgebra vectorialOperaciones con vectoresLos vectores <strong>de</strong>l espacio tridimensional se representan por lo comúnpor sus coor<strong>de</strong>nadas cartesianas, y las operaciones con vectores se <strong>de</strong>finenen términos <strong>de</strong> ellas:adición(x, y, z) + (x', y', z') = (x + x', y + y', z + z')substracción(x, y, z) - (x', y', z') = (x - x', y - y', z - z')escalado(x, y, z) = (x, y, z)producto escalar(x, y, z) × (x', y', z') = xx' + yy' + zz'norma∥x , y , z∥=v⋅v [ x 2 y 2 z 2 ]producto vectorial(x, y, z) × (x', y', z') = (x, y, z) (x', y', z') = (yz' - zy', zx' - xz', xy' – yx')


[ 76 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 3. Interpretación geométrica <strong>de</strong> las operaciones con vectores.Interpretaciones geométricasLa interpretación geométrica <strong>de</strong> estas operaciones pue<strong>de</strong> verse en lafigura 3. En ella vemos que el producto escalar tiene la interpretaciónalternativav⋅w=∥v∥∥w∥cosy el producto vectorial es ortogonal a los factores, con módulo igual al área<strong>de</strong>l paralelogramo que <strong>de</strong>finen:v×w=∥v∥∥w∥sin De esto <strong>de</strong>ducimos que los dos productos son <strong>de</strong> especial interés, alpermitirnos calcular los elementos métricos <strong>de</strong> un mo<strong>de</strong>lo: distancias,ángulos, área, volúmenes, ortogonalidad y paralelismo. Veamos algunosejemplos:●●La norma <strong>de</strong> un vector v = (x, y, z) (su longitud) se calcula pormedio <strong>de</strong>l producto escalar: ∥v∥=v⋅vLa distancia entre dos puntos es la norma <strong>de</strong>l vector que los une:P = (x, y, z)Q = (x', y', z')P Q = (x' - x, y' - y, z' – z)d P ,Q=∥P ,Q∥=x '− x 2 y'− y 2 z'− z 2


La Matemática <strong>de</strong> los Gráficos 3D [ 77 ]Figura 4. Volumen <strong>de</strong> un paralelepípedo.● El ángulo f entre v y w es cos= v⋅w∥v∥⋅∥w∥● Dos vectores son ortogonales si y sí y sólo si v×w=0●Un vector normal al plano <strong>de</strong>finido por v y w viene dado porv×w● El volumen <strong>de</strong>l paralelepípedo (celda) <strong>de</strong>finido por los vectores u,v, w (ver figura 4) es<strong>de</strong>t u , v , w=u⋅v×w=u 1u 2u 3v 1v 2v 3w 1w 2w 3Esta cantidad se conoce también como el triple producto <strong>de</strong> los vectores u,v, w o, más corrientemente, su <strong>de</strong>terminante. El cómputo <strong>de</strong>l mismo siguereglas bien conocidas en las que no nos <strong>de</strong>tendremos <strong>de</strong>masiado.BasesDado cualquier conjunto <strong>de</strong> vectores {v 1, v 2, ..., v n}, el subespacioengendrado por ellos es el conjunto <strong>de</strong> todos los vectores que po<strong>de</strong>mosconstruir como combinación lineal <strong>de</strong> {v 1, v 2, ..., v n}, usando la suma y lamultiplicación por escalares:〈v 1,v 2,... , v n〉={w∣w= 1v 1 2v 2... nv n}El conjunto {v 1, v 2, ..., v n} es libre, o linealmente in<strong>de</strong>pendiente, si 1v 1 2v 2... nv n=0 ⇔ 1= 2=...= n=0


[ 78 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Do, <strong>de</strong> otro modo, si ningún vector <strong>de</strong>l conjunto pue<strong>de</strong> expresarse como unacombinación lineal <strong>de</strong> los <strong>de</strong>más. Un conjunto libre que genera el espaciototal en consi<strong>de</strong>ración es una base <strong>de</strong>l mismo. En nuestro espaciotridimensional, todas las bases tienen tres elementos. A<strong>de</strong>más, una base B= {e 1 , ... ,e n } don<strong>de</strong> vectores diferentes son ortogonalese i⋅e j=0 sii i≠ jse <strong>de</strong>nomina ortogonal. Si a<strong>de</strong>máse i⋅e j=1es <strong>de</strong>cir, todos los vectores son <strong>de</strong> norma unidad, la base esortonormal. En una base ortonormal, los vectores se pue<strong>de</strong>n expresar <strong>de</strong>forma simple y conveniente como sigue:x= x⋅e 1e 1x⋅e 2e 2x⋅e 3e 3Geometría afín y proyectivaEn la sección previa hemos mencionado <strong>de</strong> pasada la distancia entrepuntos, y usado sin restricción la notación P,Q para referirnos al vector queune el punto P con el punto Q. Rigurosamente hablando, esto sólo eslegítimo si al espacio tridimensional ordinario (carente <strong>de</strong> coor<strong>de</strong>nadas) lodotamos <strong>de</strong> una estructura afín.Esto significa,simplemente, que e<strong>xi</strong>ste una operación para trasladarcualquier punto P por cualquier vector v, <strong>de</strong> forma que el resultado sea otropunto que <strong>de</strong>notaremos por P+v. La operación <strong>de</strong> traslación <strong>de</strong>besatisfacer las propieda<strong>de</strong>s obvias siguientes:1. Para cada vector v, la correspon<strong>de</strong>ncia PP + v es uno a uno.2. Para cada punto P, se cumple P + 0 = P3. Para cada punto P y vectores v, w, tenemos(P + v) + w = P + (v + w)Estas propieda<strong>de</strong>s son tan obvias en el trabajo 3D ordinario, que lasusamos sin conciencia <strong>de</strong> ello. La e<strong>xi</strong>stencia <strong>de</strong> un vector que une P con Q,por ejemplo, es una consecuencia <strong>de</strong> ellas; la asignación <strong>de</strong> coor<strong>de</strong>nadas enel espacio ordinario también lo es. Si añadimos a esto la e<strong>xi</strong>stencia <strong>de</strong> unproducto escalar, po<strong>de</strong>mos <strong>de</strong>finir conceptos <strong>de</strong> distancia, ángulos yortogonalidad, <strong>de</strong> forma que cualquier problema <strong>de</strong> geometría métricapue<strong>de</strong> resolverse <strong>de</strong> forma analítica.


La Matemática <strong>de</strong> los Gráficos 3D [ 79 ]Figura 5. Ecuaciones <strong>de</strong> un plano.Resumimos a continuación los hechos más simples relativos aentida<strong>de</strong>s «rectas» en geometría afín tridimensional: puntos, líneas yplanos. Estas son las variedad afines o lineales <strong>de</strong> la geometría habitual, ypue<strong>de</strong>n <strong>de</strong>finirse siempre por medio <strong>de</strong> sistemas <strong>de</strong> ecuaciones lineales.PlanosUn plano se suele <strong>de</strong>finir <strong>de</strong> dos maneras:ecuación implícitaPor medio <strong>de</strong> una sola ecuación lineal que satisfacen las coor<strong>de</strong>nadas<strong>de</strong> los puntos <strong>de</strong>l planoecuación paramétricaAx + By + Cz + D = 0Los puntos <strong>de</strong>l plano se obtienen barriendo todos los posibles valores<strong>de</strong> dos parámetros reales u y v. En forma vectorialP=P 0u , P 0P 1v , P 0P 2


[ 80 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Do, en coor<strong>de</strong>nadas x y = x 0zy 0z 0u , a bc a 'v , b 'c'Los vectores (a, b, c) y (a', b', c') son vectores <strong>de</strong> dirección <strong>de</strong>l plano. Esfácil pasar <strong>de</strong> una representación a otras: a partir <strong>de</strong> la ecuación implícitaes fácil obtener tres puntos no colineales P 0 , P 1, P 2 que nos dan lasecuaciones paramétricas. El paso <strong>de</strong> las ecuaciones paramétricas a laimplícita requeriría, en principio, eliminar por reducción los parámetrosu,v. Pero hay un método más fácil usando el producto vectorial:Líneas A, B ,C =P 0 P 1 ×P 0 P 2 =a , b , c× a' ,b ' ,c ' D=− A, B , C⋅P 0Las rectas pue<strong>de</strong>n <strong>de</strong>finirse por un punto y una dirección, o por laintersección <strong>de</strong> dos planos. Esto da lugar a las posibles representacionesanalíticas <strong>de</strong> la recta conecuaciones implícitas.Dos ecuaciones lineales (in<strong>de</strong>pendientes) que <strong>de</strong>finen la línea comointersección <strong>de</strong> dos planos:A1x + B1y + C1z + D1 = 0A2x + B2y + C2z + D2 = 0ecuación paramétricaNos dan las coor<strong>de</strong>nadas <strong>de</strong> puntos <strong>de</strong> la línea al barrer un paráetroreal u todos los valores posibles: x z ,0y =P u P P 0 0 1x a cy u 0 bz 0De nuevo, la conversión entre las dos representaciones es sencilla. Laecuación paramétrica pue<strong>de</strong> ponerse en forma implícita eliminando elparámetro u; y <strong>de</strong> las ecuaciones implícitas obtenemos fácilmente dospuntos con los que construir la paramétrica; o un punto y el vector <strong>de</strong>dirección, proporcionado por la expresiónP 0P 1 = (A 1, B 1, C 1) × (A 2, B 2, C 2).


La Matemática <strong>de</strong> los Gráficos 3D [ 81 ]Figura 6. Ecuaciones <strong>de</strong> una línea recta.Geometría <strong>de</strong> la inci<strong>de</strong>ncia y geometría métricaCon estos conceptos, y teniendo en mente las propieda<strong>de</strong>s <strong>de</strong>l productoescalar y vectorial, po<strong>de</strong>mos resolver cualquier problema <strong>de</strong> geometríaanalítica elemental. Mejor que una enumeración <strong>de</strong> problemas-tipo, vamosa resolver algunos problemas sencillos para adquirir una impresión <strong>de</strong> lastécnicas que conllevan. Por ejemplo, queremos calcular la distancia entredos rectas, como se muestra en la figura 7. Ambas rectas r 1 y r 2 vienendadas por puntos P i y vectores directores u i. Un poco <strong>de</strong> refle<strong>xi</strong>ón nosconvencerá <strong>de</strong> que la distancia mínima d entre las dos rectas se alcanzaentre puntos Q 1 y Q 2 tales que el segmento Q 1Q 2 es ortogonal a las rectasdadas. Po<strong>de</strong>mos ver esto más claramente construyendo los planosparalelos p 1 y p 2 que contienen a cada recta; entonces,Q 1Q 2 esperpendicular a ambos. Así puesd=∥Q 1Q 2 ∥ y Q 1Q 2⊥u 1,u 2y entonces Q1Q2 = u1 × u2. Ahora, el vector P1P2 une puntos <strong>de</strong> ambasrectas, que son ortogonales a Q1Q2. Entonces, el producto escalar con elvector unitario u1 × u2 nos dará el módulo <strong>de</strong> la proyección <strong>de</strong> P1P2 sobreQ1Q2, que es exactamente d. Obtenemosd =P 1P 2⋅u 1×u 2=<strong>de</strong>t P 1P 2,u 1,u 2


[ 82 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 7. Ejemplo <strong>de</strong> la distancia entre dos rectas.Matrices y transformaciones geométricasLas tareas que po<strong>de</strong>mos realizar con los conceptos vistos hasta ahora sonbastante elementales. Un tratamiento más potente <strong>de</strong> los objetosgeométricos e<strong>xi</strong>ge po<strong>de</strong>r expresar operaciones complejas con las formas. Elmétodo habitual <strong>de</strong> representar transformaciones lineales, y <strong>de</strong> calcularsus efectos, es el uso <strong>de</strong> matrices.Una matriz m×n es una tabla rectangular <strong>de</strong> números <strong>de</strong> la formaa 11a 12... a 1na 21a 22... a 2n... ... ⋱ ...a m1a m2... a mnque se escribe <strong>de</strong> forma más compacta como (aij)1≤i≤m,1≤j≤n osimplemente como (aij) si las dimensiones <strong>de</strong> la matriz se sobreentien<strong>de</strong>n.Al igual que los vectores, las matrices pue<strong>de</strong>n sumarse y restarse


La Matemática <strong>de</strong> los Gráficos 3D [ 83 ]componente a componente. El producto <strong>de</strong> matrices viene <strong>de</strong>finido por lareglayA= a ijB=b jkAB= c iki=1 ... m , j=1... nj=1... n , k=1... pi=1 ... m , k=1. .. pnC ik=∑ a ijb jkj=1Observemos que, incluso cuando m = n = p, tenemos, es <strong>de</strong>cir, elproducto <strong>de</strong> matrices no es conmutativo. La transpuesta <strong>de</strong> una matriz seobtiene intercambiando filas y columnas:A=a ij⇒ A T =a jiUna matriz cuadrada A <strong>de</strong> dimensión nn es regular si e<strong>xi</strong>ste otramatriz B <strong>de</strong> la misma dimensión que cumpla que AB = BA = 1. Si e<strong>xi</strong>ste, lamatriz B se <strong>de</strong>nomina inversa <strong>de</strong> A, y se <strong>de</strong>nota por A -1 .Normalmente, usaremos vectores fila y vectores columna para representarpuntos y vectores, y matrices cuadradas para representar transformacioneslineales. Las dimensiones <strong>de</strong> nuestras matrices serán 33 o bien 44 casisiempre.Comencemos expresando matricialmente el efecto sobre un objeto <strong>de</strong> unatraslación <strong>de</strong> vector v = (vx, vy,vz). Una transformación <strong>de</strong> este tipomanda un punto (x, y, z) a otro (x', y', z'), don<strong>de</strong>x ' x v xy' = y v yz ' z v zo, <strong>de</strong> manera más compacta, P' = P + v. Vemos aquí que estatransformación no es, estrictamente hablando, lineal: sus ecuacionespresentan términos in<strong>de</strong>pendientes. ¿Cómo expresaríamos analíticamenteuna refle<strong>xi</strong>ón especular alre<strong>de</strong>dor <strong>de</strong>l plano XY? Tal refle<strong>xi</strong>ón cambiaría elsigno <strong>de</strong> las coor<strong>de</strong>nadas z, <strong>de</strong>jando las <strong>de</strong>más intactas. Tales cambiosin<strong>de</strong>pendientes se expresarían por medio <strong>de</strong> ecuaciones


[ 84 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Dx' = xy' = yz' = - zque serían, en forma matricialx ' =1 0 01 xy' 0 1 0 yz ' 0 0 −De hecho, cualquier transformación lineal pue<strong>de</strong> ponerse en formamatricial. La receta es:1. escogemos una base e 1, e 2, e 31. aplicamos la transformación a los vectores <strong>de</strong> la misma,obteniendo f 1 = Te 1, f 2 = Te 2, f 3 = Te 32. ponemos los vectores así obtenidos como columnas <strong>de</strong> la matriz<strong>de</strong>seada.Otra transformación usual es la homotecia o escalado por un factor l.Naturalmente, si 0 < l < 1, tenemos una contracción, mientras que si l > 1tenemos una dilatación. Cuando l =-1, la <strong>de</strong>nominamos refle<strong>xi</strong>ón respectoal origen. Cada coor<strong>de</strong>nada <strong>de</strong> un punto queda multiplicada por l, <strong>de</strong> modoquex ' = 00 xy' 0 0 yz ' 0 0La rotación constituye un caso más interesante. Queda <strong>de</strong>terminadapor el eje <strong>de</strong> rotación y un ángulo. La rotación <strong>de</strong> ángulo f respecto al eje zpue<strong>de</strong> calcularse usando la receta anterior:1. Sea (1, 0, 0), (0, 1, 0), (0, 0, 1) la base.2. rotémosla, obteniendo los vectores (cos f, sin f, 0), ( - sin f, cos f,0), (0, 0, 1)3. construyamos una matriz con esas tres columnas=cos sin 01R − sin cos 00 0zz


La Matemática <strong>de</strong> los Gráficos 3D [ 85 ]Po<strong>de</strong>mos comprobar que la transformación <strong>de</strong> coor<strong>de</strong>nadas es la correcta:x ' =cos − sin 01 x y' sin cos 0 yz ' 0 0 zSi rotamos un ángulo q alre<strong>de</strong>dor <strong>de</strong>l eje x, obtenemos una matrizdistinta:x ' =1 0 0 xy' 0 cos − sin yz ' 0 sin cosY si aplicamos ambas rotaciones en sucesión, obtenemosx ' =cos − sin 0 0 0 xy' sin cos 0 0 cos − sin yz ' 0 sin cos0 0 11La composición <strong>de</strong> ambas rotaciones la proporciona la matrizproducto, que es, en este caso:=cos − sin 0R=R xR z cos sin coscos − sin sin sin cos sin cosEsto no tiene el aspecto <strong>de</strong> ninguna <strong>de</strong> las rotaciones anteriores, peroes una <strong>de</strong> ellas, alre<strong>de</strong>dor <strong>de</strong> algún eje. ¿Cómo po<strong>de</strong>mos saberlo? Porque lamatriz resultante es ortogonal:R t R = RR t = 1don<strong>de</strong> 1<strong>de</strong>nota la matriz i<strong>de</strong>ntidad, que tiene ceros fuera <strong>de</strong> la diagonalprincipal y unos en ella. Una matriz ortogonal representa unatransformación que preserva las longitu<strong>de</strong>s(y,consecuentemente, losángulos y los productos escalares). Un cizallaje no preserva las distancias.Como ejemplo <strong>de</strong> uno, la matrizx ' =1 0 S x x y' 0 0 S y yz ' 0 0 1 zzz


[ 86 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 8. Cizallaje <strong>de</strong> un cubo.Esto tiene como efecto <strong>de</strong>splazar las «capas superiores» <strong>de</strong> un cubo <strong>de</strong>una manera parecida a como ocurriría con un mazo <strong>de</strong> cartas, según semuestra en la figura 8.¿Qué suce<strong>de</strong> si queremos componer un cizallaje con una traslación, y<strong>de</strong>spués aplicar una rotación? La cosa se <strong>de</strong>sorganiza un poquito:X' = R(SX + B) = RSX + RBpor culpa <strong>de</strong> los términos in<strong>de</strong>pendientes en el producto. En general,obtendremos siempre una transformación <strong>de</strong>l tipo x' = a 11a 12a 13X '= AXB o y' a 21a 22a 23z' a 31a 32a 33 x b 1y b32z bAhora po<strong>de</strong>mos apreciar la ventaja <strong>de</strong> usar coor<strong>de</strong>nadas homogéneas.El espacio afín ordinario pue<strong>de</strong> dotarse <strong>de</strong> coor<strong>de</strong>nadas con una cuartacomponente adicional, <strong>de</strong> valor unidad, <strong>de</strong> manera que la ecuaciónanterior se podrá escribir como


La Matemática <strong>de</strong> los Gráficos 3D [ 87 ]X ' =AX ox'y 'z'1=a 11 a 12 a 13 b 1a 21a 22a 23b 2a 31 a 32 a 33 b 30 0 0 11xyzTodas las transformaciones anteriores pue<strong>de</strong>n escribirse así y cualquiertransformación afín admite, en coor<strong>de</strong>nadas homogéneas, la forma <strong>de</strong> unatransformación lineal, componiéndose entre ellas por simple producto <strong>de</strong>matrices.Sumario proyectivoComo resumen, veamos la forma que adoptan, en 4–coor<strong>de</strong>nadasproyectivas, algunas <strong>de</strong> las transformaciones mencionadas anteriormente:Traslación0 0 T x0 1 0 TT=1 y0 0 1 T z0 0 0 1Refle<strong>xi</strong>ón0 0 00 −1 0 0T=1 10 0 1 00 0 0CizallajeS=1 0 S x00 1 S y00 0 1 00 0 0 1


[ 88 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DRotación− sin 0 0sin cos 0 0S=cos10 0 1 00 0 0Proyección0 0 00 1 0 0T=1 0 0 1 010d0 0DeterminantesConsi<strong>de</strong>remos una transformación lineal arbitraria, como larepresentada en la figura 9. La transformación distorsiona la caja azul,convirtiéndola en un paralelepípedo representado en rojo. Hemos hechocoincidir las aristas <strong>de</strong> la caja con los vectores <strong>de</strong> la base canónica e1, e2,e3, <strong>de</strong> modo que las aristas azules correspondientes se transforman en losvectores f1=Te1, f2=Te2, f3=Te3 que son aristas que <strong>de</strong>finen elparalelepípedo rojo.¿Cuál es el volumen <strong>de</strong>l paralelepípedo? Hay tres hechos obvios●Si dos vectores fi coinci<strong>de</strong>n, el volumen es nulo.V(f1, f2, f3) = 0 si f1 = f2● Un cizallaje no cambia el volumen (ver figura 8).V(f1 + f2, f2, f3) = V(f1, f2, f3)●La dilatación <strong>de</strong> un vector dilata <strong>de</strong> la misma forma el volumenV(f1, f2, f3) = V(f1, f2, f3)Las propieda<strong>de</strong>s indicadas son válidas, naturalmente, para cualquierposición funcional <strong>de</strong> V(·). Estas resultan ser las propieda<strong>de</strong>s que <strong>de</strong>finen<strong>de</strong> forma única (excepto un factor constante) al <strong>de</strong>terminante <strong>de</strong> unamatriz. Escribimos


La Matemática <strong>de</strong> los Gráficos 3D [ 89 ]f 11f 12f 13nV f 1,f 2,f 3 f =[21f 22f 23sign∏ f i i (1)∈Sf 31f 32f 33]=∑ni=1La <strong>de</strong>finición general <strong>de</strong> <strong>de</strong>terminante, que es el tercer término <strong>de</strong> lafórmula anterior, es[ a a11 12a 21a 22] =a a − a a 11 22 12 21[a 11 a 12 a 13a 21a 22a 23 11a 22a 33a 12a 23a 31a 13a 21a 32−a 11a 23a 32−a 12a 21a 33−a 13a 22a 31a 31a 32a 33]=aManipulando la <strong>de</strong>finición (1) po<strong>de</strong>mos llegar a la fórmulan<strong>de</strong>t A=∑ −1 i− 1 <strong>de</strong>t A 1ii=1don<strong>de</strong> A1i se obtiene <strong>de</strong> A al suprimir su primera fila y su i–ésimacolumna. Esta fórmula permite el cálculo por recurrencia <strong>de</strong> <strong>de</strong>terminantesno muy gran<strong>de</strong>s:[6 3 92 3 11 2 3]=6[ 3 12 3] [ −3 2 11 3] [ 9 2 3 =6 9−2−36−194−3=361 2]Para ór<strong>de</strong>nes mayores, esto es inútil, y resulta preferible usar laspropieda<strong>de</strong>s que <strong>de</strong>finen el <strong>de</strong>terminante, a saber: po<strong>de</strong>mos añadir acualquier fila una combinación lineal <strong>de</strong> las <strong>de</strong>más. Esto permite irhaciendo ceros un una columna <strong>de</strong> forma que el cálculo se reduce a un<strong>de</strong>terminante <strong>de</strong> or<strong>de</strong>n inferior en virtud <strong>de</strong>l <strong>de</strong>sarrollo anterior <strong>de</strong>t(A).Pero hay una forma mucho más rápida <strong>de</strong> aplicar esta receta; laexplicaremos en la sección siguiente.


[ 90 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 9. Determinante como medida <strong>de</strong> volumen.Álgebra lineal numérica y resolución <strong>de</strong> ecuacionesEn la sección 5, observamos que algunas tareas tienen bastante costecomputacional. Nos gustaría aliviar ese coste para que nuestros programasno se perpetúen en bucles interminables. Necesitamos a menudo●●invertir una matrizcalcular un <strong>de</strong>terminante● resolver un sistema <strong>de</strong> ecuaciones lineales● encontrar una base ortogonal/ortonormal <strong>de</strong> un subespacio● encontrar los ceros <strong>de</strong> un polinomio● resolver ecuaciones y sistemas no lineales● ajustar una curva o función a un conjunto <strong>de</strong> puntosLa mayoría <strong>de</strong> estas tareas son el tema <strong>de</strong>l álgebra lineal numérica; enla cual, no nos importan las propieda<strong>de</strong>s algebraicas <strong>de</strong> las operacioneslineales, sino solamente encontrar una solución que sea correcta <strong>de</strong> laforma más rápida posible. Las tareas <strong>de</strong> la lista anterior en las que nointervienen matrices son el objeto <strong>de</strong>l análisis numérico en general. De


La Matemática <strong>de</strong> los Gráficos 3D [ 91 ]nuevo, tampoco nos interesan las propieda<strong>de</strong>s matemáticas elegantes, sinoresolver las cosas, rápido y con precisión suficiente.La <strong>de</strong>scomposición LULlamamos así a una forma embellecida <strong>de</strong> lo que usualmente se<strong>de</strong>nomina eliminación gaussiana: el proceso <strong>de</strong> hacer ceros en una matrizcombinando filas linealmente. La i<strong>de</strong>a nos lleva, al final,a una matriz enforma triangular superior (la parte U <strong>de</strong> la <strong>de</strong>scomposición). Si a<strong>de</strong>másllevamos cuenta <strong>de</strong> las operaciones realizadas, aplicándoselas a unaflamante matriz unidad, obtendremos una matriz triangular inferior (laparte L <strong>de</strong>l monstruo), y, mágicamente, llegaremos a algo como esto:6 4A=1 32 3 5 8 21 6 40 −9 −30 −46 −291 6 40 −9 −3=U−410 03Registrando los multiplicadores en una matriz unidad nuevecita:1 0 010 1 0 0 01 0 012 1 0 8 01 0 02 1 0468 1=L9y, ¡magia!LU = AEl procedimiento pue<strong>de</strong> realizarse in situ (sobre la propia matrizoriginal). Cualquier paquete respetable <strong>de</strong> álgebra lineal numérica contieneuna función estándar que proporciona, por lo común, las partes L y Ucombinadas en una sola matriz, y una permutación <strong>de</strong> filas,que se usa parapivotar por razones <strong>de</strong> estabilidad numérica. así, la <strong>de</strong>scomposición LU seconvierte, <strong>de</strong> forma «oficial»,enPA = LU


[ 92 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Ddon<strong>de</strong> P es una matriz <strong>de</strong> permutación cuyo efecto es permutar las filas<strong>de</strong> A. Por ejemplo, si alimentamos a la rutina LINPACK <strong>de</strong> <strong>de</strong>scomposiciónLU con2 3A=1 1 4 −12 1 5obtenemos0 1P=0 00 1 0 L=1.001 00.00 0.001.00 5.000.50 1.00 0.00 U=2.000.00 3.50 −3.500.50 0.42 1.00 0.00 0.00 2.00Esta <strong>de</strong>scomposición se usa, principalmente, en tres problemas.Cálculo <strong>de</strong> <strong>de</strong>terminantesObtenemos<strong>de</strong>t(A) = <strong>de</strong>t(P) <strong>de</strong>t(L) <strong>de</strong>t(U)Una matriz <strong>de</strong> permutación como P tiene <strong>de</strong>terminante ± 1 según laparidad <strong>de</strong> la permutación. La matriz triangular inferior tiene obviamente<strong>de</strong>t(L)=1; y obtenemos, entonces, que, salvo un signo, <strong>de</strong>t(A) es el producto<strong>de</strong> los elementos <strong>de</strong> la diagonal principal <strong>de</strong> U. Esto nos permite el cálculo<strong>de</strong> <strong>de</strong>terminantes en tiempo O(n3), que es la complejidad usual <strong>de</strong> la<strong>de</strong>scomposición LU.Resolución <strong>de</strong> sistemas <strong>de</strong> ecuaciones linealesSupongamos que nos dan un sistema <strong>de</strong> ecuaciones lineales como éstea 11x 1 + a 12x 2 + ... + a 1nx n = b 1a 21x 1 + a 22x 2 + ... + a2 nx n = b 2. . .a n1x 1 + a n2x 2 + ... + a nnx n = b nque escribiremos en forma matricial


La Matemática <strong>de</strong> los Gráficos 3D [ 93 ]a 11a 12... a 1n x 1b 1aAX =B o 21a 22... a 2n x 2b 2... ... ⋱ ...a m1a m2... a mn⋅n⋮bPo<strong>de</strong>mos usar ventajosamente la <strong>de</strong>scomposición LU:AX = P -1LUX = B o bien LUX = PB (2)Salvo una permutación <strong>de</strong> los términos in<strong>de</strong>pendientes, po<strong>de</strong>mosresolver la ecuación 2 por sustitución progresiva y regresiva, ya que <strong>de</strong>1 0 ... 0 w 1 1l 211 ... 0 w 2b 2... ... ⋱ ...l n1l m2... l mn⋅⋮ ⋮w n=b nb⋮x n=obtenemosw 1 = b 1 (3)y, en generalw 2 = b 2 - l 21w 1w 3 = b 3 - l 31w 1 - l 32w 2k− 1w k=b k−∑ l kjw jj=1Una vez que conocemos los w i, usamos el mismo truco hacia atrás conU. Deu 11u 12... u 1n x 1 10 u 22... u 2n x 2w 2... ... ⋱ ...0 0 ... u mn⋅⋮ ⋮x n=w nw


[ 94 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Describimosy, en generalx n= 1u nnx n −1=x n −2=x k= 1 u ky el sistema está resuelto.w n (4)1u n− 1n− 11u n− 2n−2 w n− 1− u n−1,nx n w n−2−u n− 2,nx n−u n− 2,n− 1x n− 1k1x − k ∑ l kjw jj=1Observemos que si hay que resolver un sistema lineal con varios juegos<strong>de</strong> términos in<strong>de</strong>pendientes, la <strong>de</strong>scomposición LU pue<strong>de</strong> reutilizarse,siendo las sustituciones hacia <strong>de</strong>lante y hacia atrás procesos <strong>de</strong> coste O(n²)solamente. Esto tiene una aplicación directa enInversión <strong>de</strong> matricesAplicando los procesos 3 y 4 a las columnas <strong>de</strong> la matriz i<strong>de</strong>ntidad,obtenemos las columnas <strong>de</strong> la inversa <strong>de</strong>. Este es,en la práctica,elprocedimiento <strong>de</strong> inversión más efectivo para matrices <strong>de</strong>nsas.Resolución <strong>de</strong> ecuaciones¿Qué hacemos si necesitamos resolver una ecuación no lineal?Pongámonos en el caso siguiente: hemos mo<strong>de</strong>lado una superficie pormedio <strong>de</strong> una función paramétrica P(u, v) que nos da el vector <strong>de</strong> posición<strong>de</strong> un punto genérico <strong>de</strong> la mismo como función <strong>de</strong> los parámetros u, v. Yahora precisamos encontrar la intersección <strong>de</strong> la superficie con el eje z.


La Matemática <strong>de</strong> los Gráficos 3D [ 95 ]La intersección pue<strong>de</strong> encontrarse resolviendo el sistema0 = Px(u, v)0 = Py(u, v)z = Pz(u, v)para u, v, z. Pensemos, por ejemplo, que P es una superficie NURBS. ¿Quéhacemos? En primer lugar, pongamos el sistema en la formaf u ,v ,z=0 con f u ,v ,z=P xu , vP yu ,v P zu ,v−zEn general, este problema es difícil, y tiene que resolverse por unalgoritmo numérico (iterativo). Probemos el método <strong>de</strong> Newton.Empezamos con un valor inicial <strong>de</strong> (u, v, z) = (u 0, v 0, z 0), y lo refinamosrepetidamente aplicándole la fórmulau i1,v i1, z i1=u i,v i, z i− Df − 1 u i,v i, z i f u i, v i, z iAquíDf −1 u i, v i, z i es la matriz <strong>de</strong> <strong>de</strong>rivadas parciales∂ f x ∂ f x ∂ f x∂ x ∂ y ∂ z∂ f y∂ f y∂ f y∂ x ∂ y ∂ z∂ f z∂ f z∂ f z∂ x ∂ y ∂ zque se conoce como el jacobiano <strong>de</strong> f , evaluado en ui, vi, zi. Si e<strong>xi</strong>ste laduda, sí: este es el mismo jacobiano que encontraremos posteriormente enla sección ?? Si tenemos suerte, los puntos sucesivos que iremosobteniendo se apro<strong>xi</strong>marán cada vez más a una solución <strong>de</strong> la ecuación trasunas cuantas iteraciones. Y, si no tenemos suerte…La convergencia <strong>de</strong>l método <strong>de</strong> Newton es cuadrática si tenemos lafortuna <strong>de</strong> comenzar suficientemente cerca <strong>de</strong> una solución. Esto quiere<strong>de</strong>cir que en cada iteración duplicamos el número <strong>de</strong> cifras exactas <strong>de</strong> lasolución, si todo va bien (lo que, naturalmente, no tiene por qué ocurrircuando más lo necesitamos).


[ 96 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DGeometría diferencial en cuatro palabrasCurvasUna curva en el espacio viene dada por una representaciónparamétricat(t)don<strong>de</strong> (t) será un punto genérico <strong>de</strong> la curva, que es barrido al hacervariar t a lo largo <strong>de</strong> un intervalo (llamado dominio <strong>de</strong>l parámetro). Lavelocidad a la que circulamos por la curva es la <strong>de</strong>rivada '(t), y la aceleraciónes ''(t). La longitud <strong>de</strong> un segmento <strong>de</strong> curva la da la fórmulat 0L t 0,t 1=∫∥' t∥dtt 1Si ponemos s = L(t 0, t), po<strong>de</strong>mos usar s como parámetro. Esto tiene laventaja <strong>de</strong> simplificar bastante algunos cálculos. La <strong>de</strong>scomposiciónse convierte en' t= d =∥' t ∥T =vTdt' s= d =∥' s∥T =Tdsal usar como parámetro la longitud <strong>de</strong> arco. En ella, T es el vectortangente unitario. Como T · T es constante, 2T' · T = 0 y <strong>de</strong>ducimos que T'es ortogonal a T. Por tanto, es un vector normal cuyo módulo mi<strong>de</strong> lavelocidad <strong>de</strong> rotación <strong>de</strong> T, la cual es inversamente proporcional al radio<strong>de</strong> curvatura. Llamamos a |T'| la curvatura k.' ' s=T '= Ncon N unitario normal a la curva. Si ponemos B = T × N, es fácil<strong>de</strong>rivar que la tríada ortonormal (T, N, B), como función <strong>de</strong> la longitud <strong>de</strong>arco s, satisface las ecuaciones.T' = kNN' = - kT - tBB' = tN


La Matemática <strong>de</strong> los Gráficos 3D [ 97 ]Figura 10. Triedro móvil <strong>de</strong> Frenet.don<strong>de</strong> t es una función que mi<strong>de</strong> cuánto dista la curva <strong>de</strong> ser plana: latorsión. Llamamos a B el vector binormal, y las ecuaciones ?? son lasfórmulas <strong>de</strong> Frenet-Serret.Sólo para físicos: sin duda, se habrán dado cuenta ya <strong>de</strong> queT' = D × TN' = D × NB' = D × Bsi D = kB - tT. ¿Sería mejor <strong>de</strong>cir D = ?SuperficiesEn la sección 9 veremos que, a<strong>de</strong>más <strong>de</strong> por mallas triangulares opoligonales, po<strong>de</strong>mos mo<strong>de</strong>lar superficies empleando funciones máscomplicadas,como polinomios bicúbicos. En general,po<strong>de</strong>mos <strong>de</strong>scribiruna superficie por un parche coor<strong>de</strong>nado; una función <strong>de</strong> valor vectorialcon dos parámetros (u,v) que recorre lo puntos <strong>de</strong> la superficie a medidaque u y v van barriendo su dominio <strong>de</strong> valores, según vemos en la figura 11.Resulta importante saber cómo realizar cálculos con esta representación.


[ 98 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 11. Superficie Paramétrica.En la figura se ve fácilmente que, al mantener fijo v y hacer variar u,obtenemos una familia <strong>de</strong> curvas (una curva por cada v fijo); y, cambiandolos papeles <strong>de</strong> las dos coor<strong>de</strong>nadas, se obtiene otra familia parametrizadapor u. Se obtiene, pues, una red <strong>de</strong> curvas coor<strong>de</strong>nadas que cubren todo elparche. El vector x(u,v) es una función <strong>de</strong> dos variables. Derivandoparcialmente obtenemos los dos vectores tangentes.x u= ∂ x∂ux v= ∂ x∂vque, junto con el punto x si b 0 = x(u 0, v 0), <strong>de</strong>finen el plano tangente a lasuperficie en x 0. La normal en x 0 se obtiene la forma habitualN = x u × x vy se pue<strong>de</strong> normalizar si es necesario.¿Qué suce<strong>de</strong> con curvas que no son curvas coor<strong>de</strong>nadas? Supongamosque tenemos una curva t(t). en forma paramétrica. Si yace en lasuperficie,tiene que po<strong>de</strong>r escribirsef(t) = x(u(t), v(t))El vector tangente a la curva en cualquier punto viene dado por la<strong>de</strong>rivada:' t= ∂ x∂ u u ' t ∂ x∂v v' t =x uu ' tv ' t


La Matemática <strong>de</strong> los Gráficos 3D [ 99 ]Vemos, pues, que los vectores tangentes x u,x v juegan un papelimportante: generan el espacio <strong>de</strong> todos los vectores tangentes a lasuperficieen x 0; forman, pues, una base <strong>de</strong>l plano tangente. Pero hay más:observemos el rombo sombreado <strong>de</strong> la figura 11. Si ignoramos la curvatura,el rombo es la imagen <strong>de</strong> un rectángulo coor<strong>de</strong>nado <strong>de</strong> área unidad. ¿Cuáles el área <strong>de</strong> este elemento <strong>de</strong> superficie? Conocemos ya muchas formas <strong>de</strong>expresarla. Por ejemplo:Área=∥x u× x v ∥Esta cantidad mi<strong>de</strong> el factor por el cual se multiplica el área al pasar<strong>de</strong>l dominio coor<strong>de</strong>nado (u, v) al plano tangente. Es el jacobiano <strong>de</strong> laaplicación <strong>de</strong>l dominio (u, v) a la superficie.Supongamos, por ejemplo, que tuviésemos una masa distribuida por lasuperficie,dada por la función <strong>de</strong> <strong>de</strong>nsidad m(u,v) en coor<strong>de</strong>nadas (u,v). Lamasa total <strong>de</strong> la superficie sería∫ mu , v∥x u×x v ∥du dvu , v∈ Duna integral doble que nos recuerda que es preciso tomar enconsi<strong>de</strong>ración el factor <strong>de</strong> escala (jacobiano) que el plano coor<strong>de</strong>nadoexperimenta al aplicarse en la superficie.Los jacobianos aparecen don<strong>de</strong>quiera que tenemos transformaciones entreespacios <strong>de</strong> la misma dimensión y queremos calcular medidas (área,volúmenes o longitu<strong>de</strong>s).La longitud <strong>de</strong> arco <strong>de</strong> la curva f(t) pue<strong>de</strong> calcularse como∫∥' t ∥dt=∫∥x u u ' tx v v ' t∥dt=∫ x u ⋅x u u ' 2 2 x u ⋅x v u' v ' x v ⋅x v v ' 2La expresión <strong>de</strong> la raíz es la primera forma fundamental o tensormétricodon<strong>de</strong>I u , v=Eu 2 2F uvGv 2EFF G = x u ⋅x ux u⋅x vx u⋅x vx v⋅x vCon él, po<strong>de</strong>mos realizar medidas en términos <strong>de</strong> coor<strong>de</strong>nadas <strong>de</strong>superficie (u,v). Por ejemplo, longitud <strong>de</strong> arco∫ Eu ' 2 2Fu ' v 'Gv' 2 dt


[ 100 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Do área <strong>de</strong> superficie∫ EG− F 2 dudvDUna vez más, el radical es el jacobiano <strong>de</strong> la aplicación que lleva (u, v) ala superficie intrínseca.Interpolación y apro<strong>xi</strong>maciónEstos dos problemas aparecen frecuentemente en mo<strong>de</strong>lado geométrico.Fórmula <strong>de</strong> interpolación <strong>de</strong> LagrangeNos dan n + 1 puntos en el espacio P0, P1, ¼, Pn (representadosusualmente como valores <strong>de</strong> una función real, ver figura ??). Precisamosencontrar una función p cuyo grafo incida sobre todos los puntos dados.Este es un problema <strong>de</strong> interpolación. El caballo <strong>de</strong> batalla en la solución<strong>de</strong> este teorema se conoce como la fórmula <strong>de</strong> interpolación <strong>de</strong> Lagrange.Teorema (Interpolación <strong>de</strong> Lagrange): Sean n + 1 puntos <strong>de</strong>l planoXY, P 0 = (x 0, y 0), P 1 = (x 1, y 1), P 2 = (x 2, y 2),..., P n = (x n, y n), todos condiferentes abscisas. Entonces, e<strong>xi</strong>ste un y sólo un polinomio p <strong>de</strong> grado nque cumplap(x i) = y i para i = 0, 1,..., nEl polinomio <strong>de</strong> interpolación <strong>de</strong> Lagrange pue<strong>de</strong> calcularse <strong>de</strong> muchasformas, una <strong>de</strong> las cuales es la fórmula explícitanP x=∑i=0y k kx kk kdon<strong>de</strong> los factores w son polinomios <strong>de</strong> grado n dados por k x= x− x 0 x− x 1 x− x n x− x k(6)


La Matemática <strong>de</strong> los Gráficos 3D [ 101 ]Es obvio queFigura 12. Interpolación y apro<strong>xi</strong>mación <strong>de</strong> valores puntuales. k x kk k = 1si i=k{ 0si i≠k}porque ningún par <strong>de</strong> abscisas coinci<strong>de</strong>. Y esto resuelve nuestro problema.La fórmula 6, no obstante, no es muy útil en los cálculos. Los coeficientes<strong>de</strong>l polinomio <strong>de</strong> interpolación se encuentran mejor resolviendo unsistema <strong>de</strong> ecuaciones lineales, o mediante un uso inteligente <strong>de</strong> la simetríao la elección hábil <strong>de</strong> los puntos <strong>de</strong> muestra (x i, y i).


[ 102 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DUn ejemplo: queremos encontrar un polinomio cuadrático que interpolelos puntos ( - h, y -1), (0, y 0) y (h, y 1). En lugar <strong>de</strong> pasar por el calvario <strong>de</strong> laecuación ??, recor<strong>de</strong>mos que el proceso <strong>de</strong> interpolación es lineal eimaginemos qué pasaría si tuviésemos los conjuntos <strong>de</strong> valoresy -1 = 1 y 0 = 0 y 1 = 0y -1 = 0 y 0 = 1 y 1 = 0y -1 = 1 y 0 = 0 y 1 = 1En el último caso, buscamos una función cuadrática con ceros en - h y en 0,<strong>de</strong> manera que tiene que serq 1(x) = Cx(x + h)con C escogido para que q 1(-1) = 1, <strong>de</strong> modo que C = 1/(1 - h). Porsimetría, la primera función q -1 será la refle<strong>xi</strong>ón especular <strong>de</strong> ésta, es <strong>de</strong>cir,q -1 = 1/(1 - h) x(h – x)Y q 0 será una función par por su simetría, con ceros en - 1, 1, <strong>de</strong> modoque será igual a (1 – x²) salvo por un factor constante que la normalicepara que valga 1 en el origen. ¡Oh!, el factor resulta ser la unidad, <strong>de</strong> modoquexxh q x=y − 11− hy 1− xh− x0 x2 y 11− h<strong>de</strong> forma mucho menos agónica que pasar por la ecuación 6.Ajuste por mínimos cuadradosOtro problema distinto es el <strong>de</strong> apro<strong>xi</strong>mación: obtener una curva quepase cerca <strong>de</strong> los puntos dados, en algún sentido establecido. Se trata <strong>de</strong> unproblema vasto y difícil. Los criterios <strong>de</strong> cercanía varían mucho según lasaplicaciones, y aquí vamos a apro<strong>xi</strong>marnos sólo cuadráticamente (conperdón).Nos referiremos tan sólo a la forma más primitiva, humil<strong>de</strong> y, sin embargo,útil <strong>de</strong> apro<strong>xi</strong>mación: el ajuste por mínimos cuadrados. Una aplicacióncorriente <strong>de</strong> esta técnica es la solución <strong>de</strong> un problema <strong>de</strong> interpolaciónsobre<strong>de</strong>terminado, en el que tenemos más ecuaciones que incógnitas.Supongamos, por ejemplo, que nos dan una serie <strong>de</strong> puntosPi = (<strong>xi</strong>, yi)con i = 1... n, y sea n > 4. Nos obligan a apro<strong>xi</strong>mar a ellos una curva que


La Matemática <strong>de</strong> los Gráficos 3D [ 103 ]tiene que <strong>de</strong>finirse por un polinomio cúbico p(x) = ax³ + bx² + cx + d. Asíque tratamos <strong>de</strong> hacer mínimonE a ,b , c ,d =∑ y i− ax 3 i− bx 2 i− cx i− d 2i =1Esto es, como má<strong>xi</strong>mo,una función cuadrática <strong>de</strong> los parámetrosin<strong>de</strong>terminados que constituyen los coeficientes a, b, c, d. Para minimizar,obligamos a que las <strong>de</strong>rivadas parciales <strong>de</strong> E respecto a ellos sean nulas:n∂ E∂ a =− 2 ∑ x 3 iy i− ax 3 i− bx 2 i− cx i− d =0i=1n∂ E∂ b =− 2 ∑ x 2 i y i− ax 3 i− bx 2 i−cx i− d =0i=1n∂ E∂c =− 2 ∑ x iy i− ax 3 i− bx 2 i−cx i− d =0i=1n∂ E∂d =− 2 ∑i=1 y i− ax i 3 − bx i 2 −cx i− d =0Desarrollando y <strong>de</strong>spejando los coeficientes a, b, c, d, nos queda unsistema∑ x i 3 y i=a∑ x i 6 b∑ x i 5 c∑ x i 4 d∑ x i3∑ x i 2 y i=a∑ x i 5 b∑ x i 4 c∑ x i 3 d∑ x i2∑ x iy i=a∑ x i 4 b∑ x i 3 c∑ x i 2 d∑ x i∑ y i=a∑ x i 3 b∑ x i 2 c∑ x idno, si lo preferimos así∑6x i5um x i4∑ x ium x i35∑ x i4∑ x i3∑ x i2∑ x i4 3∑ x i ∑ x i⋅a i3 2∑ x i ∑ x i b2∑ x i ∑ x ic∑ x ind=x 3 y ix 2 iy ix iy iy iLos coeficientes a,b,c,d pue<strong>de</strong>n hallarse finalmente resolviendo laexpresión anterior.


[ 104 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DMo<strong>de</strong>lado <strong>de</strong> curvas y superficies: splinesNos dan n + 1 puntos P 0, P 1,... , P n, y <strong>de</strong>searíamos construir una curvaque pase por ellos con la menor contorsión posible. Se trata <strong>de</strong> unproblema <strong>de</strong> interpolación. En otras ocasiones, los puntos dados sonsimplemente puntos <strong>de</strong> control, y queremos que la curva pase cerca <strong>de</strong> lospuntos, o toque algunos <strong>de</strong> ellos mientras que solamente se acerque aotros. Se trata <strong>de</strong> un problema <strong>de</strong> apro<strong>xi</strong>mación.En gráficos por computador, normalmente resolvemos estos problemasusando funciones enlatadas (¿precocinadas?) con juegos <strong>de</strong>finidos <strong>de</strong>parámetros que es preciso calcular para que la curva cumpla nuestrosrequisitos. Hay una serie larga <strong>de</strong> opciones a nuestra disposición:●●●●●Splines naturalesInterpolantes <strong>de</strong> HermiteCurvas <strong>de</strong> BézierB-splinesNURBSSplines naturalesUn primer enfoque es intentar interpolar por segmentos. El segmento<strong>de</strong> curva que va <strong>de</strong> P i a P i+1 será una función p i(t) con t recorriendo elintervalo (0, 1). Las condiciones a imponer son cuatrop i(0) = P ip i(1) = P i+1p' i(1) = p' i+1(0)p'' i(1) = p'' i+1(0)porque cada p i es un polinomio cúbico. Las dos últimas i<strong>de</strong>ntida<strong>de</strong>sson condiciones <strong>de</strong> regularidad, para que la curvatura no tenga «saltos».El inconveniente <strong>de</strong> este enfoque es que cada uno <strong>de</strong> los puntos <strong>de</strong> controlafecta a todos los segmentos, obligando a recalcular todo si cambiamos unsimple punto. Y ello implica la resolución <strong>de</strong> un sistema <strong>de</strong> ecuaciones paracada tramo.


La Matemática <strong>de</strong> los Gráficos 3D [ 105 ]Interpolantes <strong>de</strong> HermiteUna solución similar es la interpolación <strong>de</strong> Hermite, en que prescribimoslas <strong>de</strong>rivadas (tangentes) en los extremos <strong>de</strong> cada intervalo.p i(0) = P ip i(1) = P i+1p i(0) = T ip i(1) = T i+1Esto obliga a especificar las tangentes Ti en los puntos <strong>de</strong> control, loque no es siempre posible ni cómodo. La regularidad que se alcanza esmenor que con splines naturales; es el precio que hay que pagar por tenercontrol local.Curvas <strong>de</strong> BézierEsta solución se basa en los llamados polinomios <strong>de</strong> Bernstein, unafamilia <strong>de</strong> polinomios en el intervalo (0, 1) con propieda<strong>de</strong>s muyinteresantes <strong>de</strong> apro<strong>xi</strong>mación uniforme. Dada una función P(u) con u Î (0,1), su n-ésimo polinomio <strong>de</strong> Bernstein B n(P, u) viene dado por la fórmulanB nP , u=∑ P k/nt k 1−t n− kk= 0Si nos dan n + 1 puntos <strong>de</strong> control, dibujamos la curva <strong>de</strong> Bézierasociada a ellos usando la expresión paramétricanB nu=∑ Pk=0k n k t k 1− t n− k0≤u≤1Como <strong>de</strong> costumbre en interpolación y apro<strong>xi</strong>mación, las funciones <strong>de</strong>peso <strong>de</strong> Bézier constituyen una partición <strong>de</strong> la unidadn∑ Pk=0k n k t k 1−t n− k =1lo que, con su positividad,hace que el proceso sea convexo:la curva <strong>de</strong>Bézier yace <strong>de</strong>ntro <strong>de</strong>l cierre convexo <strong>de</strong> los puntos <strong>de</strong> control. En la figura13 pue<strong>de</strong>n verse gráficas <strong>de</strong> algunas funciones base <strong>de</strong> Bézier.


[ 106 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 13. Base <strong>de</strong> Bézier para n=3 y n=7.En la aplicación más corriente, las curvas <strong>de</strong> Bézier aparecen comoparches con cuatro puntos <strong>de</strong> control. Es un ejercicio sencillo (¡hágase!)comprobar que P 0P 1 y P 2P 3 <strong>de</strong>terminan la tangente (la velocidad, <strong>de</strong> hecho)en los extremos,y que la curva pasa por los puntos <strong>de</strong> control finalesP 0 y P 3,como se ve en la figura 15.B-splinesUn problema <strong>de</strong> las técnicas usuales <strong>de</strong> interpolación es que la curvacompleta <strong>de</strong>pen<strong>de</strong> <strong>de</strong> cada punto <strong>de</strong> control; el cambio <strong>de</strong> uno <strong>de</strong> ellosobliga a calcular <strong>de</strong> nuevo (y dibujar también) toda la solución.


La Matemática <strong>de</strong> los Gráficos 3D [ 107 ]Los B-splines son un conjunto especial <strong>de</strong> interpolantes carentes <strong>de</strong> esa<strong>de</strong>ficiencia. Supongamos que tenemos n + 1 puntos <strong>de</strong> control P 0, P 1, ... , P n.La curva solución seránPu =∑ P kB k , du k=0don<strong>de</strong> las funciones B k,d son B–splines <strong>de</strong> or<strong>de</strong>n d cuyo dominio <strong>de</strong><strong>de</strong>finición y propieda<strong>de</strong>s vamos a <strong>de</strong>finira continuación.Las funciones B k,d se construirán en el intervalo umin, umax divididoen n + d subintervalos por puntos llamados nodos, <strong>de</strong> modo que{u min=u 0,u 1,u ,,u k d=u max }será el dominio <strong>de</strong> B k,d . Cada una <strong>de</strong> estas funciones será nula exceptoen (u k, u k+d ) (lo que abarca d subintervalos <strong>de</strong>l dominio), don<strong>de</strong> coincidirácon un polinomio <strong>de</strong> grado d - 1 con valores positivos. Se <strong>de</strong>duce, entonces,que cada valor P(u) será influido por d puntos <strong>de</strong> control. ¿Cómo seconstruyen estas funciones mágicas? Por la fórmula <strong>de</strong> recursión <strong>de</strong> Cox-DeBoor:1 si u k≤u0 en otro caso}B k ,1={B k ,d=u−u kB k , d−1 u −u kdB k1, d− 1u kd−1− u ku kd−u k1A pesar <strong>de</strong> su apariencia imponente, la recurrencia es bastante sencilla<strong>de</strong> aplicar. Po<strong>de</strong>mos ver qué sale <strong>de</strong> ella en la figura 14. Hemos escogido unconjunto <strong>de</strong> nodos {0, 2, 3, 6, 7, 8, 11, 13} y construido a mano (bueno,casi) los B–splines <strong>de</strong> ese conjunto <strong>de</strong> nodos, hasta el cuarto or<strong>de</strong>n (es<strong>de</strong>cir, hasta los polinomios cúbicos). En las gráficas, las propieda<strong>de</strong>s <strong>de</strong> losB–splines son bastante evi<strong>de</strong>ntes.En la subfigura (e) se verifica otra propiedad interesante: los B–splines <strong>de</strong>un grado fijo cualquiera proporcionan una partición <strong>de</strong> la unidad, es <strong>de</strong>cir,son funciones positivas <strong>de</strong> suma unidad en todo punto. Esta propiedad escrucial, haciendo el proceso <strong>de</strong> interpolación convexo. En la figura 16vemos la curva B-spline <strong>de</strong> grado tres con puntos <strong>de</strong> controlP0 = (0, 0) P1 = (1, 1)P2 = (0, 2) P3 = (1, 3)P4 = (0, 4)


[ 108 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 14. Gráficas <strong>de</strong> las funciones <strong>de</strong> base B-Spline para el conjunto <strong>de</strong>nodos {0,2,3,6,7,8,11,13}. En la gráfica inferior (Suma <strong>de</strong> los anteriores),se verifica la propiedad <strong>de</strong> partición <strong>de</strong> la unidad.Esta vez, hemos escogido nodos uniformemente espaciados. Po<strong>de</strong>mosobservar que la curva está contenida en el cierre convexo <strong>de</strong> los puntos <strong>de</strong>control, lo que es una consecuencia <strong>de</strong> la positividad <strong>de</strong> la base <strong>de</strong> B-splines, y <strong>de</strong> que su suma es la unidad.


La Matemática <strong>de</strong> los Gráficos 3D [ 109 ]Figura 15. Curva <strong>de</strong> Bézier ajustada a los puntos <strong>de</strong> control extremos y contangentes que apuntan a los puntos <strong>de</strong> control intermedios.NURBSLos B–splines pue<strong>de</strong>n aplicarse sin cambios si trabajamos concoor<strong>de</strong>nadas proyectivas, y obtenemos así NURBS (siglas <strong>de</strong> Non–UniformRational B–Splines). La fórmula resultantePu =n∑k =0n∑k=0P kw kB k , duw kB k , duen que el <strong>de</strong>nominador pue<strong>de</strong> tomarse como la componentehomogénea <strong>de</strong> los puntos <strong>de</strong> control en coor<strong>de</strong>nadas proyectivas, incorporatambién factores <strong>de</strong> peso w k, lo que tiene como consecuencia que lasfunciones <strong>de</strong> base son ahora funciones racionales <strong>de</strong>l parámetro.La ventaja principal <strong>de</strong> esto es su invariancia proyectiva: un B-spline noracional, transformado por una proyección, <strong>de</strong>ja <strong>de</strong> ser normalmente unB–spline. Dicho <strong>de</strong> otro modo, el B-spline <strong>de</strong> los puntos <strong>de</strong> controltransformados no coinci<strong>de</strong> con el transformado <strong>de</strong>l B-spline original. Sinembargo, esa coinci<strong>de</strong>ncia sí se da en los B-splines racionales, <strong>de</strong> formaque para transformarlos basta aplicar la transformación a los puntos <strong>de</strong>control.


[ 110 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 16. Apro<strong>xi</strong>mación a cinco puntos <strong>de</strong> control por B-spline cúbico uniforme.Splines para superficies paramétricasCuando trabajamos con superficies, po<strong>de</strong>mos aplicar las mismastécnicas que con curvas, palabra por palabra. Ahora que tenemos dosparámetros, u, v, precisamos como base el producto tensorial <strong>de</strong> las basesspline en cada uno <strong>de</strong> ellos. Por ejemplo, po<strong>de</strong>mos interpolar un parche <strong>de</strong>superficie a través <strong>de</strong> una red <strong>de</strong> puntos <strong>de</strong> control Pij por medio <strong>de</strong> lafórmula∑ijP ijB i , du B j ,dvLa propiedad <strong>de</strong> partición <strong>de</strong> la unidad sigue siendo válida en la baseproducto. El mismo truco se aplica a parches <strong>de</strong> Bézier o NURBS.


Tu cara me suenaEmilio José Molina Cazorlaej-molina@terra.es ::La luz y el sonido tienen algo así como una relación <strong>de</strong>hermandad. La luz es, valga la redundancia, el hermanoluminoso, el bonito, el que todo el mundo conoce y en elque todos se fijan. Quién más y quién menos ha oído hablar <strong>de</strong>fotones, conos y bastoncillos retinas, colores...Inst... Conceptos básicosFundamentosEl sonido es el hermano malo, el <strong>de</strong>l Lado Oscuro. Nadie se acuerda <strong>de</strong> él...excepto cuando falla. Porque, si la imagen es el físico, el sonido es, <strong>de</strong>s<strong>de</strong>luego, el alma <strong>de</strong> lo audiovisual. Vamos a intentar darlo a conocer durantelas pró<strong>xi</strong>mas líneas.¿Qué es el sonido?Como “hermanos” que son, el sonido y la luz tienen muchas cosas encomún, y otras particulares. Mientras que la luz es una ondaelectromagnética, capaz <strong>de</strong> propagarse en el vacío y excitar mediantefenómenos fotoquímicos los terminales nerviosos <strong>de</strong> nuestras retinas, elsonido es una onda <strong>de</strong> presión, que se propaga mediante procesos <strong>de</strong>compresión-<strong>de</strong>scompresión <strong>de</strong>l medio en el que se encuentra. Para hacerseuna imagen mental, es algo parecido al típico juguete <strong>de</strong> movimientocontinuo (figura 1).Por ello, en el vacío no se propaga al no haber nada (venga, va,quisquillosos: casi nada) que comprimir, y esto tiene dos gravesconsecuencias:●●Todas las películas <strong>de</strong> batallas espaciales son un gran embuste.En el espacio, nadie pue<strong>de</strong> oír tus gritos.[ 111 ]


[ 112 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 1. Típico juguete <strong>de</strong> movimiento continuo.Velocidad <strong>de</strong>l sonido, Refracción, Refle<strong>xi</strong>ón,InterferenciasSin embargo, comparte con la luz el que su velocidad cambie según elmedio que atraviesa, y los fenómenos <strong>de</strong> refracción, refle<strong>xi</strong>ón einterferencias. En medios poco <strong>de</strong>nsos (por ejemplo, el caucho), suvelocidad <strong>de</strong> transmisión será menor que en otros más <strong>de</strong>nsos (porejemplo, el acero).La velocidad <strong>de</strong> la luz (casi 300.000 Km/s en el vacío) es inmensamentemás alta que la <strong>de</strong>l sonido (340 m/s en el aire a 20ºC). Veremos aquelloque provoca un sonido antes <strong>de</strong> escuchar el sonido que ha provocado.Primero vemos el relámpago y luego escuchamos el trueno. Esto tienealguna implicación en la creación <strong>de</strong> animaciones, sobre todo en lo querespecta al lipsync o sincronización labial: si colocamos la voz <strong>de</strong>lpersonaje a la vez que el movimiento labial, nuestro cerebro se quejará. Sinembargo, si lo <strong>de</strong>splazamos un par <strong>de</strong> frames más tar<strong>de</strong>, se verá (yescuchará) <strong>de</strong> forma mucho más natural.El fenómeno <strong>de</strong> refracción es fácilmente perceptible cuando estamosbuceando. Las voces que vienen <strong>de</strong> fuera (las que vienen <strong>de</strong> <strong>de</strong>ntro son otroproblema que ha <strong>de</strong> ser tratado con medicación) se escuchandistorsionadas por el cambio <strong>de</strong> velocidad y <strong>de</strong> dirección <strong>de</strong> la onda.


Tu cara me suena [ 113 ]Figura 2. Onda típica.La refle<strong>xi</strong>ón, nos es mucho más familiar. Tiene mucho que ver con loscoeficientes <strong>de</strong> absorción <strong>de</strong> los materiales, y vulgarmente lo conocemoscomo eco (más a<strong>de</strong>lante entraremos en <strong>de</strong>talle sobre este aspecto). Elreflejo no siempre es idéntico a la onda original; al igual que los objetosreflejan todas las frecuencias <strong>de</strong> la luz, excepto las que absorben (dandolugar a la percepción <strong>de</strong> los colores), también absorben más ciertasfrecuencias <strong>de</strong> sonido, provocando efectos curiosos como el <strong>de</strong> la “carencia<strong>de</strong> eco” <strong>de</strong>l pato, que en realidad no es más que el producto <strong>de</strong> la absorción<strong>de</strong> ciertas frecuencias, reflejando sólo una porción no audible para el oídohumano.A menos que seáis constructores <strong>de</strong> auditorios y teatros, o queráis buscar lalocalización idónea <strong>de</strong> vuestro flamante nuevo equipo <strong>de</strong> Home Cinema, noes necesario que os preocupéis <strong>de</strong> este asunto.El sonido es una onda y, como tal, sufre fenómenos <strong>de</strong> interferencias. Lossonidos cuyas crestas están en la misma fase, incrementan su intensidad.Los que están en fases contrarias, se atenúan. El primer caso es muyimportante <strong>de</strong> cara al audio digital, don<strong>de</strong> los sonidos fácilmente “saturan”el tope <strong>de</strong> sensibilidad <strong>de</strong> los micrófonos, provocando un resultado“cascado”. El segundo es interesante <strong>de</strong> cara a aplicaciones experimentales<strong>de</strong> reducción <strong>de</strong> ruido en lugares cercanos a sitios con alta contaminaciónacústica, ya que programas en tiempo real producen ondascomplementarias que contribuyen a disminuir localmente dicho ruido,cancelando las fases <strong>de</strong>l sonido. También se utiliza en la reducción <strong>de</strong> ruidoen el post-procesado <strong>de</strong> audio.


[ 114 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DTono, Timbre, IntensidadHemos hablado <strong>de</strong> crestas <strong>de</strong> ondas. Veamos una imagen <strong>de</strong> una ondatípica (figura 2).Una imagen está compuesta <strong>de</strong> diferentes colores con distinta saturaciónque dibujan formas. Una onda tiene una frecuencia fundamental (inversa asu longitud <strong>de</strong> onda), más o menos amplias y con unas <strong>de</strong>terminadasfrecuencias secundarias.El tono es la altura <strong>de</strong>l sonido. Cuanto menor sea su frecuencia (y portanto, más amplia su longitud <strong>de</strong> onda), más grave será la nota. Al igualque en la luz sólo llegamos a captar frecuencias hasta un nivel <strong>de</strong> rojos (porencima <strong>de</strong> los infrarrojos), empezamos a captar sonidos a partir <strong>de</strong> los20Hz (un herzio es un ciclo por segundo). Los tonos medios correspon<strong>de</strong>na frecuencias <strong>de</strong> unos 300 a 5000Hz (5KHz), y los agudos alcanzan hastalos 20KHz, que sería el límite <strong>de</strong> la audición humana (en la luz equivaldríaal límite entre violeta y ultravioleta).El timbre es la “forma” <strong>de</strong> la onda, sus frecuencias secundarias, y es lo quenuestro cerebro utiliza para distinguir la voz <strong>de</strong> Darth Va<strong>de</strong>r <strong>de</strong> la <strong>de</strong>nuestra madre. Bueno, <strong>de</strong>pendiendo <strong>de</strong> lo mucho que fume. O un piano, unviolín o un oboe (por poner un ejemplo más clásico, suponiendo que esténtocando ese tipo <strong>de</strong> música) <strong>de</strong> una taladradora (según la pericia <strong>de</strong>lpracticante, la diferencia pue<strong>de</strong> radicar en el sutil vibrato <strong>de</strong> lataladradora).Po<strong>de</strong>mos ver un ejemplo <strong>de</strong> las diferencias entre una nota <strong>de</strong> un piano, unviolín, un oboe y un taladro en la Figura 3.Figura 3. Diferencias entre una nota <strong>de</strong> un piano, un violín, un oboe y un taladro.


Tu cara me suena [ 115 ]Figura 4. Envolvente <strong>de</strong> una onda.También es muy importante la forma general <strong>de</strong> la onda (llamadaenvolvente), que también utiliza intensivamente nuestro cerebro paracatalogar qué tipo <strong>de</strong> sonido estamos procesando (percusión, voz humana,instrumentos <strong>de</strong> viento...).La intensidad <strong>de</strong> la onda tiene relación con la amplitud <strong>de</strong> dicha onda, y setraduce en el volumen con el que percibimos un sonido. Recor<strong>de</strong>mos que elsonido es una onda <strong>de</strong> presión (y como tal, se podría medir en pascales).Sin embargo, el convenio general para medir el sonido es el <strong>de</strong> la relación<strong>de</strong> la intensidad <strong>de</strong>l mismo con respecto a la intensidad <strong>de</strong> un ruido base, ysu unidad son los <strong>de</strong>ciBelios. Al igual que los terremotos, sigue una escalalogarítmica, don<strong>de</strong> cada grado superior implica multiplicar la potencia. Enla Figura 5 po<strong>de</strong>mos ver las distintas intensida<strong>de</strong>s, en <strong>de</strong>cibelios, <strong>de</strong> variasfuentes <strong>de</strong> sonido distintas.Psicobiología <strong>de</strong> la percepción acústicaEn realidad ya hemos empezado a hablar <strong>de</strong> percepciones, <strong>de</strong> lo que elcerebro interpreta o <strong>de</strong>ja <strong>de</strong> interpretar. Sigamos, pues, con ello.Antes hablábamos <strong>de</strong>l fenómeno <strong>de</strong> la refle<strong>xi</strong>ón, y <strong>de</strong>cíamos que se conocíacomo eco. En realidad, el eco no es más que una refle<strong>xi</strong>ón que tarda más <strong>de</strong>50 milisegundos en llegar a nuestros oídos a partir <strong>de</strong> la fuente original. Amenores tiempos, el cerebro no lo entien<strong>de</strong> como dos ondas diferentes,


[ 116 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Dsino como una reverberación <strong>de</strong> la misma onda, una “cola residual” que, aefectos psicológicos, dota <strong>de</strong> cali<strong>de</strong>z, profundidad e intensidad a un sonido(sólo hay que pensar en el estudiadísimo efecto <strong>de</strong> reverberación <strong>de</strong> lascatedrales y los órganos, o en el leve eco que se suele <strong>de</strong>jar en las baladas).De la misma forma, la “iluminación global” o secundaria, proporcionamayor cali<strong>de</strong>z y “organicidad” a las imágenes que hacen uso <strong>de</strong> ella, le damucha más riqueza.En el mundo sonoro, por tanto, hay que tener muy en cuenta cuál va a serla reverberación final para conocer el impacto que un sonido tendrá sobreel público. Los estudios <strong>de</strong> grabación, las salas <strong>de</strong> cine, y por supuesto losauditorios y teatros han <strong>de</strong> estudiar a fondo los materiales y su disposiciónpara incrementar o menguar los efectos <strong>de</strong> reverberación.En la Figura 6 po<strong>de</strong>mos ver gráficamente cómo Jandro (¡el creador <strong>de</strong>YafRay!) recibe un haz <strong>de</strong> ondas sonoras.Figura 5. Fuentes <strong>de</strong> sonido y sus intensida<strong>de</strong>s.


Tu cara me suena [ 117 ]Figura 6. Jandro recibe un haz <strong>de</strong> ondas sonoras.La resonancia es la vibración “simpática” que se da en algunos objetoscuando la frecuencia fundamental <strong>de</strong> una onda que suena cerca es múltiplo(también llamado armónico) <strong>de</strong> su propia frecuencia <strong>de</strong> sonido. Porejemplo, ciertas notas tocadas por instrumento <strong>de</strong> viento son capaces <strong>de</strong>hacer vibrar las cuerdas <strong>de</strong> una guitarra, si sus notas son las mismas ofrecuencias múltiplos (octavas superiores). O las cuerdas <strong>de</strong>l interior <strong>de</strong> unpiano, cuando se toca una nota (ejercicio práctico: tocar fuerte una nota y,tras soltarla, pulsar el pedal <strong>de</strong> “sostenido” enseguida; las cuerdas,distensadas, vibrarán cada cual según su resonancia con la nota quehubiéramos pulsado). También nuestras cuerdas vocales tienen resonanciacon nuestra propia voz, lo que produce frecuencias secundarias,armónicos, que le dan su timbre característico.Estéreo, Surround, Efecto DopplerTenemos percepción <strong>de</strong> profundidad en la visión gracias a poseer unpar <strong>de</strong> ojos (a menos que seas alguna especie <strong>de</strong> tipo raro con cascoespacial y no distingas a tu suegra <strong>de</strong> un piano <strong>de</strong> cola). Esta estereoscopiapermite a nuestro cerebro calcular la profundidad <strong>de</strong> un objeto a partir <strong>de</strong>las pequeñas diferencias <strong>de</strong> ángulo <strong>de</strong> la imagen recibida por cada ojoindividual. Con los oídos pasa tres cuartos <strong>de</strong> lo mismo: <strong>de</strong>pendiendo <strong>de</strong> suposición, una onda sonora llegará antes a un oído que a otro.


[ 118 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DSi la fuente está más cerca <strong>de</strong> nuestro oído izquierdo, llegará antes hastaéste, atravesará el cráneo y estimulará más tar<strong>de</strong> el oído <strong>de</strong>recho.Por la forma <strong>de</strong> nuestro pabellón auditivo, también escucharemos mejorlos sonidos que provengan <strong>de</strong> nuestro frente que <strong>de</strong> nuestra espalda.Con ambos factores, somos capaces <strong>de</strong> <strong>de</strong>scubrir con bastante precisión lalocalización y lejanía <strong>de</strong> una fuente sonora a partir <strong>de</strong> las pequeñasdiferencias <strong>de</strong> tiempo e intensidad.Con una situación a<strong>de</strong>cuada <strong>de</strong> fuentes sonoras, po<strong>de</strong>mos conseguir unefecto envolvente (surround), sobre todo si contamos con un altavozespecial para bajos (subwoofer), ya que los altavoces convencionalesapenas son capaces <strong>de</strong> reproducir ciertas frecuencias muy graves.El efecto Doppler, al igual que se aplica a la luz para <strong>de</strong>scubrir si un emisorse aleja -tien<strong>de</strong> al rojo- o se acerca -tien<strong>de</strong> al azul- al observador, muestrael mismo comportamiento en el sonido (al fin y al cabo, en ambos casoshablamos <strong>de</strong> frecuencias <strong>de</strong> ondas que se acercan o se alejan). Cuando unsonido se aleja, tien<strong>de</strong> a escucharse más grave (sus ondas nos llegan“alargadas”), mientras que si se acerca, se escucha más aguda (sus ondasnos llegan “comprimida”). Este efecto nos resulta muy familiar; todosreconocemos el sonido <strong>de</strong> una ambulancia acercándose y alejándose.Zonas <strong>de</strong> percepciónNi escuchamos las mismas frecuencias por igual, ni todos tenemos losmismos límites <strong>de</strong> audición. Las razones: milenios <strong>de</strong> evolución.Como <strong>de</strong>cía Jack, vayamos por partes. Literalmente. En la Figura 7,po<strong>de</strong>mos ver el sistema auditivo con una serie <strong>de</strong> partes <strong>de</strong>talladas.Recapitulemos: los sonidos son variaciones <strong>de</strong> presión que se transmitenpor un medio no vacío. En el caso humano, este medio suele ser aire. Lasondas son recogidas y concentradas por el pabellón auditivo, que lasconduce hasta el tímpano. El tímpano no es más que una membrana (comola <strong>de</strong> un tambor) que transmite esta vibración a los huesecillos <strong>de</strong>l oído(martillo, yunque y estribo), que a su vez los transmite (ya con muchamenos fuerza) al oído interno (canales semicirculares y caracol). El oídointerno se encarga, aparte <strong>de</strong>l importante tema <strong>de</strong> escuchar, <strong>de</strong>l no menosimportante tema <strong>de</strong> conservar el equilibrio, estático o dinámico (tambiénse encarga <strong>de</strong> averiguar si nos estamos moviendo). Una vez en el caracol, elsonido que ha sido transmitido por el estribo hace vibrar el líquido que locontiene. Gracias a su forma en espiral estrechada, cada sección <strong>de</strong>l caracoltiene resonancia con unas <strong>de</strong>terminadas frecuencias. Des<strong>de</strong> los sonidosgraves en la ancha base (a partir <strong>de</strong> 20 Hz) hasta los más agudos en lapunta final (20 Khz). Los enlaces nerviosos <strong>de</strong> la zona se encargan <strong>de</strong>


Tu cara me suena [ 119 ]transducir la energía mecánica <strong>de</strong> la vibración a energía eléctrica, quemandan seguidamente a través <strong>de</strong>l nervio auditivo.Como po<strong>de</strong>mos ver en la gráfica <strong>de</strong> respuesta a las frecuencias según laintensidad <strong>de</strong> la Figura 8, tenemos un muy buen procesamiento <strong>de</strong>frecuencias medias (ya que es ahí don<strong>de</strong> se centran los sonidos que laNaturaleza consi<strong>de</strong>ra más interesantes para nuestra supervivencia: untigre rugiendo, una suegra acercándose...). No po<strong>de</strong>mos escuchar ni lasfrecuencias muy bajas ni las muy altas, a menos que suenen a una<strong>de</strong>terminada intensidad.Figura 7. Sistema auditivo.


[ 120 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 8. Respuesta frecuencial.Si la intensidad es muy elevada, corremos el riesgo <strong>de</strong> romper lamembrana timpánica, aunque po<strong>de</strong>mos soportar mejor la intensidad en ciertasfrecuencias, precisamente por la menor respuesta que tenemos ante lasfrecuencias graves y agudas.A<strong>de</strong>más <strong>de</strong> esto, la pérdida <strong>de</strong> audición por la edad también es diferente enhombres y mujeres, siendo mucho más acusada en los hombres. Algunossugieren que es por escuchar continuadamente los gritos <strong>de</strong> dichas mujeres.Nunca lo sabremos con certeza.Algún día, todo será digitalAlgún día, todo será digital. Por ahora, el audio ya lo es. Con las tecnologías <strong>de</strong>reducción <strong>de</strong> ruido como Dolby, la calidad <strong>de</strong>l audio digital es, simplemente,perfecta.La captura <strong>de</strong> sonido se realiza mediante micrófonos, que pue<strong>de</strong>n ser <strong>de</strong> variostipos según la direccionalidad <strong>de</strong>l sonido que capturan (omnidireccionales,bidireccionales, unidireccionales o cardiodies...) o el método que utilizan paraconvertir el sonido <strong>de</strong> presión a electricidad (principalmente, dinámicos y <strong>de</strong>con<strong>de</strong>nsador). Las diferencias son principalmente <strong>de</strong> cantidad <strong>de</strong> sonidocaptado y <strong>de</strong> capacidad <strong>de</strong> soportar fuertes intensida<strong>de</strong>s sin que el sonido“sature” y “se rompa”, lo cual suele ser inverso al rango <strong>de</strong> matices que son


Tu cara me suena [ 121 ]capaces <strong>de</strong> captar. Dicho <strong>de</strong> otra forma, las sutiles variaciones <strong>de</strong> potencial <strong>de</strong>la corriente eléctrica necesarias para recoger con gran precisión cierto tipo <strong>de</strong>sonidos, pue<strong>de</strong>n provocar que, ante sonidos intensos, el voltaje se dispare almá<strong>xi</strong>mo, <strong>de</strong>strozando así la forma <strong>de</strong> onda y convirtiendo toda la informaciónque llevaba ese sonido en un molesto ruido.Cuando el sonido llega a la tarjeta <strong>de</strong> í<strong>de</strong>m, ésta muestrea la señal eléctrica Xveces por segundo (frecuencia <strong>de</strong> muestreo), adjudicando a cada valor <strong>de</strong>entrada un <strong>de</strong>terminado valor Y <strong>de</strong> salida <strong>de</strong>ntro <strong>de</strong> un rango <strong>de</strong> bits(resolución). Dicho <strong>de</strong> otro modo, volviendo a las analogías con la imagen, lafrecuencia <strong>de</strong> muestreo sería el tamaño en píxeles <strong>de</strong> la imagen, y la resoluciónsería la profundidad <strong>de</strong> colores <strong>de</strong> la misma. Cuanta más resolución, mayornúmero <strong>de</strong> grados intermedios <strong>de</strong> intensidad tendrá la onda. Cuanta mayor seala frecuencia <strong>de</strong> muestreo, más muestras tendremos por segundo. En conjunto,la onda muestreada será más parecida a la analógica real cuanto mayores seanlos valores mencionados.Figura 9. Conversión Analógico-Digital.FormatosDespués <strong>de</strong> esto, nuestra onda original se ha convertido en un chorro <strong>de</strong>números enteros (o incluso reales) en memoria, tantos como canales tuviera elsonido (un canal si es mono, dos si es estéreo, e incluso más para sonidoscuadrafónicos y surround). A la hora <strong>de</strong> guardar esta información en disco,tenemos dos opciones: guardarlas en formato bruto sin compresión (PCM,Pulse Co<strong>de</strong> Modulation) o utilizar alguno <strong>de</strong> los formatos <strong>de</strong> compresión sinpérdida (FLAC) o con pérdida (más populares): MPG-1 Audio Layer 3 (mp3) oVorbis-OGG (ogg). En contra <strong>de</strong> lo que normalmente se piensa, el conocidoformato wav (WAVeform audio format) es sólo un formato “contenedor” (igualque el AVI para ví<strong>de</strong>o); el audio que lleve en su interior pue<strong>de</strong> ir en bruto ocomprimido con cualquiera <strong>de</strong> los métodos e<strong>xi</strong>stentes.En ambos formatos, mp3 y ogg, la compresión se centra en las frecuencias <strong>de</strong>la onda inaudibles para el oído humano (siguiendo un mo<strong>de</strong>lo psicoacústico),utilizando una tasa <strong>de</strong> bits variable (distinta cantidad <strong>de</strong> información porsegundo, según lo que esté sonando).


[ 122 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLas diferencias:Mp3 es un formato patentado por Thompson (por el que cobranimportantes sumas en concepto <strong>de</strong> <strong>de</strong>rechos <strong>de</strong> có<strong>de</strong>cs en reproductores) yutiliza la Transformada Rápida <strong>de</strong> Fourier para codificar el sonido.En cambio, ogg (formato libre) utiliza la Transformada <strong>de</strong> CosenosDiscreta Modificada y se espera que pronto pueda usar Wavelets, una formamucho más sofisticada <strong>de</strong> codificación y análisis, basada en armónicos.La combinación <strong>de</strong> alta calidad y formato libre <strong>de</strong>l ogg está produciendo una<strong>de</strong>bacle <strong>de</strong>l formato mp3, si bien es lenta por la enorme extensión <strong>de</strong> uso <strong>de</strong>lmp3 y el <strong>de</strong>sconocimiento general <strong>de</strong> la e<strong>xi</strong>stencia <strong>de</strong>l ogg.Surfeando en la ondaUna vez tenemos el audio en formato digital, po<strong>de</strong>mos hacer mil virgueríascon él utilizando un programa <strong>de</strong> retoque <strong>de</strong> audio como el programa libreAudacity http://audacity.sourceforge.org. Po<strong>de</strong>mos cambiar la resolucióny el muestreo <strong>de</strong> una onda, pasar <strong>de</strong> estéreo a mono y viceversa, cambiar el“panning” (la posición <strong>de</strong>l sonido en el estéreo), agregar eco o reverberación,invertir los picos <strong>de</strong> la onda, invertir la onda al completo, reducir el ruido,acelerar o <strong>de</strong>celerar la reproducción, variar el tono, modificar su envolvente osu intensidad... Incluso este programa nos ofrece la posibilidad <strong>de</strong> dibujar laonda, ampliando muchísimo el zoom en ella.También po<strong>de</strong>mos generar sonidos digitalmente. Para ello tenemos dosopciones: la síntesis aditiva o la síntesis sustractiva. Al igual que en el colortenemos los mapas aditivos (RGB) y sustractivos (CMYK) según si sumamosluces al negro o restamos tintas al blanco, en el timbre po<strong>de</strong>mos “añadirle alsilencio” distintas frecuencias generadas mediante funciones sinusoidales osimilares, o po<strong>de</strong>mos restarle a una frecuencia dada una serie <strong>de</strong> frecuencias.Conclusión y cierreSegún la Wikipedia, la Teoría M es una <strong>de</strong> las candidatas a convertirse en laTeoría <strong>de</strong>l Todo. Tiene su origen en la Teoría <strong>de</strong> las Cuerdas, según la cualtodas las partículas son en realidad diminutas cuerdas que vibran a ciertafrecuencia, y nosotros vivimos en un universo vibrando a cierta frecuencia.No <strong>de</strong>ja <strong>de</strong> ser poético el pensamiento <strong>de</strong> que, <strong>de</strong>spués <strong>de</strong> todo, nuestroUniverso, con todo lo que contiene, es sólo una increíble sinfonía. Demasiadobonito como para <strong>de</strong>jar <strong>de</strong> lado algo tan cercano a esta realidad.


Visión EstereoscópicaJavier Alonso Albusac JiménezMiguel García Corcherojalbusac@gmail.com · greenbite@gmail.com ::El mecanismo <strong>de</strong> visión <strong>de</strong> los seres humanos es estéreopor naturaleza. Cada uno <strong>de</strong> los ojos obtiene una imagen<strong>de</strong>l escenario en el que nos encontramos (visiónbinocular), con un ángulo ligeramente diferente.Las imágenes adquiridas tendrán bastante contenido visual en común,pero cada una proporcionará información que la otra no tiene, lo que<strong>de</strong>nominamos como disparidad.Fundamentos¿Qué es la visión estereoscópica?Una vez que los ojos han servido como mecanismo <strong>de</strong> captación <strong>de</strong>lmedio, llega el turno <strong>de</strong>l cerebro, que será el encargado <strong>de</strong> procesar lasimágenes. El cerebro analiza las imágenes generando una imagen enestéreo, producto <strong>de</strong> la combinación <strong>de</strong> las similitu<strong>de</strong>s y la <strong>de</strong>tección <strong>de</strong> lasdiferencias, pudiendo <strong>de</strong> esta forma tener la sensación <strong>de</strong> profundidad,lejanía o cercanía <strong>de</strong> los objetos que pertenecen al escenario <strong>de</strong>l mundoreal. Al proceso <strong>de</strong> fusión <strong>de</strong> las imágenes se le conoce como Estereopsis.El procedimiento <strong>de</strong> Estereopsis pue<strong>de</strong> variar en función <strong>de</strong> ladistancia <strong>de</strong> los objetos que estamos observando, cuando los objetos sonlejanos los ejes ópticos <strong>de</strong> los ojos permanecen en paralelo, mientras que si<strong>de</strong> lo contrario se encuentran a una distancia cercana los ejes <strong>de</strong> los ojosconvergen. Se conoce como fusión a la suma <strong>de</strong> alguno <strong>de</strong> los mecanismoscitados anteriormente, más la acomodación y enfoque para vernítidamente los objetos <strong>de</strong>l escenario.La capacidad que tienen las personas para apreciar los <strong>de</strong>talles situados endistintos planos varía con facilidad, esta capacidad está directamenterelacionada a la distancia interocular. Cuanto mayor es la distanciaentre los ojos mayor es la distancia límite a la que se pue<strong>de</strong> seguirapreciando el relieve <strong>de</strong> los objetos. La distancia límite pue<strong>de</strong> varias entre60 y cientos <strong>de</strong> metros entre diferentes personas.[ 123 ]


[ 124 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLa visión estéreo es necesaria en el día a día <strong>de</strong> cualquier ser humano, lautilizamos constantemente, sin ella sería prácticamente imposiblepracticar cualquier <strong>de</strong>porte, introducir una llave en su cerradura oconducir un automóvil entre otras muchas activida<strong>de</strong>s.Cómo imitar la visión estereoscópica humana.Para po<strong>de</strong>r conseguir simular la visión estereoscópica necesitamos <strong>de</strong>algún dispositivo físico que realice las mismas funciones que los ojos yrealicen una captura <strong>de</strong>l entorno, una vez obtenidas las imágenesnecesarias se aplicarán una serie <strong>de</strong> métodos o técnicas para conseguir lasensación <strong>de</strong> espacio (tarea <strong>de</strong> la que se encarga el cerebro).Como dispositivos se suele utilizar una o dos cámaras, tomando un par <strong>de</strong>fotos <strong>de</strong>l entorno y separadas a una distancia similar a la que seencuentran los ojos. Por tanto tendríamos una fotografía similar a la vistatomada por el ojo izquierdo, y otra a la <strong>de</strong>l ojo <strong>de</strong>recho.E<strong>xi</strong>sten diferentes métodos para la obtención <strong>de</strong> imágenes estereoscópicas:Sli<strong>de</strong> BarEn este método tan sólo se utiliza una cámara que se encuentra situadasobre una barra <strong>de</strong> <strong>de</strong>splazamiento graduada, por lo que moviendo lacámara a lo largo <strong>de</strong> la barra podremos obtener imágenes <strong>de</strong>s<strong>de</strong> distintasposiciones similares.Twin CamerasSe dispone <strong>de</strong> dos cámaras situadas en un soporte físico. Lasfotografías son tomadas en el mismo instante <strong>de</strong> tiempo, <strong>de</strong>be e<strong>xi</strong>stir portanto un mecanismo <strong>de</strong> sincronización entre ambas cámaras.Beam splittersEn este caso se dispone <strong>de</strong> una sola cámara SLR(Single Lens ReflexCamera) y un sistema <strong>de</strong> espejos o prismas situados enfrente <strong>de</strong> las lentes<strong>de</strong> la cámara. La colocación correcta <strong>de</strong> los espejos permite obtener laversión <strong>de</strong> la parte <strong>de</strong>recha y la <strong>de</strong> la izquierda.Con la aplicación <strong>de</strong> cualquiera <strong>de</strong> estos métodos llevamos a cabo la tareacorrespondiente a los ojos, la captación <strong>de</strong> las imágenes, queda por tantorealizar el trabajo <strong>de</strong>l cerebro, consiguiendo así un efecto tridimensional.


Visión Estereoscópica [ 125 ]Métodos <strong>de</strong> visualizaciónPo<strong>de</strong>mos clasificarlos en dos clases. Aquellos en los que no es necesarioninguna herramienta o dispositivo para conseguir la unión <strong>de</strong> las dosimágenes, conocido como visión libre, y aquellos en los que sí es necesario.Visión LibreEn la visión libre po<strong>de</strong>mos encontrar dos métodos <strong>de</strong> visualización,visión paralela y visión cruzada.Visión paralelaLos ojos mantienen sus ejes ópticos en paralelo, como si mirásemos alinfinito. El ojo izquierdo mira la imagen izquierda y el <strong>de</strong>recho la imagen<strong>de</strong>recha. Al cabo <strong>de</strong> un tiempo, <strong>de</strong>beríamos ser capaces <strong>de</strong> fusionar las dosimágenes en una única tridimensional. Este método es utilizado en loslibros con estereogramas <strong>de</strong> puntos aleatorios (ojo mágico).Visión cruzadaLas imágenes son cambiadas <strong>de</strong> or<strong>de</strong>n, la imagen izquierda se sitúa enla parte <strong>de</strong>recha, y la <strong>de</strong>recha en la izquierda, Los ejes ópticos también secruzan, el ojo <strong>de</strong>recho mira a la izquierda y el izquierdo a la <strong>de</strong>recho, paraconseguirlo po<strong>de</strong>mos situar uno <strong>de</strong> nuestros <strong>de</strong>dos entro los dos ojos ymirarlo.El método <strong>de</strong> visión paralela suele utilizarse cuando las imágenes noson superiores a 65 milímetros entre sus centros, en el caso contrario,cuando la distancia entre los centros <strong>de</strong> las imágenes supera los 65milímetros (la imagen virtual aparece más pequeña) se utiliza la visióncruzada.Métodos <strong>de</strong> visualización con utilización <strong>de</strong>dispositivosProyecciónEl efecto estéreo se consigue con la utilización <strong>de</strong> un proyector con doslentes, o bien dos proyectores normales encargados <strong>de</strong> mostrar la imagencorrespondiente al ojo izquierdo y la <strong>de</strong>l <strong>de</strong>recho. A cada una <strong>de</strong> las lentesse le aplica un filtro polarizador asegurando así que cada ojo veaúnicamente la imagen que le correspon<strong>de</strong>.


[ 126 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 1. Esquema <strong>de</strong> proyección con luz polarizada.Las imágenes <strong>de</strong>ben ser proyectadas sobre una pantalla <strong>de</strong> aluminiodistinta al color blanco para evitar la <strong>de</strong>spolarización <strong>de</strong> la luz proyectada(ver figura).AnáglifoAl igual que en los métodos anteriores se trata <strong>de</strong> engañar al cerebropara aparentar una sensación tridimensional a partir <strong>de</strong> imágenes planas.Para conseguir que cada ojo se centre únicamente en la imagen que lecorrespon<strong>de</strong> se tiñen las imágenes <strong>de</strong> un <strong>de</strong>terminado color y se utilizanunas gafas apropiadas con filtros <strong>de</strong> colores.Se pue<strong>de</strong>n utilizar varías combinaciones <strong>de</strong> colores, pero la más comúnconsiste en teñir la imagen izquierda <strong>de</strong> color azul y <strong>de</strong> rojo la imagen<strong>de</strong>recha. En la gafas el or<strong>de</strong>n <strong>de</strong> los colores <strong>de</strong> los filtros es inverso, el filtro<strong>de</strong>recho sería azul mientras que el izquierdo sería rojo.Este método es <strong>de</strong> los más económicos pero presenta gran<strong>de</strong>sinconvenientes:●●●Alteración <strong>de</strong> los colores originales.Perdida <strong>de</strong> luminosidad.Cansancio visual <strong>de</strong>spués <strong>de</strong> un tiempo prolongado.


Visión Estereoscópica [ 127 ]Figura 2. Si los filtros polarizadores están alineados (arriba), pue<strong>de</strong>pasar la luz. Si rotamos uno <strong>de</strong> los filtros 90º, cortan la luzen dos ejes, volviéndose totalmente opacos (abajo).PolarizaciónEl sistema es similar a los anáglifos, pero en este caso no se utilizancolores para la separación <strong>de</strong> las imágenes, si no que se utiliza luzpolarizada.Este sistema se pue<strong>de</strong> construir con dos proyectores, dos filtros que secolocan <strong>de</strong>lante <strong>de</strong> cada proyector y unas gafas polarizadas. Cada uno <strong>de</strong>los filtros y cada una <strong>de</strong> las lentes <strong>de</strong> las gafas están polarizadas en unadirección y difieren en 90 grados (ver figura 2).


[ 128 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEste método solventa algunos <strong>de</strong> los inconvenientes que presentaban losanáglifos:●●●Respecta en gran medida los colores <strong>de</strong> la toma original.Disminuye el cansancio visual.Como inconveniente tenemos que e<strong>xi</strong>ste pérdida <strong>de</strong> luminosidadcon respecto a la toma original.AlternativoEn este sistema se utilizan gafas dotadas con obturadores <strong>de</strong> cristallíquido (<strong>de</strong>nominadas LCS, Liquid Crystal Shutter glasses o LCD, LiquidCrystal Display glasses). Las imágenes son presentadas <strong>de</strong> formasecuencial, alternando las imágenes para el ojo izquierdo y para el <strong>de</strong>recho.El parpa<strong>de</strong>o no es perceptible ya que se utiliza una frecuencia alta <strong>de</strong>proyección.Las gafas serán las encargadas <strong>de</strong> cerrar el obturador <strong>de</strong>l ojo <strong>de</strong>rechocuando se proyecten imágenes para el ojo izquierdo y viceversa.Como gran ventaja tienen que la señal sincronizada es enviada a las gafaspor rayos infrarrojos y no necesita <strong>de</strong> ningún cable, pero por contra estasson bastante voluminosas y pesadas.Casco EstereoscópicoHead Mounted Display (HMD). El casco consta <strong>de</strong> dos pantallas, unapara cada ojo. El casco está conectado a un sistema encargado <strong>de</strong> enviar lasimágenes. Es utilizado principalmente en el área <strong>de</strong> Realidad Virtual y enVi<strong>de</strong>ojuegos.Posee algunos inconvenientes:●●●Elevado coste.Voluminosos y pesados.Provocan fatiga visual.Monitores Auto-StereoSe trata <strong>de</strong> unos monitores que aún se encuentran en fase <strong>de</strong>experimentación y <strong>de</strong>sarrollo. Utilizan microlentes situadas <strong>de</strong> formaparalela y vertical sobre la pantalla <strong>de</strong>l monitor, generando la <strong>de</strong>sviación<strong>de</strong> dos o más imágenes. Estos monitores no necesitan el uso <strong>de</strong> ningún tipo<strong>de</strong> gafas para obtener la sensación <strong>de</strong> profundidad.


Visión Estereoscópica [ 129 ]Efecto PulfrichEl llamado Efecto Pulfrich fue <strong>de</strong>scubierto por el médico alemán CarlPulfrich en 1922. La diferencia con respecto a otros sistemas <strong>de</strong>visualización estéreo es la utilización <strong>de</strong> una única imagen 2D animada,esto no resta que puedan obtenerse efectosestereoscópicos muy espectacularesfilmando con una única cámara enmovimiento.Este fenómeno consiste en la observación<strong>de</strong> una imagen en movimiento horizontal,el observador <strong>de</strong>be utilizar un filtro en uno<strong>de</strong> los ojos. La imagen captada por el ojoen el que se encuentra el filtro poseemenor luminosidad que la imagen originalprovocando que llegue al cerebro con unretardo <strong>de</strong> centésimas <strong>de</strong> segundo, elcerebro percibe la imagen con unapequeña diferencia <strong>de</strong> posición horizontalgenerando el efecto estereoscópico.Áreas <strong>de</strong> AplicaciónUna <strong>de</strong> los campos don<strong>de</strong> más se utiliza la visión estereoscópica es en latopografía tomando fotografías aéreas. Para po<strong>de</strong>r llevarla acabocorrectamente, el avión <strong>de</strong>be volar a una altitud constante y realizarfotografías verticales. Suele e<strong>xi</strong>stir gran<strong>de</strong>s distancias entre una fotografíay la siguiente, dando una gran sensación <strong>de</strong> relieve que sin la visiónestereoscópica no se podría apreciar.Como ya habíamos mencionado anteriormente la separación mediainterocular es <strong>de</strong> 65 mm y es la distancia que se suele utilizar para realizarlas fotografías estereoscópicas. Cuando la distancia entre las fotografíastomadas para formar la imagen estereoscópica es bastante elevadahablamos <strong>de</strong> Hiperestereoscopia. Es lo que ocurre en el caso <strong>de</strong> lasfotografías aéreas don<strong>de</strong> se suelen tomar distancias que permitan dar lasensación <strong>de</strong> ver el objeto como si se estuviera a tres metros <strong>de</strong> distancia<strong>de</strong>l mismo.E<strong>xi</strong>ste una fórmula con la que po<strong>de</strong>mos calcular la distancia que <strong>de</strong>bee<strong>xi</strong>stir entre las diferentes tomas, para obtener una imagen estereoscópicadon<strong>de</strong> se pueda apreciar la sensación <strong>de</strong> relieve <strong>de</strong> los objetos a grancalidad.


[ 130 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D●●●●(0,065m/3m) / (d/L)0,065m distancia interocular.3m distancia a la que se quieren observar los objetos en la imagenvirtual.d distancia que queremos calcular.L distancia entre el punto <strong>de</strong>s<strong>de</strong> don<strong>de</strong> se realizan las fotografías ylos objetos que queremos captar en la imagen.Despejando d, tenemos que d= 0,021667 x L, apro<strong>xi</strong>madamente d =(1/50) x L, por tanto si el avión estuviera tomando imágenes a unadistancia <strong>de</strong> 6 km el intervalo <strong>de</strong> tiempo que se <strong>de</strong>bería producir entrecaptura y captura <strong>de</strong>bería ser <strong>de</strong> 120 metros.Como vemos es muy sencillo calcular la distancia que hay que recorrerpara tomar una nueva fotografía, no sería complicado por tanto po<strong>de</strong>rcalcular las distancias que e<strong>xi</strong>ste entre elementos que aparecen en lafotografía. Esta técnica es utilizada también en la fotogrametría don<strong>de</strong> serealiza la medición <strong>de</strong> distancias a partir <strong>de</strong> las fotografías tomadas.Hemos mencionado la Hiperestereoscopia, el fenómeno contrarioes conocido como Hipoestereoscopia que suce<strong>de</strong> cuando e<strong>xi</strong>ste pocadistancia entre el punto don<strong>de</strong> se realizan las fotografías y los objetos afotografiar pudiendo provocar que aquello que queremos fotografía salgafuera <strong>de</strong>l fotograma. Para calcular la distancia a<strong>de</strong>cuada nos vale la mismaformula, simplemente vasta con variar la distancia a la que queremos verlos objetos en la imagen virtual, por ejemplo:(0,065m/0,25m) = d/L <strong>de</strong>spejando d tenemos d = 0,25 x LPrincipios matemáticos, calculo <strong>de</strong> distancia focalSi queremos crear una imagen estereoscópica con dos cámarafotográficas, lo primero que tenemos que calcular es la distancia a la que<strong>de</strong>ben estar las lentes <strong>de</strong> las dos cámaras, es lo que conocemos comodistancia focal o stereo base.Para realizar el cálculo necesitamos tener en cuenta los siguientesaspectos:●La distancia entre los objetos <strong>de</strong>ntro <strong>de</strong>l campo <strong>de</strong> visión <strong>de</strong>be serla a<strong>de</strong>cuada, es lo que conocemos como profundidad <strong>de</strong> campo o<strong>de</strong>pth of field.


Visión Estereoscópica [ 131 ]●●●Asegurarse <strong>de</strong> que el “Stereo parallax” no exce<strong>de</strong> 1.2mm (formato<strong>de</strong> 35mm) o 2.3mm (en el formato <strong>de</strong> 60mm). Stereo Parallax es ladistancia que e<strong>xi</strong>ste entre los objetos cercanos y los lejanos en lavista utilizada. Stereo Parallax suele ser expresado como angularparallax o linear parallax.Angular parallax se refiere al grado <strong>de</strong> convergencia necesario parafundir un objeto. Un objeto en el infinito estereoscópico tiene unaangular parallax <strong>de</strong> cero en el mundo real.Linear parallax es la diferencia que e<strong>xi</strong>ste entre la distancia <strong>de</strong> lospuntos homólogos en el par estéreo. Recor<strong>de</strong>mos que cuandotomábamos dos fotografías para construir la imagenestereoscópica e<strong>xi</strong>stían gran cantidad <strong>de</strong> puntos en común enambas y puntos únicos en cada una <strong>de</strong> ellas.●Seguir los principios estéticos <strong>de</strong> una buena imagen estéreo.Tanto la profundidad <strong>de</strong> campo como el stereo parallax son conceptosmatemáticos que pue<strong>de</strong>n ser calculados fácilmente, mientras que losprincipios estéticos que se sigan <strong>de</strong>pen<strong>de</strong>rán únicamente <strong>de</strong> la creatividady capacidad artística <strong>de</strong> cada persona.Para realizar el cálculo <strong>de</strong> la distancia focal utilizamos la fórmula<strong>de</strong>sarrollada por Jhon Bercovitz obteniendo el má<strong>xi</strong>mo efectoestereoscópico en las imágenes <strong>de</strong>ntro <strong>de</strong> lo permitido.B = P/(L-N) ( LN/F - (L+N)/2 )●●●●●B: Base estéreo (distancia entre los ejes ópticos <strong>de</strong> la cámara)P: “Parallax” obtenido, en milímetrosL: Distancia mas lejana <strong>de</strong> las lentes <strong>de</strong> la cámaraN: Distancia mas cercana a las lentes <strong>de</strong> la cámaraF: Distancia focal <strong>de</strong> las lentesLa profundidad <strong>de</strong>l sujeto suele coincidir con L – N = D aunque nosiempre se cumple, sobre todo con distancias gran<strong>de</strong>s. Según Bercovitz ,cuando la distancia al objeto más alejado <strong>de</strong> la cámara sea infinitopo<strong>de</strong>mos utilizar: B = P (N/F - ½) , pudiendo aplicarla para vistasortogonales.


[ 132 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 3. Configuración para ren<strong>de</strong>r Estereo en Blen<strong>de</strong>r.Configuración en Blen<strong>de</strong>rLa configuración en Blen<strong>de</strong>r es bastante sencilla. Basta con añadir doscámaras a la escena que estén emparentadas con un objeto que controlarásu rotación y posición. Para ello, este objeto padre tendrá una restricción<strong>de</strong> tipo “Track To” con un objeto Empty (ver Figura 3). El ren<strong>de</strong>r habráque realizarlo con cada una <strong>de</strong> las cámaras, componiendo el resultado <strong>de</strong>las dos cámaras en una misma imagen o fotograma <strong>de</strong>l vi<strong>de</strong>o resultado.Referencias●●●●http://dmi.uib.es/~abasolo/cursorealidad/paco/Estereoscopia.htmlhttp://www.neoyet.com/vision.htmhttp://nzphoto.tripod.com/stereo/3dtake/fbercowitz.htmhttp://www.users.red3i.es/~stereoweb/vision.htm


Sección IIIAnimaciónFotograma <strong>de</strong> la Película <strong>de</strong> Animación“Elephants Dream” realizada con Blen<strong>de</strong>r© Copyright 2006, Blen<strong>de</strong>r FoundationNetherlands Media Art Institutewww.elephantsdream.org


IPOAmonkeycurve


Técnicas <strong>de</strong> Animación en Blen<strong>de</strong>rCarlos López Yrigarayklopes@unizar.es ::El arte ha encontrado en la infografía su última forma <strong>de</strong>expresión, y la generalización <strong>de</strong> esta ha llevado a laaparición <strong>de</strong> un sinnúmero <strong>de</strong> artistas que, asu vez, hansabido transmitir su obra a través <strong>de</strong> la red. Recíprocamente, lapopularidad <strong>de</strong> los programas gráficos, y en particular los quefavorecen la creación <strong>de</strong> personajes y su animación, hanimpulsado la creación <strong>de</strong> programas <strong>de</strong> licencia libre comoBlen<strong>de</strong>r y la mejora constante <strong>de</strong>l software disponible en todoslos ámbitos.Estas mejoras se hacen especialmente patentes en cuanto a la facilidad<strong>de</strong> uso <strong>de</strong> las utilida<strong>de</strong>s, permitiendo la creación <strong>de</strong> escenas expresivas conun esfuerzo menor, sin menoscabo <strong>de</strong> la capacidad artística, que se ve porel contrario más libre en cuanto a las limitaciones <strong>de</strong>l programa.Como el proceso <strong>de</strong> mo<strong>de</strong>lado, que ha pasado a dividirse en varios tipos(<strong>de</strong>s<strong>de</strong> la creación <strong>de</strong> estructuras malladas polígono a polígono hasta laescultura virtual usando herramientas a<strong>de</strong>cuadas), o la creación <strong>de</strong>materiales y entonación <strong>de</strong> la luz (que van pasando por sucesivas fases <strong>de</strong>calidad, refinándose para acercarse cada vez más a la realidad <strong>de</strong> unafotografía, o haciéndose tan manejables como para mo<strong>de</strong>lar el ambiente <strong>de</strong>forma creativa), el <strong>de</strong> la animación ha evolucionado hacia el modulado <strong>de</strong>la composición <strong>de</strong> acciones en una línea <strong>de</strong> tiempo, o la implementación <strong>de</strong>sistemas <strong>de</strong> toma <strong>de</strong> <strong>de</strong>cisiones <strong>de</strong> los propios personajes mediantealgoritmos <strong>de</strong> inteligencia artificial.En esta exposición se preten<strong>de</strong> comentar el estado <strong>de</strong>l arte en el momento<strong>de</strong> escribir estas líneas, en cuanto a la animación en Blen<strong>de</strong>r 3D, <strong>de</strong>s<strong>de</strong> elmovimiento <strong>de</strong> un objeto hasta las posibilida<strong>de</strong>s <strong>de</strong> animar un personaje.AnimaciónMoviendo Blen<strong>de</strong>rEl movimiento <strong>de</strong> un objeto lo <strong>de</strong>finiremos tal como se usa en su sentidomatemático, es <strong>de</strong>cir: su <strong>de</strong>splazamiento por el espacio 3D, junto con susgiros y sus cambios <strong>de</strong> escala en los tres ejes <strong>de</strong> referencia, esto es: lamodificación <strong>de</strong> su matriz característica.[ 135 ]


[ 136 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DA cualquier otro cambio aparente <strong>de</strong>l objeto (cambios en su geometría,<strong>de</strong>formación esquelética o por curvatura <strong>de</strong>l espacio, roturas, color,material...) lo llamaremos, en general, animación, y ya está.Inicialmente, un movimiento se <strong>de</strong>scribe mediante curvas que indican elvalor <strong>de</strong>l parámetro en el tiempo, ya sean valores coor<strong>de</strong>nados, ángulos, intensida<strong>de</strong>s...Si un objeto sólo va a dar botes por la escena sin moverse <strong>de</strong>lsitio, sólo habrá que <strong>de</strong>finir una curva en el canal LocZ (figura superior).


Técnicas <strong>de</strong> Animación en Blen<strong>de</strong>r [ 137 ]Estas curvas se agrupan en objetos <strong>de</strong> la llamada clase IPO, y sus curvasson las curvas IPO. Po<strong>de</strong>mos ver copias <strong>de</strong>l objeto animado en cada uno <strong>de</strong>sus puntos <strong>de</strong> cambio (nodos, keys) para hacernos una i<strong>de</strong>a <strong>de</strong> suevolución.Los objetos también pue<strong>de</strong>n estar animados simplemente porrestricciones, cambiando su posición, orientación y aspecto por la acción<strong>de</strong> otros elementos, como el conservar la orientación hacia un objetivo,clonar sus coor<strong>de</strong>nadas u orientación, recorrer una curva, ... Estasrestricciones también están controladas a su vez por una curva IPO que laspue<strong>de</strong> <strong>de</strong>sactivar cuando su valor es 0. También po<strong>de</strong>mos generaranimación con modificadores: enganchando vértices a otro objeto (Hooks),pasando a través <strong>de</strong> una rejilla <strong>de</strong>formada (lattice), construyendo unesqueleto,...


[ 138 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DPythonEvi<strong>de</strong>ntemente, e<strong>xi</strong>stiendo un entorno <strong>de</strong> programación <strong>de</strong>ntro <strong>de</strong>l propioBlen<strong>de</strong>r (un API para lenguaje Python), estamos capacitados para crearcurvas IPO mediante un programa, explícitamente o en base a un interfacecontrolado por el usuario. El movimiento, entonces, estaría calculadopreviamente en el momento <strong>de</strong> uso <strong>de</strong>l script. Pero también po<strong>de</strong>mosevitar el paso <strong>de</strong> crear curvas modificando directamente las características<strong>de</strong>l objeto en cada fotograma. Para ello hacemos uso <strong>de</strong> los ScriptLinks,enlaces directos <strong>de</strong>s<strong>de</strong> una entidad <strong>de</strong> blen<strong>de</strong>r (un objeto3D, cámara,material... o una escena completa) a programas que se ejecutarán en cadacambio <strong>de</strong> cuadro.Dirigiendo el movimiento externamente: DriversOtra <strong>de</strong> las últimas herramientas añadidas en Blen<strong>de</strong>r son los drivers,que controlan curvas IPO individualmente por medio <strong>de</strong> otra curva, o biencon una línea o un programa escrito en Python (PyDrivers). A gran<strong>de</strong>srasgos, nos permite crear animaciones que <strong>de</strong>pen<strong>de</strong>n <strong>de</strong> otras animacioneso <strong>de</strong> movimientos <strong>de</strong> objetos.Como era <strong>de</strong> esperar, todas las curvas IPO <strong>de</strong> todo tipo pue<strong>de</strong>n sercontroladas por drivers, también las que cambian los parámetros <strong>de</strong> losmateriales, luces y cámaras, y las que controlan los gestos en las RVKs (vermás abajo).


Técnicas <strong>de</strong> Animación en Blen<strong>de</strong>r [ 139 ]Aprovechando el Game-EngineOtra <strong>de</strong> las utilida<strong>de</strong>s recientemente implementadas es la generación<strong>de</strong> movimientos generados por el motor <strong>de</strong> juegos <strong>de</strong> Blen<strong>de</strong>r, lo que nosda la posibilidad <strong>de</strong> añadir complejidad física a la escena con colisiones ycomportamiento realista <strong>de</strong> los objetos.Esqueletos en Blen<strong>de</strong>rEl más potente modificador, casi imprescindible, para la creación <strong>de</strong>personajes animados, es el uso <strong>de</strong> esqueletos, en Blen<strong>de</strong>r llamadosArmatures, que constan <strong>de</strong> segmentos (huesos, Bones) que pue<strong>de</strong>nemparentarse formando una estructura móvil que se pue<strong>de</strong> animar.A la preparación <strong>de</strong> un esqueleto completo, a<strong>de</strong>cuado al objeto quepreten<strong>de</strong> <strong>de</strong>formar, con sus controles para usar <strong>de</strong> manera cómoda, se lellama rigging.AccionesEl movimiento <strong>de</strong> los huesos respon<strong>de</strong> a IPOs <strong>de</strong> un tipo especial,Actions, que permite <strong>de</strong>splazamiento, rotación y escalado <strong>de</strong> estosindividualmente. Hay que hacer notar que las rotaciones utilizan 4parámetros, según el método <strong>de</strong> orientación <strong>de</strong> los cuaternios <strong>de</strong> Hamilton(W, X, Y, Z) en lugar <strong>de</strong> los ángulos <strong>de</strong> Euler (X, Y, Z) que usan los objetos3D, para aumentar la velocidad <strong>de</strong> cálculo y evitar los ejes privilegiados ypuntos nodales.


[ 140 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLa situación <strong>de</strong> los huesos <strong>de</strong> un esqueleto en un instante forma unaPose, y una secuencia <strong>de</strong> poses genera una Acción. Así que po<strong>de</strong>mos crearuna secuencia completa animando un esqueleto en una acción única conposes sucesivas, si bien po<strong>de</strong>mos pensar que ciertas partes <strong>de</strong> la acciónpue<strong>de</strong>n repetirse, en esta u otras acciones (menear la cabeza, aplaudir, darun paso), con lo que lo i<strong>de</strong>al es <strong>de</strong>scomponer la animación en accionessucesivas, que pue<strong>de</strong>n mezclarse unas con otras, más cuando en una acciónno tienen por qué intervenir todos los huesos, así que po<strong>de</strong>mos crearacciones para los pies, acciones para los brazos, para los <strong>de</strong>dos, la cabeza,la cola...En las últimas versiones <strong>de</strong> Blen<strong>de</strong>r no sólo po<strong>de</strong>mos incluir secuencias <strong>de</strong>poses <strong>de</strong> esqueletos, sino que po<strong>de</strong>mos combinarlas con movimientos <strong>de</strong>objetos o <strong>de</strong> la propia Armature como objeto en sí mismo. Esto adquieresentido si tenemos objetos conectados al esqueleto o al mo<strong>de</strong>lo que losestán controlando, como complementos <strong>de</strong> la ropa que se mueven alcaminar, objetos <strong>de</strong> control que tiran <strong>de</strong> los ojos hacia a<strong>de</strong>lante en unaacción <strong>de</strong> sorpresa, etc.Deformación <strong>de</strong> mallasEsqueletosA estos esqueletos po<strong>de</strong>mos asociar una malla para que se <strong>de</strong>forme conel movimiento <strong>de</strong> los huesos, aunque también po<strong>de</strong>mos usarlosemparentando objetos directamente a los huesos, como componentes


Técnicas <strong>de</strong> Animación en Blen<strong>de</strong>r [ 141 ]rígidos robóticos. La <strong>de</strong>formación <strong>de</strong> una malla asociada a un esqueleto(llamada skinning) se pue<strong>de</strong> producir <strong>de</strong> varias maneras, ya sea mediantegrupos <strong>de</strong> vértices que siguen a <strong>de</strong>terminados huesos, por asignaciónautomática <strong>de</strong> cercanía a estos (Envolventes), o una combinación <strong>de</strong> ambastécnicas.Vertex KeysEsta herramienta es la más importante para dar expresividad anuestros personajes, pues es la manera más cómoda <strong>de</strong> modificar lasmallas en una secuencia para que cambien su apariencia con el tiempo.Consiste en crear copias modificadas <strong>de</strong> la malla original (gestos, Shapes),<strong>de</strong> manera que po<strong>de</strong>mos conseguir una colección <strong>de</strong> gestos para mezclarlosy combinarlos en la animación. Si bien e<strong>xi</strong>ste una forma básica <strong>de</strong> usar lasVertex Keys, <strong>de</strong> forma absoluta, haciendo uso <strong>de</strong> ellas una tras otralinealmente, la opción más interesante es usarlas <strong>de</strong> forma relativa (RVKs).Esto significa que en cada momento, estamos sumando los gestos <strong>de</strong> unacara que nos interesan, para conseguir que un personaje pueda hablar,parpadar y mover las cejas a la vez. El mecanismo es simple <strong>de</strong> enten<strong>de</strong>r, yahora muy fácil <strong>de</strong> gestionar gracias a los botones <strong>de</strong> la ventana <strong>de</strong>acciones: cada gesto está controlado por una curva IPO, que indica concuánta intensidad se realiza: con 0 no tiene lugar, con 1 vemos el gesto talcual, y con valores superiores po<strong>de</strong>mos incluso exagerarlo.Gracias a la posibilidad ya comentada <strong>de</strong> introducir animaciones <strong>de</strong>objetos <strong>de</strong>ntro <strong>de</strong> acciones, también po<strong>de</strong>mos añadir secuencias <strong>de</strong> RVKs<strong>de</strong>ntro <strong>de</strong> estas, consiguiendo sumar la expresividad <strong>de</strong> la malla a losmovimientos <strong>de</strong> los huesos.


[ 142 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DAnimación facial y sincronización labialComo apartado especial quedan estas activida<strong>de</strong>s, imprescindibles paradar expresividad y lenguaje a nuestros personajes y que por sí mismasconstituyen una ocupación en la organización <strong>de</strong> un proyecto animado. Laexpresividad es responsabilidad <strong>de</strong>l animador y <strong>de</strong> su capacidad artística, yla sincronización labial (lipsync) e<strong>xi</strong>ge un esfuerzo a veces impre<strong>de</strong>cible, yconocimientos <strong>de</strong>l habla y la fonación en el idioma en el que habla elpersonaje. Supondría material para una charla que, por otra parte ya seimpartió en otro encuentro, así que en este apartado nos limitaremos acomentar lo que ofrece Blen<strong>de</strong>r para cambiar la expresión <strong>de</strong> la cara <strong>de</strong> unpersonaje. En general, po<strong>de</strong>mos usar las dos técnicas comentadas <strong>de</strong> formano excluyente.Un rigging facial es a<strong>de</strong>cuado para los motores <strong>de</strong> tiempo real (MTR), estoes: juegos y aplicaciones interactivas. En la actualidad, raramente un MTRpermite combinaciones <strong>de</strong> mallas para crear expresividad o habla, por loque todas las <strong>de</strong>formaciones <strong>de</strong>ben hacerse con esqueletos. Esta tarea nosuele ser complicada porque normalmente no se e<strong>xi</strong>ge una interpretacióndramática <strong>de</strong>l actor, pero si fuera necesario, el método consiste en crear unsistema <strong>de</strong> huesos análogo a la musculatura <strong>de</strong> la cara, <strong>de</strong> manera que alasociar los vértices, estos se muevan como la piel que hay sobre ellos. Laapro<strong>xi</strong>mación es bastante buena, pero no es un método a<strong>de</strong>cuado paraexpresividad sutil.


Técnicas <strong>de</strong> Animación en Blen<strong>de</strong>r [ 143 ]La manera habitual <strong>de</strong> dar expresiones a una cara es mo<strong>de</strong>larlas mediantecopias <strong>de</strong> la malla, separadas en mita<strong>de</strong>s si es necesario (ceja <strong>de</strong>rechaarriba ­ ceja izquierda arriba,...). Estas mallas, en realidad se guardaninternamente como <strong>de</strong>plazamientos relativos <strong>de</strong> los vértices con respecto ala malla base, <strong>de</strong> manera que el programa sólo tiene que sumar, por cadavértice, un vector por cada expresión activa; este vector estará previamentemultiplicado por la intensidad con que se realiza esa expresión,usualmente un número entre 0 y 1. Esta intensidad es, precisamente, laque nos dan las curvas IPO que se <strong>de</strong>finen en las RVKs.La comodidad para insertar nuevos gestos en la animación es muyimportante para un trabajo fluido. Esencialmente, toda la potencia paragenerar animación por RVKs estaba implementada <strong>de</strong>s<strong>de</strong> hace años enBlen<strong>de</strong>r, pero gracias a los nuevos paneles <strong>de</strong> Shapes, su inclusión con<strong>de</strong>slizadores en la ventana <strong>de</strong> acciones, la asignación <strong>de</strong> nombres a cadaexpresión y otros <strong>de</strong>talles que poco a poco se han ido añadiendo, es cadavez más rápido conseguir lo mismo y con más control.


[ 144 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DCreación <strong>de</strong> GUIs personalizados con driversLa implementación <strong>de</strong> drivers que controlen el movimiento ha abierto unsinfín <strong>de</strong> posibilida<strong>de</strong>s para la animación, y el más inmediato parece ser elcontrol manual mediante creación <strong>de</strong> botones (sli<strong>de</strong>rs) en el propio espacio3D. Así, el <strong>de</strong>splazamiento <strong>de</strong> un objeto pue<strong>de</strong> generar animación en todoslos objetos que tengan un IPO con drivers asociados a él. Johnny Matthews(guitargeek), un experto usuario <strong>de</strong> Blen<strong>de</strong>r, creó un pequeño script queinmediatamente fue añadido a la versión oficial. Genera controles <strong>de</strong>diversas formas que se usan para enlazar a drivers <strong>de</strong> una malla con RVKs,<strong>de</strong> manera que po<strong>de</strong>mos fabricar una cara esquemática con pequeñosobjetos que, al moverlos, nos mueven pequeños rasgos directamente sintocar para nada el sistema clásico <strong>de</strong> animación.


Blen<strong>de</strong>r y Doom 3Carlos Folch HidalgoFOLKYTO@teleline.es ::Hoy día todo el mundo ha oido hablar <strong>de</strong> los vi<strong>de</strong>ojuegosque realizan empresas famosas como Id Software,Valve, Blizzard y hasta Microsoft. Nombres como Doom3, Half Life 2, War of Warcraft, etc.. son famosos entre el públicogeneral. Pero estos juegos no sólo permiten divertirse <strong>de</strong> lamanera tradicional, contra la “máquina” y online, sino quea<strong>de</strong>más abrieron hace tiempo un nuevo campo para el <strong>de</strong>sarrolloIndie: los mods.Hay que <strong>de</strong>cir que los mods nacieron con juegos mucho más antiguos,pero nos centraremos en los que utilizan engines 3d y requieren <strong>de</strong> unsoftware 3d para la creación <strong>de</strong> sus gráficos.Vi<strong>de</strong>ojuegos y modsUn mod no es sino una variación <strong>de</strong> un juego comercial. La variaciónpue<strong>de</strong> ser parcial o total. Los mods con variaciones parciales son los máscomunes, aprovechándose la mecánica <strong>de</strong>l juego original e introduciendonuevos gráficos, sonidos, comportamientos y niveles.AnimaciónFigura 1. Captura <strong>de</strong> pantalla <strong>de</strong> Counter Strike.[ 145 ]


[ 146 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 2. Captura <strong>de</strong> pantalla <strong>de</strong> Doom.Los mods con variaciones totales son más escasos, sobretodo <strong>de</strong>bido ala dificultad y al tiempo <strong>de</strong> <strong>de</strong>sarrollo necesario. Uno <strong>de</strong> los mods másfamosos <strong>de</strong> la historia es el Counter Strike, que fué <strong>de</strong>sarrollado como mod<strong>de</strong>l Half Life.¿Cómo puedo crear un mod?El potencial creativo y <strong>de</strong> diversión extra que proporciona la creación <strong>de</strong>mods es, hoy día, indudable. Las empresas <strong>de</strong>sarrolladoras <strong>de</strong> vi<strong>de</strong>ojuegoshace tiempo que se dieron cuenta <strong>de</strong> su utilidad y por ello muchasproporcionan algunas <strong>de</strong> las herramientas necesarias para el <strong>de</strong>sarrollo <strong>de</strong>mods. Herramientas <strong>de</strong> compilación y los montadores <strong>de</strong> niveles sonejemplos <strong>de</strong> ello. Veamos un par <strong>de</strong> ejemplos, buscando engines recientes,para no exten<strong>de</strong>rnos eternamente:Id SoftwareCreadora <strong>de</strong> Doom y Quake (como títulos más famosos), es una <strong>de</strong> lasempresas más punteras a la hora <strong>de</strong> favorecer la creación <strong>de</strong> mods y <strong>de</strong>apoyar el <strong>de</strong>sarrollo Indie en general. No sólo proporciona editores <strong>de</strong>niveles con sus juegos, sino que a<strong>de</strong>más acostumbra a liberar sus motores ysus herramientas como GPL cuando ha pasado un tiempo <strong>de</strong>s<strong>de</strong> supublicación.Como ejemplo saber que id Software liberó el código fuente <strong>de</strong> Quake IIIArena el verano pasado, y que en Febrero <strong>de</strong> este año liberó el GtkRadianty el q3map2 (editor <strong>de</strong> niveles y compilador). A<strong>de</strong>más es una <strong>de</strong> las pocas


Blen<strong>de</strong>r y Doom 3 [ 147 ]compañías que sacan versiones para Linux <strong>de</strong> su juegos y susherramientas, y es conocida su predilección por el <strong>de</strong>sarrollo para Openglantes que para Directx (ambas son API´s 3D, si bien Opengl es multiplataforma).No po<strong>de</strong>mos pasar página sin mencionar a John Carmack, co­fundador yprogramador <strong>de</strong> id Software, y uno <strong>de</strong> los programadores que más avancesha introducido en los vi<strong>de</strong>ojuegos a partir <strong>de</strong> i<strong>de</strong>as propias y ajenas.ValveCreadora <strong>de</strong> Half Life 1 y 2, Day Of Defeat, etc.., y uno <strong>de</strong> los mayorescontrincantes <strong>de</strong> id Software con permiso <strong>de</strong> Epic Games (Unreal) y <strong>de</strong>Crytek Studios (Farcry). Valve no tiene una política <strong>de</strong> contenidos tanabierta como id Software, pero su apoyo a la creación <strong>de</strong> mods también esbastante bueno. A partir <strong>de</strong> la salida <strong>de</strong> “Counter Strike: condition cero”incluyeron en sus juegos un sistema multijugador basado en un entornopropio (Steam) que monitoriza sus juegos e<strong>xi</strong>stentes en la máquina <strong>de</strong>ljugador.Des<strong>de</strong> ese entorno se pue<strong>de</strong> lanzar el editor <strong>de</strong> niveles, que también sepue<strong>de</strong> conseguir <strong>de</strong> forma in<strong>de</strong>pendiente. Es el “famoso” Valve HammerEditor. A<strong>de</strong>más, para la realización <strong>de</strong> personajes, Valve logró la colaboración<strong>de</strong> Softimage para distribuir <strong>de</strong> forma gratuita (freeware) unaversión, ligeramente limitada, <strong>de</strong>l conocido XSI, al que bautizaron comoXSI Mod Tool (antes Softimage EXP).Figura 3. Valve Hammer Editor.


[ 148 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEl apartado gráfico y Blen<strong>de</strong>rComo ya hemos dicho los mods pue<strong>de</strong>n ser modificaciones que alcancenvarios apartados <strong>de</strong>l juego original (gráficos, música, comportamientos,objetivos, etc..), y <strong>de</strong> todos ellos vamos a concentrarnos en el apartadográfico, y en la creación <strong>de</strong> contenidos 3d.Los editores <strong>de</strong> niveles, proporcionados por las <strong>de</strong>sarrolladoras, seencargan <strong>de</strong> mezclar todos los elementos que el “mod<strong>de</strong>r” le proporcione.Una vez diseñado un mapa, o nivel, el editor suele tener la posiblidad <strong>de</strong>compilar el mapa para ser cargado directamente en el engine original <strong>de</strong>ljuego (llamado a través <strong>de</strong> cónsola, o con una GUI especial para ello). Es laforma <strong>de</strong> mod más sencilla, la creación <strong>de</strong> mapas y su carga directa en eljuego original (tambien llamados packs)Cada editor <strong>de</strong> niveles suele tener su propio código y funcionamiento. Las“entida<strong>de</strong>s”, los “props”, los “info_player_start”, los “triggers”, etc.. sonsólo un ejemplo <strong>de</strong> términos que po<strong>de</strong>mos encontrar en distintos editores.No vamos a entrar en ellos, porque tendríamos que hacer un glossario paracada editor (y para eso ya están las ayudas y los tutoriales) y vamos asimplificar en la creación <strong>de</strong> 2 componentes que siempre encontramos,<strong>de</strong>nominados <strong>de</strong> distintas maneras, en los editores <strong>de</strong> mapas:●●Objetos (estáticos o animados)Personajes animadosLos objetos cumplen varias funciones. Des<strong>de</strong> formar parte <strong>de</strong>l suelo,pare<strong>de</strong>s y techo (o cielo) <strong>de</strong>l mapa hasta ser simples objetos <strong>de</strong>ambientación. Si van a tener propieda<strong>de</strong>s <strong>de</strong> sombreado, afectación <strong>de</strong>físicas o si van a ser fraccionables o con <strong>de</strong>cals (texturas que se aña<strong>de</strong>ncuando les afecta una acción) no lo vamos a tratar aquí.Los personajes animados (colocar un personaje no animado es colocar unaestatua, con lo que ya no es un personaje :P ) también pue<strong>de</strong>n cumplirvarias funciones, pue<strong>de</strong>n verse afectados por comportamientos, seguirrutas, ser activados por otros elementos, etc.. Tampoco vamos a tratar eso.Lo que sí vamos a ver son los elementos, que forman parte <strong>de</strong> los objetos y<strong>de</strong> los personajes, que po<strong>de</strong>mos crear o <strong>de</strong>finir con Blen<strong>de</strong>r:●●●Mo<strong>de</strong>lado Lowpoly: Creación tridimensional <strong>de</strong>l mo<strong>de</strong>lo, entriángulos.Texturas: Aplicación <strong>de</strong> mapas UV <strong>de</strong> texturas en canal diffuse ynormal maps.Esqueletos: Creación <strong>de</strong> Armatures para animar los mo<strong>de</strong>los.


Blen<strong>de</strong>r y Doom 3 [ 149 ]Creación <strong>de</strong> un personaje con Blen<strong>de</strong>rPara la creación <strong>de</strong> nuestro personaje utilizaremos referencias y bocetos. Elbocetado <strong>de</strong> un sketch, o i<strong>de</strong>a rápida, nos dará seguridad y rapi<strong>de</strong>z a lahora <strong>de</strong> mo<strong>de</strong>lar.Mo<strong>de</strong>lado <strong>de</strong>l personajeMientras mo<strong>de</strong>lamos po<strong>de</strong>mos modificar aspectos que creamosmejorables. El boceto no sólo suele ser una buena forma <strong>de</strong> trabajo propia,también es la forma <strong>de</strong> enlazar el trabajo <strong>de</strong>l art<strong>de</strong>signer con el <strong>de</strong>lmo<strong>de</strong>lador. A los bocetos que se crean <strong>de</strong> frente y <strong>de</strong> perfil, optimizadospara su uso directo en el mo<strong>de</strong>lador usado, se les conoce comunmentecomo blueprints.En Blen<strong>de</strong>r po<strong>de</strong>mos cargar dichos blueprints directamente en los visores.A través <strong>de</strong>l menú View podremos colocar imágenes distintas en cadadivisión, <strong>de</strong> la ventana 3d, que hagamos.Figura 4. Boceto cargado en la 3D View <strong>de</strong> Blen<strong>de</strong>r.


[ 150 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 5. La herramienta Mirror en Blen<strong>de</strong>r.Para mo<strong>de</strong>lar el mo<strong>de</strong>lo po<strong>de</strong>mos usar la técnica que <strong>de</strong>seemos,mediante Box mo<strong>de</strong>ling, usando extrusiones para ir creando el personaje oincluso vértice a vértice (o el concepto “brick by brick” <strong>de</strong> Jbelanche).In<strong>de</strong>pendientemente <strong>de</strong> la técnica usada hay una herramienta que resultamuy útil, en cualquier software 3d, a la que se le llama Mirror.El Mirror no es sino el reflejo, con respecto a un eje, <strong>de</strong> lo que nosotrosvamos mo<strong>de</strong>lando, y se suele usar mo<strong>de</strong>lando un lado <strong>de</strong>l personaje y<strong>de</strong>jando que el Mirror crée la otra mitad como copia reflejada. Estopermite personajes simétricos y sólo lo <strong>de</strong>sactivaremos a la hora <strong>de</strong> crearirregularida<strong>de</strong>s (como en el peinado), personajes asimétricos o a la hora <strong>de</strong>añadir <strong>de</strong>terminados tipos <strong>de</strong> ropa y complementos.Por último hay que señalar una condición especial <strong>de</strong>l mo<strong>de</strong>lado <strong>de</strong>personajes para vi<strong>de</strong>ojuegos. Tenemos la necesidad <strong>de</strong> conseguir mallasligeras para liberar al motor gráfico y que sea así capaz <strong>de</strong> mostrar enpantalla todo lo necesario sin que se relentice (fps) el juego. A estas “mallasligeras” se las conoce como mo<strong>de</strong>lado Lowpoly, y su base consiste enintentar mo<strong>de</strong>lar sólo aquellos <strong>de</strong>talles que sean imposibles <strong>de</strong> simularmediante textura o normal map.


Blen<strong>de</strong>r y Doom 3 [ 151 ]Figura 6. Malla triangulizada en Blen<strong>de</strong>r.Actualmente un personaje protagonista pue<strong>de</strong> rondar tranquilamentelos 3000 polys (tris) y los personajes secundarios pue<strong>de</strong>n ir <strong>de</strong> 1000 a2000 polys (tris). Obviamente si hay personajes que sólo actuarán al fondo<strong>de</strong> la acción y que nunca se verán en <strong>de</strong>talle estas cifras pue<strong>de</strong>n bajarmucho, también hay que señalar que los actuales motores <strong>de</strong> últimageneración permiten personajes principales <strong>de</strong> más <strong>de</strong> 5000 polys.El término polys, usado aquí, hace referencia al número <strong>de</strong> polígonos, y eltérminos “tris” se usa para especificar que dichos polígonos son triángulos.En la mayoría <strong>de</strong> softwares <strong>de</strong> creación 3d po<strong>de</strong>mos crear polígonos <strong>de</strong> 4 omás lados (usando f­gons o n­gons) pero para la exportación paravi<strong>de</strong>ojuegos <strong>de</strong>bemos <strong>de</strong>jar la malla triangulizada porque los motoresgráficos, y más concretamente las API´s gráficas usadas, sólo muestrantriángulos. En Blen<strong>de</strong>r hay la opción <strong>de</strong> triangulizar una malla pulsandoCtrl+t pero siempre es mejor hacerlo <strong>de</strong> forma manual para evitar aristasrebel<strong>de</strong>s.Creación <strong>de</strong>l mapa UVUna vez tenemos el personaje mo<strong>de</strong>lado hay que aplicarle texturas. Lastexturas usadas <strong>de</strong>pen<strong>de</strong>n, en cuanto a tamaño y tipo, <strong>de</strong> la capacidad <strong>de</strong>lmotor. Las texturas <strong>de</strong>ben tener normalmente un tamaño que sea potencia<strong>de</strong> 2, aunque <strong>de</strong>pendiendo <strong>de</strong> la aceleradora pue<strong>de</strong>n usarse texturas que sesalten esa norma pero eso no lo vamos a explicar aquí. Así se suelen usartexturas <strong>de</strong> 16x16, 32x32, 64x64, 128x128, 256x256, etc... El tamañomá<strong>xi</strong>mo que vamos a po<strong>de</strong>r usar <strong>de</strong>pen<strong>de</strong>rá <strong>de</strong> que el motor sea capaz <strong>de</strong>mostrarla, junto con el resto <strong>de</strong> mallas y texturas, en una escena sinrelentizarse. Hoy día 512x512 ó 1024x1024 son tamaños buenos para hacerla textura <strong>de</strong> nuestro personaje. Mencionar que aunque en los ejemplos hepuesto números simétricos las texturas pue<strong>de</strong>n ser <strong>de</strong> 32x64, etc...


[ 152 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 7. Usando el Mark Seam en Blen<strong>de</strong>r.En cuanto al tipo, las texturas más usadas son las que se usarían comodiffuse (o el color propiamente dicho) y las que nos darían la información<strong>de</strong> bump (relieve) y las especulares (brillo). También hay motores queaceptan los normal maps, <strong>de</strong> los que hablaremos <strong>de</strong>spués. A la hora <strong>de</strong>plantear nuestra textura <strong>de</strong>bemos tener en cuenta si <strong>de</strong>berá ser, o no,tileable (que se pue<strong>de</strong> repetir, una junto a otra, sin que se vean lasuniones).Para po<strong>de</strong>r aplicar las texturas a nuestro personajes <strong>de</strong>bemos <strong>de</strong>finir antesel mapa UV. Dicho mapa no es sino extensión <strong>de</strong> las coor<strong>de</strong>nadas 3d, <strong>de</strong> losvértices <strong>de</strong> la malla, en un mapa 2d. Para crear dicho mapa en Blen<strong>de</strong>rusaremos el modo Face Selected Mo<strong>de</strong>, y eligiremos el tipo <strong>de</strong> proyecciónUV. Si usamos el LSCM marcaremos algunos vértices por don<strong>de</strong> elprograma calculará un corte (mark seam) y luego ajustaremos lascoor<strong>de</strong>nadas UV, en el Image Editor, mediante el uso <strong>de</strong> Points y el LSCMUnwrap. Cuando el mo<strong>de</strong>lo es complejo, por ejemplo con un personajepara vi<strong>de</strong>ojuegos :P, es recomendable ir mapeando por partes en vez <strong>de</strong>intentar hacerlo todo entero <strong>de</strong> una tirada.Cuando tenemos el mapa UV creado lo exportaremos a una imagen quenos muestre el mapeado para po<strong>de</strong>r, posteriormente, pintar encima lastexturas en nuestro editor <strong>de</strong> imagen preferido (ya sea Gimp, Artrage,etc...). Para exportarlo usaremos el script, que trae por <strong>de</strong>fecto Blen<strong>de</strong>r,llamado “Save UV Face Layout”. Posteriormente bastará con quecarguemos en Blen<strong>de</strong>r la imagen creada y ya podremos ver como queda,perfectamente ajustada, a nuestro mo<strong>de</strong>lo (Alt+z para visualizar lastexturas aplicadas con UV).


Blen<strong>de</strong>r y Doom 3 [ 153 ]Figura 8. Mapa UV estraido con el Script “Save UV Face Layout” y pintado con Gimp.Figura 9. El mo<strong>de</strong>lo final con la textura aplicada.


[ 154 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 10. Script para hacer un “Ren<strong>de</strong>r to Texture”.Ren<strong>de</strong>r to texture y Normal mappingYa tenemos el mapa UV y las texturas, pero no nos convence lasensación <strong>de</strong> volumen que hemos conseguido con ellas. Es hora <strong>de</strong> usar el“ren<strong>de</strong>r to texture”. Dicho término se usa para referirse al proceso <strong>de</strong>ren<strong>de</strong>r, <strong>de</strong> cada una <strong>de</strong> las caras <strong>de</strong>l mo<strong>de</strong>lo afectadas por la iluminaciónque <strong>de</strong>seemos, y al volcado <strong>de</strong> esas imágenes en el mapa UV <strong>de</strong> nuestromo<strong>de</strong>lo. De esta forma, y <strong>de</strong>pendiendo <strong>de</strong>l motor <strong>de</strong> ren<strong>de</strong>r usado,po<strong>de</strong>mos conseguir un sombreado más realista en nuestras texturas. Hayque advertir que se suele usar para ello una iluminación que simule una GIsuave para permitir que nuestro mo<strong>de</strong>lo sea válido en cualquier situación.En Blen<strong>de</strong>r disponemos <strong>de</strong> un script que realiza esto, con mayor o menorfortuna; es el BrayBaker ф , realizado por macouno.No vamos a <strong>de</strong>spedirnos aún <strong>de</strong> este script, ya que permite también lacreación <strong>de</strong> normal maps para nuestro mo<strong>de</strong>lo. Los normal maps son unconcepto parecido a los bump maps (mapas <strong>de</strong> relieve en escala <strong>de</strong> grises),pero a diferencia <strong>de</strong> éstos últimos los normal maps utilizan la informaciónRGB, con los valores <strong>de</strong> sus canales asignados a cada eje <strong>de</strong> coor<strong>de</strong>nadas,para calcular la simulación <strong>de</strong> relieve en el espacio tridimensional. Esto,más o menos traducido, quiere <strong>de</strong>cir que la simulación <strong>de</strong> relieve se verátambién afectada por la luz <strong>de</strong> la escena y por la posición <strong>de</strong> la cámara conrespecto a las caras <strong>de</strong>l objeto (y sus normales ;­) )фEl Script BrayBaker, junto con su documentación pue<strong>de</strong> encontrarse en la siguientepágina web: http://www.alienhelp<strong>de</strong>sk.com/in<strong>de</strong>x.php?id=22


Blen<strong>de</strong>r y Doom 3 [ 155 ]Figura 11. Izqda: Normal Map extraido con BrayBaker.Drcha: Normal Map aplicado a coor<strong>de</strong>nadas UV.La forma <strong>de</strong> hacerlo es creando un mo<strong>de</strong>lo en alta (highpoly) a partir<strong>de</strong>l mo<strong>de</strong>lo lowpoly. A este mo<strong>de</strong>lo en alta le aplicaremos un material, paracrear el normal map, con un color RGB por cada dirección yposteriormente usaremos el script BrayBaker, seleccionando el mo<strong>de</strong>lo enlowpoly y manteniendo activo, en el script, el layer don<strong>de</strong> se encuentra elmo<strong>de</strong>lo highpoly. Para la creación <strong>de</strong>l material para normal map lo mejores revisar la documentación oficial <strong>de</strong> Blen<strong>de</strong>r en la siguiente dirección:http://blen<strong>de</strong>r3d.org/cms/Normal_Maps.491.0.htmlCreación <strong>de</strong> esqueletosCon el personaje mo<strong>de</strong>lado y texturizado es hora <strong>de</strong> crear lasanimaciones que utilizará el motor para que el juego sea mínimamentedinámico (nadie dijo que esto fuera un camino <strong>de</strong> rosas). Para conseguireso primero <strong>de</strong>bemos crear una Armature que hará las veces <strong>de</strong> esqueleto<strong>de</strong> nuestro mo<strong>de</strong>lo. La creación <strong>de</strong> Armatures pue<strong>de</strong> parecer una incógnitatotal, pero aveces basta con fijarse en la anatomía real para saber dón<strong>de</strong> ycómo hay que colocar cada Bone (hueso). Los huesos, que componen lasArmatures, son objetos no ren<strong>de</strong>rizables unidos entre sí por jerarquías. Secomponen <strong>de</strong> root y tail (cabeza y cola), aunque también se le llama tip a latail. En el root <strong>de</strong> cada hueso se encuentra su punto <strong>de</strong> pivote. Lastransformaciones que hagamos, en un nivel <strong>de</strong> la jerarquía, <strong>de</strong>scen<strong>de</strong>ránhasta sus <strong>de</strong>scendientes transformándolos a todos. Por ejemplo, si rotamosun hueso padre todos sus <strong>de</strong>scendientes rotarán tomando como punto <strong>de</strong>pivote el root <strong>de</strong>l hueso padre.


[ 156 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 12. Izqda: Armatures en Blen<strong>de</strong>r.Drcha: Envelopes en Blen<strong>de</strong>r.Teniendo en cuenta esos aspectos crearemos nuestra Armaturecuidando que la jerarquía se comporte también <strong>de</strong> forma anatómicamentecorrecta (o mecánicamente correcta si se trata <strong>de</strong> un robot :P ).Skinning + pesado <strong>de</strong> vértices¿Ya puedo empezar a animar mi Armature? No. Aunque ya quedamenos. Una vez creada la Armature es hora <strong>de</strong> enlazar el mo<strong>de</strong>lo a lamisma. A esto se le llama Skinning y no es sino la asociación <strong>de</strong> cadavértice a, como mínimo, un hueso. Una vez asociados todos los vérticespodremos animar el esqueleto y los vértices se comportarán como siestuviesen pegados a los huesos, osea rotarán, se moverán y se escalarán silos huesos a los que están asignados lo hacen.Des<strong>de</strong> la versión 2.40 disponemos en Blen<strong>de</strong>r <strong>de</strong> 4 modos <strong>de</strong> visualización<strong>de</strong> la Armature. Uno <strong>de</strong> ellos, el modo Envelope, nos pue<strong>de</strong> ayudar en elskinning <strong>de</strong> nuestro mo<strong>de</strong>lo. Antes sólo había una forma <strong>de</strong> hacerlo, quegracias a Dios aún e<strong>xi</strong>ste, y era mediante la creación manual <strong>de</strong> VertexGroups a los que se asigna el mismo nombre que el hueso que les va ainfluir (cada vértice pue<strong>de</strong> estar en más <strong>de</strong> un grupo). Si usamos laArmature tipo Envelope no sólo vamos a ver como nuestro esqueleto separece un poco más al muñeco Michelín, sino que a<strong>de</strong>más veremos como laArmature será capaz <strong>de</strong> influenciar a los vértices que que<strong>de</strong>n <strong>de</strong>ntro <strong>de</strong> su


Blen<strong>de</strong>r y Doom 3 [ 157 ]estructura o <strong>de</strong> su zona <strong>de</strong> influencia. La estructura <strong>de</strong> los envelopes esbien visible, son esas esferas hiper<strong>de</strong>sarrollada, su manipulación esindividual para el root y para la tail y su uso se basa en el escalado <strong>de</strong> suspartes hasta que los vértices que nos interesan quedan <strong>de</strong>ntro <strong>de</strong> laestructura. A<strong>de</strong>más tenemos la zona <strong>de</strong> influencia soft, cuyo porcentaje <strong>de</strong>influencia disminuye, <strong>de</strong> forma cuadrática, conforme nos alejamos <strong>de</strong>lhueso en sí.Hemos visto que los vértices no sólo pue<strong>de</strong>n estar asociados a un únicohueso, pue<strong>de</strong>n ser influenciados por más <strong>de</strong> un hueso a la vez y aquí esdon<strong>de</strong> empezamos a encontrarnos con el concepto <strong>de</strong> “pesado <strong>de</strong> vértices”.Si un vértice está asociado a dos huesos po<strong>de</strong>mos <strong>de</strong>cir que recibe unainfluencia <strong>de</strong>l 50% <strong>de</strong> cada hueso. Esto se pue<strong>de</strong> manipular mediante elpintado <strong>de</strong> pesos. Se pue<strong>de</strong> pintar directamente sobre la malla la influenciaque queremos que cada hueso haga sobre los vértices, variando así sucomportamiento a la hora <strong>de</strong> las transformaciones. Esto no se hace porquesí, su objetivo es conseguir evitar <strong>de</strong>formaciones no <strong>de</strong>seadas, como brazosque al doblarse parece que se rompen en vez <strong>de</strong> estar fle<strong>xi</strong>onándose. Po<strong>de</strong>isencontrar información sobre skinning y pesado <strong>de</strong> vértices en ladocumentación oficial <strong>de</strong> Blen<strong>de</strong>r ю o en la Mediawiki.Figura 13. Pintando pesos en Blen<strong>de</strong>r.юhttp://blen<strong>de</strong>r3d.org/cms/Armature_Envelopes.647.0.htmlhttp://mediawiki.blen<strong>de</strong>r.org/in<strong>de</strong>x.php/Manual/PartIX/Skinning


[ 158 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 14.Arriba: Automatic IK en Blen<strong>de</strong>r.Derecha: Cálculo <strong>de</strong> efector y rootcon Automatic IK.Cinemática directa e inversaVamos a hacer un paso fulgurante por estos conceptos. Normalmenteusaremos cinemática directa para nuestros mo<strong>de</strong>los <strong>de</strong> vi<strong>de</strong>ojuegos,aunque hay algunos exportadores (y motores) que soportan la cinemáticainversa, y no es cuestión <strong>de</strong> <strong>de</strong>saprovecharlos.La Cinemática directa (FK o Forward Kinematics) se basa en la jerarquíadirecta para sus transformaciones. Éstas bajan por la ca<strong>de</strong>na directamentey se trasladan a todos los <strong>de</strong>scendientes <strong>de</strong>l hueso al que se le aplica lamodificación.La Cinemática Inversa (IK o Inverse Kinematics) utiliza efectores <strong>de</strong> IKpara mover y rotar a la vez toda una ca<strong>de</strong>na jerárquica. Para ello calcula ladistancia con el origen <strong>de</strong> la ca<strong>de</strong>na y rota automáticamente los huesosintermedios cuando se modifica la distancia a dicho origen.Para aquellos exportadores, y editores, que no calculan las rotacionesusando las ca<strong>de</strong>nas, con cinemática inversa <strong>de</strong>finidas, siempre nos quedala opción <strong>de</strong> simularla para así aumentar la rápi<strong>de</strong>z con la que creamos lasacciones. Para ello Blen<strong>de</strong>r tiene la posiblidad <strong>de</strong> usar el Automatic IKque simula la e<strong>xi</strong>stencia <strong>de</strong> un efector <strong>de</strong> cinemática inversa colocado en lapunta (tail) <strong>de</strong>l hueso y que toma como origen <strong>de</strong> la ca<strong>de</strong>na el huesoconectado más alto en la jerarquía.


Blen<strong>de</strong>r y Doom 3 [ 159 ]Hay que saber que la configuración, o Setup, <strong>de</strong> estos sistemas <strong>de</strong>animación son un arte en sí mismos y forman parte <strong>de</strong> una disciplina quese simplifica bajo el concepto <strong>de</strong> Rigging. Ésta incluye no sólo la creación<strong>de</strong> la Armature, sino también el pesado <strong>de</strong> vértices, el uso <strong>de</strong> constraints, laconfiguración <strong>de</strong> FK/IK, el uso <strong>de</strong> scripts para la creación <strong>de</strong> GUI´s yayudantes personalizados, morphing y un sinfín <strong>de</strong> posiblida<strong>de</strong>s quepermiten facilitar el trabajo <strong>de</strong> los animadores.Las ActionsTenemos nuestro mo<strong>de</strong>lo texturado y “riggeado”, con la armature listapara ser animada. Ahora necesitamos crear nuestra primera Action. UnaAction, en Blen<strong>de</strong>r, es la unidad don<strong>de</strong> se guardan las claves <strong>de</strong> animación<strong>de</strong> una acción concreta. Para conseguir la sensación <strong>de</strong> movimientonecesitamos insertar poses <strong>de</strong> nuestra armature (mediante keys) quevaríen a lo largo <strong>de</strong>l tiempo. Blen<strong>de</strong>r calculará los intermedios(“inbetwens” en animación tradicional) y suavizará esas transiciones entrepose y pose. Para insertar nuestras poses seleccionaremos la Armature yentraremos en “Pose Mo<strong>de</strong>”, una vez allí modificaremos nuestra armaturee introduciremos una key para cada hueso pulsando la tecla “i” yseleccionando el tipo <strong>de</strong> key que necesitemos. Si avanzamos unos cuantosframes, modificamos la pose y volvemos a insertar keys, para los huesosnecesarios, observaremos como se produce la animación al <strong>de</strong>splazar lalínea <strong>de</strong> tiempo.Figura 15. Action Editor con una acción cargada.


[ 160 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLas actions se visualizan y modifican en el Action Editor. Des<strong>de</strong> allípo<strong>de</strong>mos crear nuevas actions, renombrarlas, modificar o borrar las keysintroducidas o hacer flips <strong>de</strong> posturas para simplificar la creación <strong>de</strong>actions cíclicas.La importancia <strong>de</strong> las Actions será crucial a la hora <strong>de</strong> exportar nuestrosmo<strong>de</strong>los. Éstas se exportarán, junto con la <strong>de</strong>finición <strong>de</strong> la malla oseparadas en otro archivo, para que el editor <strong>de</strong> niveles las cargueasignándolas a nuestro personaje.Exportando a Doom3Por fin estamos preparados para exportar nuestro mo<strong>de</strong>lo a un editor <strong>de</strong>niveles. Vamos a centrarnos, como ejemplo, en la exportación para Doom3(por algo el título <strong>de</strong> esta charla).Exportar personajes a md5Doom3 tiene, como cada engine gráfico, su propio sistema para <strong>de</strong>finiry reconocer las mallas <strong>de</strong> los personajes y sus animaciones. En este caso elformato es el md5mesh para la malla y sus coor<strong>de</strong>nadas <strong>de</strong> textura y elmd5anim para las transformaciones <strong>de</strong>l esqueleto. Para ambos usaremos elscript <strong>de</strong> exportación creado por Der_Ton (<strong>de</strong> los foros <strong>de</strong> Doom3world).Lo primero es conseguir el script, actualizado para la versión 2.41 <strong>de</strong>Blen<strong>de</strong>r, <strong>de</strong>s<strong>de</strong>:http://www.doom3world.org/phpbb2/viewtopic.php?t=1711&postdays=0&postor<strong>de</strong>r=asc&start=60Antes <strong>de</strong> ejecutarlo haremos unos pequeños preparativos en nuestropersonaje para que todo funcione correctamente:● Situaremos el centro <strong>de</strong> nuestro personaje en 0,0,0● Situaremos el centro <strong>de</strong> la Armature en 0,0,0● Nos aseguraremos <strong>de</strong> que, almenos, hay una 3dview en los visores.● Haremos un smooth <strong>de</strong> la malla, seleccionando el mo<strong>de</strong>lo,pulsando f y luego “set smooth” en los botones <strong>de</strong> ediciónUna vez hecho esto abriremos el Text Editor para cargar el script, si esque no lo hemos colocado en el directorio .scripts <strong>de</strong> Blen<strong>de</strong>r (si lo hemoshecho po<strong>de</strong>mos acce<strong>de</strong>r a él directamente <strong>de</strong>s<strong>de</strong> la Scripts Window) y loejecutaremos con Alt+p. Bastará con que <strong>de</strong>finamos el tamaño, los frames<strong>de</strong> nuestra animación y el nombre <strong>de</strong> la misma y el directorio y nombredon<strong>de</strong> exportaremos el md5mesh y el md5anim.


Blen<strong>de</strong>r y Doom 3 [ 161 ]Figura 16. Izqda: Script para exportar a MD5. Drcha: Exportador al formato ASE.Exportar objetos a ASEAunque lo parezca no nos hemos olvidado <strong>de</strong> los objetos. Su creaciónes bastante similar con la <strong>de</strong> los personajes, aunque su proceso es mássencillo por no necesitar, generalmente, animación. En el caso <strong>de</strong> crear unobjeto animado <strong>de</strong>beremos tratarlo como un personaje (ejemplo: unaban<strong>de</strong>ra).Normalmente sólo <strong>de</strong>beremos preocuparnos <strong>de</strong> su mo<strong>de</strong>lado y texturizado.Dado su menor complejidad ambas tareas <strong>de</strong>berían ser mucho mássencillas que la creación <strong>de</strong> personajes.Para exportar objetos, que formen parte o que por si mismos constituyanun escernario, hacia Doom necesitaremos el exportador a ASE creado porGoofos. Dicho exportador po<strong>de</strong>is encontrarlo aquí:http://www.doom3world.org/phpbb2/viewtopic.php?t=9275&postdays=0&postor<strong>de</strong>r=asc&start=0Como con el exportador a md5 <strong>de</strong>beremos cumplir una serie <strong>de</strong>requisitos para que la exportación sea correcta:●●●●El mo<strong>de</strong>lo <strong>de</strong>berá tener coor<strong>de</strong>nadas UV.Si el objeto tiene un material asignado <strong>de</strong>beremos activar la opciónVcol Paint.Si el objeto no tiene un material asignados activaremos elVertColAsegurarnos <strong>de</strong> que la opción TexFace está activada en los botones<strong>de</strong> Editing.


[ 162 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DPreparando para importar el personaje en DoomEditEmpezaremos por el personaje. Tenemos los archivos que <strong>de</strong>finen elpersonaje y sus acciones, ahora <strong>de</strong>bemos crear una estructura <strong>de</strong>directorios y archivos, conectados entre sí, que sea reconocida por elDoomradiant (editor <strong>de</strong> niveles que viene con el juego original Doom3).Seguiremos los pasos siguientes:1. Crear una estructura <strong>de</strong> directorios como la <strong>de</strong>la imagen, substituyendo el directorio llamado“geisha” por el nombre <strong>de</strong>l mo<strong>de</strong>lo que estemoscreando.2. En el directorio >textures >nombrepersonajecolocaremos nuestras texturas.3. En el directorio >materials crearemos elarchivo nombrepersonaje.mtr con los parámetrossiguientes:nombre_<strong>de</strong>_material{qer_editorimage textures/nombrepersonaje/nombretextura.tgadiffusemap textures/nombrepersonaje/nombretextura.tgaspecularmap textures/nombrepersonaje/nombretextura.tgabumpmap textures/nombrepersonaje/nombretextura.tga}4. En el directorio >mo<strong>de</strong>ls>mapaobjects>md5 colocaremos elmd5mesh y el md5anim.5. Editaremos el md5mesh colocando el nombre_<strong>de</strong>_material usado en el.mtr substituyendo el que estaba entrecomillado en la línea <strong>de</strong>sha<strong>de</strong>r.mesh {sha<strong>de</strong>r "nombre_<strong>de</strong>_material"6. En el directorio ><strong>de</strong>f crearemos el archivo nombrepersonaje.<strong>de</strong>fcon los parámetros siguientes:mo<strong>de</strong>l nombrepersonaje {mesh mo<strong>de</strong>ls/mapobjects/md5/nombrepersonaje.md5meshanim idle mo<strong>de</strong>ls/mapobjects/md5/nombrepersonaje.md5anim}entityDef nombrepersonaje {"inherit" "func_animate""mo<strong>de</strong>l""nombrepersonaje"}


Blen<strong>de</strong>r y Doom 3 [ 163 ]7. Por último crearemos un archivo comprimido (zip) con los directorios<strong>de</strong>f, materials, mo<strong>de</strong>ls y textures. Cambiaremos la extensión <strong>de</strong>larchivo por .pk4, y lo copiaremos al directorio >base <strong>de</strong>l Doom3.Preparando para importar el objeto en DoomEditAl igual que para el personaje, para el objeto también necesitaremosuna estructura <strong>de</strong> directorios parecida. Vamos a ver los pasos a seguir:1. Crearemos los siguietnes directorios,substituyendo los llamados cubeBlen<strong>de</strong>r, <strong>de</strong>la imagen, con el nombre <strong>de</strong> nuestro objeto:2. En el directorio >textures>nombreobjetocolocaremos nuestras texturas.3. En el directorio >materials crearemos elarchivo nombreobjeto.mtr con losparámetros siguientes:textures\nombreobjeto\nombrematerial{qer_editorimage textures/nombreobjeto/nombretextura.tgadiffusemap textures/nombreobjeto/nombretextura.tgaspecularmap textures/nombreobjeto/nombretextura.tgabumpmap textures/nombreobjeto/nombretextura.tga}4. En el directorio >mo<strong>de</strong>ls>nombreobjeto colocaremos el archivo.ASE.5. Editaremos la ruta hacia las texturas <strong>de</strong>l archivo .ASE para que searelativa.6. Por último crearemos un archivo comprimido (zip) con los directoriosmaterials, mo<strong>de</strong>ls y textures. Cambiaremos la extensión <strong>de</strong>larchivo por .pk4, y lo copiaremos al directorio >base <strong>de</strong>l Doom3.Abriendo el DoomEditPodríamos usar el GTKRadiant, aunque ahora usaremos elDoomEditor que viene con el juego. Para abrirlo po<strong>de</strong>mos crear un accesodirecto con el siguiente path, respetando las comillas y el +editorDirectorio_instalación>doom3.exe” +editor


[ 164 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 17. Capturas <strong>de</strong> Doom3 con un personaje y un objeto creados en Blen<strong>de</strong>r.El uso <strong>de</strong> este editor podría llenar el contenido <strong>de</strong> toda una party, así que<strong>de</strong>jaré un enlace web para que se pueda investigar a partir <strong>de</strong> ahí, en lasiguiente URL: http://www.modwiki.net/wiki/DoomEditDe momento saber que ya po<strong>de</strong>mos cargar nuestros mo<strong>de</strong>los pulsando conel botón <strong>de</strong>recho <strong>de</strong>l ratón sobre el espacio <strong>de</strong> construcción ;­)Saltar al <strong>de</strong>sarrollo IndieHemos visto, <strong>de</strong> forma muy general, que tenemos la posiblidad <strong>de</strong> crearpersonajes, con Blen<strong>de</strong>r, para incluirlos en un mod, pack o mapa <strong>de</strong>lDoom3. La utilización <strong>de</strong> scripts <strong>de</strong> exportación permiten, hoy día, crearcontenidos gráficos, con Blen<strong>de</strong>r, para motores que son muy usados por lacomunidad Indie para la creación <strong>de</strong> vi<strong>de</strong>ojuegos. Quizás los másrepresentativos podrían ser el Torque o el Blitz3D (muy asequibles), y elOgre o el Irrlicht (GPL). Obviamente para el uso <strong>de</strong> estos motores ya senecesita un equipo <strong>de</strong> <strong>de</strong>sarrollo, o como mínimo la presencia <strong>de</strong> al menosun programador y un grafista.


Ren<strong>de</strong>rSección IVFotograma <strong>de</strong> la Película <strong>de</strong> Animación“Elephants Dream” realizada con Blen<strong>de</strong>r© Copyright 2006, Blen<strong>de</strong>r FoundationNetherlands Media Art Institutewww.elephantsdream.org


¢F12Ren<strong>de</strong>ring or...how to draw a monkey


Iluminando con YafrayAlejandro Conty EstévezFernando Arroba Rubioaconty@gmail.com - gnotxor@gmail.com ::En esta exposición vamos a ver cómo se comporta YafRaya la hora <strong>de</strong> realizar un ren<strong>de</strong>r y cómo po<strong>de</strong>moscontrolarlo <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r. Para ello trabajaremossiempre en modo “full” y <strong>de</strong>scribiremos cada uno <strong>de</strong> los controlesque soporta. Es <strong>de</strong>cir, partiendo <strong>de</strong> que en método “full” setienen en cuenta tanto la luz directa como la indirecta, nosencontramos con dos bloques <strong>de</strong> controles para ajustar esailuminación: la “cache” y los “fotones”. Abundaremos, por tanto,en cómo funcionan estos dos elementos.Para enten<strong>de</strong>r mejor el funcionamiento <strong>de</strong> YafRay nos <strong>de</strong>tendremos unpoco en cómo se <strong>de</strong>finen las luces y más concretamente en cómo influyedicha <strong>de</strong>finición en la aparición <strong>de</strong> “ruidos” y otro tipo <strong>de</strong> problemas en laescena. Por supuesto, también veremos cómo po<strong>de</strong>mos hacer frente a éstetipo <strong>de</strong> fenómenos y las mejores opciones para conseguir buenosresultados en tiempos <strong>de</strong> ren<strong>de</strong>r aceptables.¡Hágase la luz!Un raytracer intenta simular el comportamiento real <strong>de</strong> la luz cuandogenera las imágenes. Esta simulación <strong>de</strong>be equilibrarse entre la calidad <strong>de</strong>la imagen y el tiempo <strong>de</strong> ren<strong>de</strong>r. Por tanto, está también limitada a lamáquina sobre la que esté trabajando y otros factores. Por ejemplo, seríaimposible lanzar rayos <strong>de</strong>s<strong>de</strong> los objetos luminosos en infinitas direccionesy calcular su influencia con sus posibles rebotes, teniendo en cuenta quesólo son útiles esos cálculos en los pocos casos que estos interactuaran conla “cámara”. Así pues, la simulación se hace <strong>de</strong>s<strong>de</strong> el concepto contrario,averiguar qué intensidad y matiz tiene un punto <strong>de</strong>s<strong>de</strong> la posición <strong>de</strong> lacámara. Lo que implica algoritmos diferentes según el tipo <strong>de</strong> luz, con susventajas e inconvenientes.Cuando el origen <strong>de</strong> la luz es una fuente puntual se emplearán unosalgoritmos locales, rápidos <strong>de</strong> calcular y absolutamente pre<strong>de</strong>cibles. Sinembargo, este tipo <strong>de</strong> iluminación es menos realista, produce bor<strong>de</strong>s durosRen<strong>de</strong>r[ 167 ]


[ 168 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Den las sombras y la luz que producen estará poco matizada por rebotes.Otros tipos <strong>de</strong> luces son superficies, son más realistas y producen unasombra y penumbra mucho más matizadas. Sin embargo, el problema <strong>de</strong>este tipo <strong>de</strong> luces es la dificultad <strong>de</strong> cálculo. Los métodos que se empleanson “estocásticos”, también llamados <strong>de</strong> “montecarlo” o <strong>de</strong> “muestreo alazar”. Este método es lento pues consiste en tomar muestras <strong>de</strong>l entornodisparando rayos en todas las direcciones para calcular una media <strong>de</strong>intensidad y matiz <strong>de</strong>l color.Figura 1. Método <strong>de</strong> MontecarloComo se pue<strong>de</strong> ver representado en la figura 1, técnicas <strong>de</strong> montecarlo loque hacen es un muestreo aleatorio <strong>de</strong>l entorno, <strong>de</strong> manera similar alAmbient Occlusion, que captura la influencia <strong>de</strong> los posibles rebotes <strong>de</strong> luz<strong>de</strong>l ambiente.La luz que ilumina una escena no solo proce<strong>de</strong> <strong>de</strong> “fuentes <strong>de</strong> luz”propiamente dichas. En la realidad po<strong>de</strong>mos encontrarnos distintos tipos<strong>de</strong> luz: a) la que emite el cielo - no solo el sol <strong>de</strong> forma directa - y que lapo<strong>de</strong>mos simular mediante una imagen <strong>de</strong> fondo - sea HDR o no –; b) laque pue<strong>de</strong>n emitir distintos objetos <strong>de</strong>l entorno; y c) la que <strong>de</strong>vuelven otrosobjetos en los que rebota la luz. Para nuestro caso, todas estas luces setratarían como “luces no puntuales” y se calcularían por el métodomontecarlo.Como se pue<strong>de</strong> observar en la figura 2, la iluminación que proviene <strong>de</strong>todas partes <strong>de</strong>l cielo pue<strong>de</strong> producir una escena muy iluminada sinapenas matices <strong>de</strong> sombra. En este caso es el cielo un gran emisor <strong>de</strong> luz.


Iluminando con YafRay [ 169 ]Figura 2. Luz que proviene <strong>de</strong>l fondo.Figura 3. Luz proveniente <strong>de</strong> un objeto.En el caso <strong>de</strong> la figura 3 po<strong>de</strong>mos observar que la iluminación está muchomás matizada que en el caso anterior. Hay más contraste entre las zonasiluminadas y las zonas en sombra y entre ambas e<strong>xi</strong>ste una zona <strong>de</strong>penumbra con muchos matices. A<strong>de</strong>más hay que resaltar los matices <strong>de</strong>color que se aportan entre sí los distintos objetos.En este último caso, representado por la figura 4 po<strong>de</strong>mos observar, igualque en la figura 3, que la iluminación no proviene <strong>de</strong> una fuente <strong>de</strong> luzpuntual sino <strong>de</strong> una zona más amplia. Al contrario que en el caso anterior,la iluminación proviene <strong>de</strong> una zona intensamente iluminada <strong>de</strong> lahabitación. En último caso sí hay una fuente <strong>de</strong> luz pero la “iluminación” esindirecta, se basa en el rebote <strong>de</strong> la luz en las superficies.


[ 170 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 4. Luz proveniente <strong>de</strong> una zona iluminada.El ruidoEl ruido es un problema que aparece con cierta frecuencia en<strong>de</strong>terminadas escenas. Son una serie <strong>de</strong> manchas o contrastes <strong>de</strong> luz ysombra que se acentúan bajo algunas condiciones. La condición i<strong>de</strong>al paraque aparezca el ruido es la utilización <strong>de</strong> fuentes pequeñas y potentes. Elporqué aparece es fácil <strong>de</strong> enten<strong>de</strong>r: si la fuente <strong>de</strong> luz es pequeña esmenos probable <strong>de</strong> encontrar mediante el trazado <strong>de</strong> rayos aleatorio <strong>de</strong> lastécnicas montecarlo. Si un punto <strong>de</strong>terminado no encuentra la fuente <strong>de</strong>luz y el punto contiguo sí, aparecerá un contraste entre ellos (unoiluminado y el otro en sombra); dicho contraste será más acentuado si laluz es potente.Cuanto más pequeña sea la fuente <strong>de</strong> luz, más improbable será encontrarlapor “montecarlo”. Cuanto menor sea la probabilidad <strong>de</strong> encontrar la luz,más intenso será el ruido.Los casos típicos en los que aparecen ruidos son tres: 1) un objeto emisormuy pequeño (como se ha dicho antes); 2) una ventana muy pequeña (poridénticos motivos) y 3) un HDR con la luz muy concentrada.En realidad el problema no es el tamaño <strong>de</strong> la fuente <strong>de</strong> luz sino lavisibilidad <strong>de</strong> ésta <strong>de</strong>s<strong>de</strong> los distintos puntos <strong>de</strong> la escena. Es <strong>de</strong>cir, unafuente <strong>de</strong> luz lejana es más difícil <strong>de</strong> encontrar trazando rayos <strong>de</strong> maneraaleatoria, es <strong>de</strong>cir es menos visible; o, si se prefiere, el angulo visto <strong>de</strong>s<strong>de</strong> elpunto es más estrecho, como se aprecia a simple vista en la figura 5.


Iluminando con YafRay [ 171 ]Figura 5. La visibilidad: el verda<strong>de</strong>ro problema.Figura 6. Izqda: El cielo es totalmente visible. Es fácil acertar en la fuente <strong>de</strong> luz con unrayo. Drcha: No hay sombras muy marcadas ni contrastes, ni aparecen manchas ni ruidoen la imagen.Vamos a ver cómo afecta la visibilidad <strong>de</strong> la fuente <strong>de</strong> luz a la producción<strong>de</strong> ruido. Comenzaremos por una situación irreal en la que cualquier rayoencontrará la fuente <strong>de</strong> iluminación, en nuestro caso el cielo.Ahora vamos a tapar la mitad <strong>de</strong>l cielo. Eso dará como resultado que sóloel "50%" <strong>de</strong> los rayos alcancen la fuente <strong>de</strong> luz. Se pue<strong>de</strong> apreciar ciertoruido en el ren<strong>de</strong>r fruto <strong>de</strong> los contrastes entre los rayos que encuentran lafuente <strong>de</strong> luz (el cielo) y los que no, que apro<strong>xi</strong>madamente serán la mitad<strong>de</strong> los calculados.


[ 172 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 7. a) El cielo está parcialmente oculto. b) Aparece un poco <strong>de</strong> ruido en el ren<strong>de</strong>r.Figura 8. a) Cielo poco visible. b) Aparece mucho ruido.Si reducimos la proción <strong>de</strong> cielo visto, por ejemplo <strong>de</strong>s<strong>de</strong> una ventana lailuminación <strong>de</strong>crecerá, pues se ha restringido el número <strong>de</strong> rayos queinterceptarán la fuente <strong>de</strong> luz.Para compensar la disminución <strong>de</strong> la luz, se ha incrementado la potencia<strong>de</strong> la luz 8 veces.El ruido que aparece en la escena porque la fuente <strong>de</strong> luz es pequeña se veintensificado porque ha habido que incrementar la potencia <strong>de</strong> la luz paraconseguir la luminosidad <strong>de</strong>seada. A<strong>de</strong>más, las zonas que se encuentraniluminadas directamente por la fuente <strong>de</strong> luz aparecen quemadas.Reduciendo el ruidoCuando aparece este ruido intentamos reducirlo <strong>de</strong> la manera más obvia.Subimos la “Quality” en el panel <strong>de</strong> YafRay. Esto soluciona algunos casos,pues hay que tener en cuenta que dicho control incrementa el número <strong>de</strong>“samples”. Un mayor número <strong>de</strong> samples incrementa la probabilidad <strong>de</strong>encontrar una luz cuando esta es pequeña, sin embargo hay un problema:el tiempo <strong>de</strong> ren<strong>de</strong>r se incrementa notablemente. Mientras el tiempo <strong>de</strong>


Iluminando con YafRay [ 173 ]ren<strong>de</strong>r aumenta linealmente, el ruido <strong>de</strong>crecerá en 1/samples .Por lo tanto habría que utilizar este método con cuidado y ayudarse con losfotones y con el “refinement” <strong>de</strong> la caché.Qué hacer cuando las luces son pequeñasNormalmente el problema <strong>de</strong> tener fuentes <strong>de</strong> luz pequeñas se sueleproducir en escenas interiores don<strong>de</strong> la luz pue<strong>de</strong> provenir <strong>de</strong> pequeñasfuentes <strong>de</strong> luz artificial o <strong>de</strong> ventanas. Para ayudarnos en este tipo <strong>de</strong>ren<strong>de</strong>r po<strong>de</strong>mos utilizar los fotones. No hay que confundir esto con losfotones que utilizamos para generar cáusticas.Básicamente lo que hacemos con el uso <strong>de</strong> un buen mapa <strong>de</strong> fotones esdarle información extra al método montecarlo, como <strong>de</strong> don<strong>de</strong> proviene laluz o estimaciones <strong>de</strong> luz indirecta, con lo que a<strong>de</strong>más nos ahorramos losrebotes.Figura 9. Lanzamos fotones <strong>de</strong>s<strong>de</strong> las fuentes <strong>de</strong> luz y rebotan<strong>de</strong>jando marcas, con esas marcas hacemos el mapa <strong>de</strong> fotones.El mapa <strong>de</strong> fotones se pue<strong>de</strong> obtener visualmente teniendo seleccionado elbotón “Tune Photons” en el panel GI <strong>de</strong> YafRay. Este mapa es unaapro<strong>xi</strong>mación a cómo quedará el ren<strong>de</strong>r final. Es muy recomendableacostumbrarse cuando iluminamos a trazar este mapa para la escena, puesnos aportará información valiosísima para conseguir la distribución <strong>de</strong> luzque queremos.


[ 174 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 10. Ejemplo <strong>de</strong> mapa <strong>de</strong> fotones.Configurar los fotonesPara configurar los fotones <strong>de</strong>bemos seguir unos pasos muy sencillos.Lo primero <strong>de</strong> todo es activar el botón fotones en el panel <strong>de</strong> YafRay. Losiguiente es escoger un número y un radio.En este punto hay que hacer algunas consi<strong>de</strong>raciones, pues cuantos másfotones lancemos más preciso será el mapa, sin embargo tambiénaumentará el tiempo <strong>de</strong> cálculo. Cuantos más fotones empleemos másprecisión y menos manchas o ruido tendremos en nuestra escena. Encuanto al radio, cuanto más gran<strong>de</strong>s son más suave será el mapa <strong>de</strong>fotones, pero eso no <strong>de</strong>be engañarnos pues también estaremos siendomenos precisos.¿Cuántos fotones usar y con qué radio? Pues <strong>de</strong>pen<strong>de</strong> fundamentalmente<strong>de</strong> dos parámetros. Uno es el tamaño físico <strong>de</strong> la escena en unida<strong>de</strong>s, no encomplejidad. Otro es la precisión que queremos alcanzar.Como hemos dicho los parámetros óptimos <strong>de</strong>pen<strong>de</strong>n <strong>de</strong> la escenaconcreta y por tanto no se pue<strong>de</strong>n dar recetas mágicas sobre cómohacerlos. Pero al menos sí sabemos cómo <strong>de</strong>be ser un buen mapa <strong>de</strong>fotones. Debe tener dos características fáciles <strong>de</strong> enten<strong>de</strong>r:


Iluminando con YafRay [ 175 ]1. No tener light leaks o “agujeros <strong>de</strong> luz” visibles. Es <strong>de</strong>cir, zonas <strong>de</strong>luz que aparecen en sitios que se suponen <strong>de</strong>berían estar enpenumbra. Esto suele suce<strong>de</strong>r cuando el radio <strong>de</strong> los fotones es<strong>de</strong>masiado gran<strong>de</strong> para la escena y sobrepasa notablemente eltamaño <strong>de</strong> los objetos, por lo que los fotones pue<strong>de</strong>n estaratravesandolos.2. Debe ser tan suavizado como sea posible. Recordamos que siutilizamos un radio <strong>de</strong> fotón <strong>de</strong>masiado gran<strong>de</strong> el mapa quedarásuavizado pero estaremos perdiendo precisión en la iluminación.Un buen ejemplo <strong>de</strong> mapa <strong>de</strong> fotones suavizado es el <strong>de</strong> la figura10.Figura 11.Arriba-Izq: Mapa <strong>de</strong> fotones con radio 1.0Arriba-Dch: Mapa <strong>de</strong> fotones con radio 0.7Abajo-Izq: Mapa <strong>de</strong> fotones con radio 0.4En otras palabras, <strong>de</strong>bemos utilizar un radio <strong>de</strong> fotón lo más gran<strong>de</strong>posible para que que<strong>de</strong> suave pero cuidando <strong>de</strong> que no aparezcan lightleaks.El tener un buen mapa <strong>de</strong> fotones es fundamental para el ahorro <strong>de</strong> tiempo<strong>de</strong> ren<strong>de</strong>r. Cuando YafRay se dispone a trabajar con las técnicas <strong>de</strong>montecarlo lanzando rayos <strong>de</strong> forma aleatoria, encuentra que e<strong>xi</strong>ste unmapa <strong>de</strong> fotones. En lugar <strong>de</strong> ponerse a calcular rebotes para encontrar lasfuentes <strong>de</strong> luz, lee ese mapa <strong>de</strong> fotones que ya tiene calculados laluminosidad y color <strong>de</strong> la zona. Con esos datos no necesita continuar conlos cálculos, ni saber dón<strong>de</strong> están situadas las luces.


[ 176 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 12. El resultado <strong>de</strong>l mapa <strong>de</strong> fotones <strong>de</strong> la figura 10.Casos comunes don<strong>de</strong> pue<strong>de</strong>n ayudar los fotonesNos po<strong>de</strong>mos encontrar con varios casos en los que los fotones nos pue<strong>de</strong>nser <strong>de</strong> gran ayuda. Por ejemplo cuando necesitamos pequeñas zonasiluminadas en la escena po<strong>de</strong>mos utilizar luces tipo spot y omni comoemisores <strong>de</strong> fotones. Cuando necesitamos simular que el emisor es unobjeto po<strong>de</strong>mos utilizar luces <strong>de</strong> área y configurarlas como emisores <strong>de</strong>fotones. Igual po<strong>de</strong>mos utilizar las luces <strong>de</strong> área si lo que nos interesa essimular la entrada <strong>de</strong> luz por una ventana.Pequeñas zonas iluminadas: estudio <strong>de</strong> dos casos.El primer caso es cuando tenemos una ventana por la que entra el sol.En este caso se iluminará directamente una pequeña área <strong>de</strong> la habitación,sin embargo el resto <strong>de</strong> la habitación <strong>de</strong>bería estar iluminada <strong>de</strong> formaindirecta.


Iluminando con YafRay [ 177 ]Figura 13. Izqda: El sol entrando por una ventana.Drcha: Sustituyendo el sol por una spot.Figura 14. Izqda: Iluminación interior · Drcha: Iluminación interior con spots.En la figura 13 (Izqda) po<strong>de</strong>mos apreciar un esquema <strong>de</strong> ilustrativo <strong>de</strong> estecaso. Para simularlo po<strong>de</strong>mos emplear el método <strong>de</strong>scrito en la figura 13(Drcha).El otro caso que vemos es el <strong>de</strong> iluminación interior. En este caso elproblema es muy similar: aparece una pequeña zona iluminadadirectamente. Como en el caso anterior utilizaremos luces tipo spot oincluso omni, pues en este supuesto los fotones no escaparán <strong>de</strong> la escena.Como en el caso anterior <strong>de</strong>beremos colocar cada luz en el sitio natural <strong>de</strong>la escena. Si tenemos luces con pantallas como en la figura 14, esaconsejable utilizar spots para simularlas. Sin embargo, es mejor utilizarluces <strong>de</strong> tipo omni en el supuesto <strong>de</strong> que sean puntos <strong>de</strong> luz sin apantallarcomo es el caso <strong>de</strong> muchas lámparas cuyas bombillas se encuentran al aire.


[ 178 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DObjetos emisoresEn otras ocasiones nos encontramos con objetos que emiten luz,algunos <strong>de</strong> geometrías complicadas. Estos objetos pue<strong>de</strong>n ser <strong>de</strong>s<strong>de</strong>simples plafones a complicados anuncios <strong>de</strong> neón. Simularlos pue<strong>de</strong> serpor tanto muy sencillo o muy trabajoso <strong>de</strong>pendiendo <strong>de</strong> esos factores.I<strong>de</strong>ntificar dichos objetos en una escena 3D es sencillo, son todos losobjetos cuyo emit esté activado. Para simularlos emplearemos una o másluces <strong>de</strong> área. Lo i<strong>de</strong>al sería conseguir una luz <strong>de</strong> área que se ajustase alobjeto lo más fielmente posible, por lo tanto: si el objeto es cuadrado nosbastará con una, si es más complejo tendremos que utilizar varias paracubrir toda la superficie <strong>de</strong>l objeto lo mejor posible.Por supuesto, el color <strong>de</strong> la luz emitida por dichas áreas <strong>de</strong>be coincidir conel <strong>de</strong>l objeto. Y por último, el power <strong>de</strong>be estar fijado a 1.0. Tenemos laten<strong>de</strong>ncia <strong>de</strong> subir el power cuando encontramos zonas mal iluminadas enel ren<strong>de</strong>r. Esto produce un efecto <strong>de</strong> quemado en las zonas cercanas a la luzpero sigue manteniendo las otras zonas más oscuras. Si utilizando losfotones y sus rebotes no mejora la iluminación, <strong>de</strong>bemos comprobar que laluz no se encuentre bloqueada por algún objeto o, incluso, agregariluminación <strong>de</strong> relleno.Para simular objetos emisores emplearemos, como ya se ha dicho, almenos una luz <strong>de</strong> área, que <strong>de</strong>beremos situar lo más cerca posible <strong>de</strong>lobjeto emisor pero cuidando que no se solape con el mismo. Si se solapapue<strong>de</strong>n aparecer efectos extraños o incluso no tener ningún efecto si losfotones quedan bloqueados por el objeto emisor.Figura 15. Arealight cubriendo un objeto emisor.


Iluminando con YafRay [ 179 ]Figura 16. Cubriendo una ventana con una luz <strong>de</strong> área.Luz difusa por una ventanaOtro caso similar es la entrada <strong>de</strong> luz difusa proce<strong>de</strong>nte <strong>de</strong>l cielo <strong>de</strong>s<strong>de</strong>una ventana. Como en los casos anteriores utilizaremos al menos una luz<strong>de</strong> área para cubrir la ventana. Bastará con una si la ventana es sencilla,aunque tendremos que utilizar varias para ventanas complejas, aunqueuna simple apro<strong>xi</strong>mación será suficente.Como en los casos anteriores, <strong>de</strong>bemos situar la luz <strong>de</strong> área lo más cercaposible <strong>de</strong> la ventana, apuntando hacia a<strong>de</strong>ntro, cubriendo toda lasuperficie pero a la vez intentando que se escapen el menor número <strong>de</strong>fotones posible. El color <strong>de</strong>l área <strong>de</strong>be ser el mismo que presente el cielo yel power <strong>de</strong>be estar fijado a 1.¿Y ahora qué?...Bueno, hasta aquí hemos visto cómo utilizar distintos tipos <strong>de</strong> luz parasimular fuentes <strong>de</strong> fotones. Vamos ahora a pensar como el usuario medio...Supongamos que hemos realizado una escena don<strong>de</strong> las fuentes <strong>de</strong> luz sonpequeñas y queremos optimizar el ren<strong>de</strong>r.Haciendo caso <strong>de</strong> lo visto hasta ahora <strong>de</strong>cidimos que vamos a utilizar losfotones. Así pues, nos aseguramos <strong>de</strong> que todas las fuentes <strong>de</strong> luz pue<strong>de</strong>nemitir fotones cambiando las que sean necesarias por spot u omni, ycolocando luces <strong>de</strong> área para simular objetos emisores, ventanas...


[ 180 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DTambién hemos configurado un número <strong>de</strong> fotones y un radio racionales(500.000 y 0,5 para empezar, por ejemplo). Una vez hecho todo esto,activamos el botón tune photons para conseguir el famoso mapa <strong>de</strong>fotones... ¿y ahora qué hacemos?Pues lo primero será comparar el mapa <strong>de</strong> fotones que hemos obtenido conun ren<strong>de</strong>r <strong>de</strong> baja calidad. Si tienen la misma intensidad estamos en elbuen camino, pero si no coinci<strong>de</strong> tendremos que revisar nuestras lucespara comprobar que no nos hemos olvidado <strong>de</strong> activar algún color enalguna fuente <strong>de</strong> luz (también podría ser un bug <strong>de</strong> YafRay). Si siguenapareciendo light leaks pue<strong>de</strong> ser <strong>de</strong>bido a un mo<strong>de</strong>lado no sólido, por loque tendríamos que revisar la geometría <strong>de</strong> nuestra escena.Hasta aquí está todo más o menos claro, pero ... ¿Se pue<strong>de</strong> refinar aún másla imagen? Pues sí, vamos a verlo.Irradiance CachePara refinar un poco más la imagen contamos con la ayuda <strong>de</strong>lirradiance cache. Para po<strong>de</strong>r utilizarlo correctamente vamos a ver primerocómo funciona.El irradiance cache evita tener que calcular la iluminación global en cadapixel. Básicamente lo que hace es seleccionar algunos pixeles para realizarlos cálculos y luego interpola. Esta interpolación disolverá un poco elruido, sin embargo, también pue<strong>de</strong> producir ruido <strong>de</strong> baja frecuencia(nubes). En animaciones, esta interpolación produce parpa<strong>de</strong>os bastantemolestos, aunque funciona bien y reduce el tiempo <strong>de</strong> ren<strong>de</strong>r en imágenesestáticas.Figura 17. Configuración <strong>de</strong>l cache.


Iluminando con YafRay [ 181 ]Para activar el cache necesitamos tener seleccionado el método full yactivar el botón Cache para acce<strong>de</strong>r a todos los parámetros <strong>de</strong>configuración. Para enten<strong>de</strong>r mejor como funciona vamos a ver las etapas<strong>de</strong>l ren<strong>de</strong>r:1. Fase <strong>de</strong> disparo <strong>de</strong> fotones. Des<strong>de</strong> cada emisor potencial quehaya en la escena se comienzan a lanzar los fotones; repartidosequitativamente entre los emisores.2. Primer pase <strong>de</strong> ren<strong>de</strong>r (fake pass). El parámetro “Prec”<strong>de</strong>termina cada cuántos pixels calculará la cantidad <strong>de</strong> luz, aunqueen las esquinas tomará más muestras.3. Etapa <strong>de</strong> refinamiento (2 fake passes más). En este pasoi<strong>de</strong>ntifica cambios bruscos <strong>de</strong> luz que superen el valor<strong>de</strong>terminado por Refinement. Cuando encuentra valoressuperiores al refinado lo que hace el programa es realizar un “antialias”<strong>de</strong> la luz tomando más muestras.4. Fase final. Interpola con el cache resultante y genera la imagen.Ahora que compren<strong>de</strong>mos mejor los pasos <strong>de</strong>l ren<strong>de</strong>r, vamos a <strong>de</strong>tallar unpoquito más los parámetros y su funcionamiento.Por ejemplo, la calidad <strong>de</strong> las sombras. Shadow quality <strong>de</strong>be ser un valorentre 0 y 1, aunque el valor ajustado por <strong>de</strong>fecto es 0.900 que ha<strong>de</strong>mostrado servir para casi cualquier escena. Lo que hace este parámetroes controlar como crece la <strong>de</strong>nsidad <strong>de</strong> muestras en las esquinas; por tanto,a más muestras, a un valor más alto, mayor <strong>de</strong>finición <strong>de</strong> las sombras enlas esquinas. Por lo tanto, teniendo ajustado el valor por <strong>de</strong>fecto, es mejor<strong>de</strong>jar que sea el refinamiento el que mejore el resultado.Figura 18. Distribución <strong>de</strong> muestras.


[ 182 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DPara utilizar el Refinement tenemos un valor entre 0 y 1 también. Como yase a<strong>de</strong>lantó antes al ver los pasos <strong>de</strong>l ren<strong>de</strong>r, este parámetro <strong>de</strong>termina quécambios <strong>de</strong> luz serán refinados. Cuando se produce un cambio <strong>de</strong> luz quesupera el valor establecido, como en los bor<strong>de</strong>s <strong>de</strong> las sombras o losartefactos <strong>de</strong>bidos a bajo número <strong>de</strong> muestras, se realiza el refinado. Eneste caso, el pase se repite dos veces. Si establecemos el valor <strong>de</strong>refinement a 1, estaremos <strong>de</strong>sactivando el refinamiento, mientras que si loestablecemos a 0.03, por ejemplo, el refinamiento será exhaustivo.Figura 19. Arriba: Ren<strong>de</strong>r original, sin refinamiento.Abajo: Ren<strong>de</strong>r con refinamiento a 0,05.


Iluminando con YafRay [ 183 ]Figura 20. Después <strong>de</strong> incrementar la calidad a high.Hemos conseguido que las sobras estén más matizadas, más suavizadas,pero aún queda algo <strong>de</strong> “suciedad” por la escena, aunque ya no está situadaen los bor<strong>de</strong>s <strong>de</strong> las sombras. ¿Qué po<strong>de</strong>mos hacer para “limpiar” laescena? Pues se nos pue<strong>de</strong>n ocurrir dos cosas: la primera es suavizar elmapa <strong>de</strong> fotones y la otra es subir los samples (Quality).Lo <strong>de</strong> suavizar el mapa <strong>de</strong> fotones tampoco nos servirá <strong>de</strong> mucho, puespasado un cierto punto, o dicho <strong>de</strong> otro modo, suavizado en exceso,aparecerán “light leaks”.CáusticasHay dos manera <strong>de</strong> conseguir cáusticas con yafray, <strong>de</strong>s<strong>de</strong> una luz puntual o<strong>de</strong>s<strong>de</strong> un objeto, cielo o fuente no puntual.Cuando las cáusticas las queremos conseguir <strong>de</strong>s<strong>de</strong> una fuente puntual esimprescindible que utilicemos una “photonlight” explícita.Si las cáusticas las estamos trabajando con fuentes <strong>de</strong> luz no puntuales noes necesario utilizar una photonlight, sino la forma <strong>de</strong> trabajo con fotonesque se ha <strong>de</strong>scrito anteriormente con algunas matizaciones. Trabajando en


[ 184 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Del método full <strong>de</strong>beríamos conseguir las cáusticas sin ningún tipo <strong>de</strong>problema. Sin embargo, es recomendable que las fuentes <strong>de</strong> luz no seanmuy pequeñas. A<strong>de</strong>más tendremos que vigilar el parámetro CDepth yaumentarlo si fuera preciso.Figura 21. Causticas <strong>de</strong>s<strong>de</strong> una ventana.


YafRid: Sistema Grid para ren<strong>de</strong>rQJose Antonio Fernán<strong>de</strong>z SorribesCarlos González Morcillojosean_f<strong>de</strong>z_sorribes@yahoo.es ::El último paso en el proceso para la generacióon <strong>de</strong> imágenesy animaciones 3D por or<strong>de</strong>nador es el llamadoren<strong>de</strong>r. En esta fase se genera una imagen bidimensional(o un conjunto <strong>de</strong> imágenes en el caso <strong>de</strong> las animaciones) apartir <strong>de</strong> la <strong>de</strong>scripción <strong>de</strong> una escena 3D. Para la obtención <strong>de</strong>imágenes fotorrealistas se utilizan algoritmoscomputacionalmente e<strong>xi</strong>gentes como el trazado <strong>de</strong> rayos.En los proyectos relacionados con la “síntesis <strong>de</strong> imágenes”, la etapa <strong>de</strong>ren<strong>de</strong>r se suele consi<strong>de</strong>rar el cuello <strong>de</strong> botella <strong>de</strong>bido al tiempo necesariopara llevarla a cabo. Generalmente, el problema se resuelve usando granjas<strong>de</strong> ren<strong>de</strong>r que pertenecen a empresas <strong>de</strong>l sector en las que los frames <strong>de</strong>una animación se distribuyen en distintos or<strong>de</strong>nadores. El presenteproyecto ofrece una alternativa para acometer el ren<strong>de</strong>r tanto <strong>de</strong>animaciones como <strong>de</strong> imagenes basada en computación grid. Para ello seha <strong>de</strong>sarrollado un sistema en el que tienen cabida or<strong>de</strong>nadores heterogéneostanto en software como en hardware, distribuidos geográficamente yconectados al grid via internet.ObjetivosEl objetivo principal <strong>de</strong>l presente proyecto es el <strong>de</strong> construir un prototipofuncional <strong>de</strong> un sistema se ren<strong>de</strong>r distribuido basado en computación gridoptimizando el tiempo necesario para llevar a cabo el proceso. A<strong>de</strong>más <strong>de</strong>este objetivo fundamental, e<strong>xi</strong>ste una serie <strong>de</strong> objetivos complementariosque son <strong>de</strong>scritos a continuación.Arquitectura multiplataformaEste sistema <strong>de</strong>be estar <strong>de</strong>sarrollado sobre una arquitectura quepermita su funcionamiento en distintos sistemas operativos y conin<strong>de</strong>pendiente <strong>de</strong>l hardware. Esto permitirá tener un grid heterogéneo entodos los sentidos ya que cualquier or<strong>de</strong>nador con cone<strong>xi</strong>ón a internet esun potencial proveedor <strong>de</strong> servicio. Es en este aspecto don<strong>de</strong> se aleja <strong>de</strong> losclásicos clusters <strong>de</strong> or<strong>de</strong>nadores.Ren<strong>de</strong>r[ 185 ]


[ 186 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DIn<strong>de</strong>pen<strong>de</strong>ncia <strong>de</strong>l motor <strong>de</strong> ren<strong>de</strong>rAunque el sistema se orientará a su utilización con dos motores <strong>de</strong>ren<strong>de</strong>r en concreto (Yafray y el que posee Blen<strong>de</strong>r 3D), el <strong>de</strong>sarrollo se<strong>de</strong>be realizar <strong>de</strong> forma que sea posible añadir nuevos motores <strong>de</strong> ren<strong>de</strong>rsin excesivo esfuerzo.Varias granularidada<strong>de</strong>sEl sistema <strong>de</strong>sarrollado <strong>de</strong>be permitir la distribución <strong>de</strong>l ren<strong>de</strong>r tanto<strong>de</strong> imágenes como <strong>de</strong> animaciones completas. Las unida<strong>de</strong>s mínimas <strong>de</strong>distribución, <strong>de</strong>nominadas unida<strong>de</strong>s <strong>de</strong> trabajo, serán el fragmento <strong>de</strong>frame y el frame respectivamente.Interfaz webLa mayor parte <strong>de</strong> la funcionalidad <strong>de</strong>l sistema <strong>de</strong>be ser controlable viaweb. Esto aporta una ventaja clave para ser realmente utilizado por lacomunidad <strong>de</strong> usuarios ya que no es necesario instalar ningún software,cualquier navegador es suficiente.Grupos <strong>de</strong> UsuariosSe <strong>de</strong>be po<strong>de</strong>r permitir la creación <strong>de</strong> grupos <strong>de</strong> usuarios (clientes yproveedores) con el fin <strong>de</strong> ajustar qué proveedores atien<strong>de</strong>n a quéproyectos. Mediante esta utilidad se pue<strong>de</strong>n establecer subgrupos privados<strong>de</strong> proveedores que proporcionan servicio a los proyectos <strong>de</strong> <strong>de</strong>terminadosclientes.Priorida<strong>de</strong>sSe establecerá a<strong>de</strong>más una sistema <strong>de</strong> priorida<strong>de</strong>s <strong>de</strong> los proveedores ylos clientes con respecto a los grupos a los que pertenecen.DiseñoUn a<strong>de</strong>cuado diseño <strong>de</strong>l sistema permitirá que en un futuro se añadannuevas funcionalida<strong>de</strong>s o se mejoren las e<strong>xi</strong>stentes <strong>de</strong> una forma sencilla.El uso <strong>de</strong> una división en capas y patrones <strong>de</strong> diseño así como la e<strong>xi</strong>stencia<strong>de</strong> una completa documentación facilitarán futuros <strong>de</strong>sarrollos.UsabilidadTanto el software <strong>de</strong>l proveedor como el interfaz web que son los dosmedios principales a través <strong>de</strong> los cuales el usuario interactúa con elsistema <strong>de</strong>ben ser fáciles <strong>de</strong> usar. Se tratará <strong>de</strong> realizar interfaces cómodase intuitivas.


YafRid: Sistema Grid para Ren<strong>de</strong>r [ 187 ]Figura 1. Ciclo <strong>de</strong> interacción en un grid computacional.Instalación sencilla <strong>de</strong> proveedorEl software necesario para que un usuario se convierta en proveedor ypase a formar parte <strong>de</strong>l grid <strong>de</strong>be ser sencillo <strong>de</strong> instalar y configurar en lasdistintas plataformas disponibles. Se intentará reducir el tiempo <strong>de</strong>dicadoa estas dos tareas al mínimo posible.Inicio automáticoA fin <strong>de</strong> que colaborar con el grid requiera el menor esfuerzo posible,se ha <strong>de</strong> configurar el software <strong>de</strong> modo que al iniciar el sistema, se inicieel software para que el usuario no tenga que estar pendiente.ArquitecturaEl tipo <strong>de</strong> grid más a<strong>de</strong>cuado para implementar la distribución <strong>de</strong>l ren<strong>de</strong>r<strong>de</strong> una escena entre múltiples máquinas es el grid computacional. Estose <strong>de</strong>duce <strong>de</strong> las características <strong>de</strong>l ren<strong>de</strong>r, caracterizado por ser unproceso muy intensivo en términos <strong>de</strong> consumo <strong>de</strong> CPU.Conceptualmente, los componentes mínimos <strong>de</strong> un grid computacional sonlos siguientes:●●Distribuidor. Constituye el corazón <strong>de</strong>l grid. Su principal tareaes la <strong>de</strong> tomar los trabajos <strong>de</strong> la cola y distribuirlos entre losproveedores <strong>de</strong> la forma más conveniente posible.Proveedor <strong>de</strong> servicio. Esta entidad es responsable <strong>de</strong>lprocesamiento real <strong>de</strong> las peticiones <strong>de</strong> los clientes.


[ 188 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D●Figura 2. Arquitectura general <strong>de</strong>l sistema Yafrid.Cliente. Un cliente es una entidad externa que no pertenece alsistema en un sentido estricto. Su papel en el funcionamiento <strong>de</strong>lgrid pasa por enviar trabajos al sistema para ser realizados por losproveedores. Estos trabajos son almacenados en una cola <strong>de</strong> lacual el distribuidor irá elegiendo las pró<strong>xi</strong>mas peticiones en serprocesadas.Estos componentes interactúan en un ciclo que se muestraesquemáticamente en la Figura 1.La arquitectura <strong>de</strong>sarrollada para soportar el sistema distribuido <strong>de</strong> ren<strong>de</strong>rYafrid se muestra en la Figura 2. A continuación se realiza unaintroducción general a esta arquitectura cuyos componentes seránampliamente analizados en sus respectivas secciones.Servidor YafridEl Servidor Yafrid es el nodo fundamental alre<strong>de</strong>dor <strong>de</strong>l cual seestablece el sistema <strong>de</strong> ren<strong>de</strong>r Yafrid. Cada uno <strong>de</strong> los proveedores seconecta a este nodo para hacer que sus ciclos <strong>de</strong> CPU puedan ser usadospara ren<strong>de</strong>rizar las escenas enviadas al grid por los clientes.El Servidor <strong>de</strong> Yafrid se ha <strong>de</strong>sarrollado sobre una arquitectura en la que,<strong>de</strong> forma general, se pue<strong>de</strong>n distinguir cuatro capas o niveles. Estas capasson, <strong>de</strong> menor a mayor nivel <strong>de</strong> abstracción, las siguientes:


YafRid: Sistema Grid para Ren<strong>de</strong>r [ 189 ]●●●●Capa <strong>de</strong> Recursos.Capa <strong>de</strong> Servicios.Capa Yafrid.Capa <strong>de</strong> Usuario.Es en la tercera <strong>de</strong> estas capas don<strong>de</strong> el verda<strong>de</strong>ro Servidor Yafridresi<strong>de</strong>. El resto <strong>de</strong> capas se consi<strong>de</strong>ran capas <strong>de</strong> soporte pero sonigualmente indispensables para la implantación <strong>de</strong>l sistema en un entornoreal.Capa <strong>de</strong> RecursosEs la capa que tiene el nivel <strong>de</strong> abstracción más bajo y la que posee unarelación más estrecha con el sistema operativo. La capa <strong>de</strong> recursosengloba los siguientes componentes:●●●Sistema <strong>de</strong> Base <strong>de</strong> Datos. Formado por una base <strong>de</strong> datos enla que están contenidas las distintas tablas para el correctofuncionamiento <strong>de</strong>l sistema. E<strong>xi</strong>sten numerosas tablas que sepue<strong>de</strong>n agrupar atendiendo a su utilidad. Mientras que unas seusan para mantener datos a partir <strong>de</strong> los cuales se obtendránestadísticas otras mantienen los datos que ayudan a la gestión <strong>de</strong>usuarios, grupos, proyecto, etc. Hay un tercer grupo quepodríamos llamar internas o <strong>de</strong> operación que mantienen datosimprescindibles para el funcionamiento <strong>de</strong>l sistema como porejemplo los datos <strong>de</strong> cone<strong>xi</strong>ón <strong>de</strong> los proveedores o las características<strong>de</strong> sus sistemas. Los componentes <strong>de</strong> capas superiores acce<strong>de</strong>na todos estos datosa través <strong>de</strong> un servidor <strong>de</strong> base <strong>de</strong> datos. Laactual implementación <strong>de</strong> Yafrid utiliza MySQL.Sistema <strong>de</strong> Archivos. En ocasiones es necesario acce<strong>de</strong>r alsistema <strong>de</strong> archivos <strong>de</strong>s<strong>de</strong> capas superiores. Básicamente, sepue<strong>de</strong>n distinguir dos tipos <strong>de</strong> directorios. Por un lado, haydirectorios que se usan para almacenar las unida<strong>de</strong>s <strong>de</strong> trabajopertenecientes a un proyecto lanzado. Los proveedores acce<strong>de</strong>rána este directorio vía SFTP para recibir los ficheros fuente necesariospara llevar a cabo el ren<strong>de</strong>r. Estos directorios forman elllamado POOL <strong>de</strong> unida<strong>de</strong>s <strong>de</strong> trabajo. La otra categoría la formanaquellos directorios que contienen la información sobre losusuarios y sus proyectos.Sistema <strong>de</strong> Red. El módulo <strong>de</strong>dicado a las comunicaciones quepertenece a la capa principal oculta la utilización <strong>de</strong> los recursos <strong>de</strong>red <strong>de</strong>l or<strong>de</strong>nador por medio <strong>de</strong> un middleware (laimplementación actual utiliza ICE).


[ 190 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DCapa <strong>de</strong> ServiciosBásicamente, esta capa contiene los diferentes servidores que permitena los módulos <strong>de</strong> capas superiores acce<strong>de</strong>r a los recursos que pertenecen ala capa por <strong>de</strong>bajo <strong>de</strong> ésta. En este nivel se pue<strong>de</strong>n encontrar los siguienteservidores:●●●Servidor HTTP. El módulo Yafrid­WEB se establece sobre esteservidor. Como el módulo Yafrid­WEB se ha confeccionadousando páginas dinámicas escritas en un lenguaje <strong>de</strong> scriptorientado al <strong>de</strong>sarrollo web (en la implementación actual se hautilizado PHP), el servidor web <strong>de</strong>be tener soporte para estelenguaje. También es necesario soporte para la composición <strong>de</strong>gráficos y para acceso a base <strong>de</strong> datos.Servidor <strong>de</strong> bases <strong>de</strong> datos. Este servidor se usa por losdiferentes módulos <strong>de</strong> Yafrid para acce<strong>de</strong>r a datos imprescindiblespara la operación <strong>de</strong>l sistema.Servidor SFTP. Accedido por los distintos proveedores <strong>de</strong>servicio para obtener los ficheros fuente necesarios para llevar acabo los trabajos <strong>de</strong> ren<strong>de</strong>r. Una vez que el ren<strong>de</strong>r haya finalizado,se usará el servidor SFTP para enviar <strong>de</strong> vuelta al servidor las imágenesresultantes.Capa YafridConstituye la capa principal <strong>de</strong>l servidor y está compuesta básicamentepor dos módulos diferentes que funcionan <strong>de</strong> forma in<strong>de</strong>pendiente el uno<strong>de</strong>l otro. Estos módulos se <strong>de</strong>nominan Yafrid­WEB y Yafrid­CORE.Yafrid-WEBConstituye el módulo interactivo <strong>de</strong>l servidor y ha sido <strong>de</strong>sarrolladocomo un conjunto <strong>de</strong> páginas dinámicas escritas usando HTML y unlenguaje <strong>de</strong> script orientado a <strong>de</strong>sarrollo web.En términos <strong>de</strong> acceso al sistema, se han <strong>de</strong>finido tres roles <strong>de</strong> usuarioque <strong>de</strong>terminan los privilegios <strong>de</strong> acceso <strong>de</strong> los usuarios a la intefaz web <strong>de</strong>Yafrid. Estos roles junto con las funcionalida<strong>de</strong>s a las que dan acceso son:1. Cliente. Tener este rol permite a un usuario el envío <strong>de</strong>trabajos <strong>de</strong> ren<strong>de</strong>r al grid. Un cliente es también capaz <strong>de</strong> creary gestionar grupos a los que otros clientes y proveedores sepue<strong>de</strong>n suscribir. Cuando un proyecto se crea, se le pue<strong>de</strong>asignar un grupo privado. En este caso, sólo los proveedorespertenecientes al mismo grupo pue<strong>de</strong>n tomar parte en elren<strong>de</strong>r <strong>de</strong>l proyecto. A<strong>de</strong>más, se generan diversas estadísticascon la información relativa a los proyectos <strong>de</strong>l usuario.


YafRid: Sistema Grid para Ren<strong>de</strong>r [ 191 ]2. Administrador. Este usuario es imprescindible para la operación<strong>de</strong>l sistema y tiene privilegios que permiten acce<strong>de</strong>r ainformación y funcionalida<strong>de</strong>s críticas que incluyen:●●Acceso a la información <strong>de</strong> los usuarios <strong>de</strong>l sistema(clientes y proveedores) y <strong>de</strong> los grupos <strong>de</strong> ren<strong>de</strong>re<strong>xi</strong>stentes.Creación <strong>de</strong> conjuntos <strong>de</strong> pruebas, un tipo especial <strong>de</strong>proyectos compuestos que están formados por múltiplesproyectos individuales con ligeras diferencias entre unos yotros. Estos conjuntos <strong>de</strong> pruebas constituye unaherramienta con la que estudiar el rendimiento <strong>de</strong>lsistema y obtener conclusiones a partir <strong>de</strong> los resultados.●Gestión <strong>de</strong> la parte no interactiva <strong>de</strong>l sistema (Yafrid­CORE).3. Provee<strong>de</strong>r. El proveedor es el usuario que tiene instalado elsoftware necesario para formar parte <strong>de</strong>l grid. Los proveedorespue<strong>de</strong>n acce<strong>de</strong>r a su propia información y a las estadísticas <strong>de</strong>uso.Los grupos <strong>de</strong> ren<strong>de</strong>r mencionados tienen una especial importancia enun grid <strong>de</strong>dicado a tareas <strong>de</strong> ren<strong>de</strong>r como es Yafrid. Con este sencillomecanismo, los proyectos pue<strong>de</strong>n ser creados <strong>de</strong>ntro <strong>de</strong> un grupo teniendola garantía <strong>de</strong> que los proveedores <strong>de</strong> ese grupo <strong>de</strong>dicarán sus esfuerzos alren<strong>de</strong>r <strong>de</strong> ese proyecto y no al <strong>de</strong> otros.Yafrid-COREEsta es la parte no interactiva <strong>de</strong>l servidor. Este módulo ha sidoprincipalmente <strong>de</strong>sarrollado usando Python aunque también e<strong>xi</strong>stenalgunos scripts en Bourne shell para tareas <strong>de</strong> gestión. Está compuesto pordos módulos:1. Distribuidor. Constituye la parte activa <strong>de</strong>l módulo. Implementael algoritmo principal <strong>de</strong>stinado a realizar una serie <strong>de</strong> tareasclave, algunas <strong>de</strong> las cuales se introducen a continuación.●Generación <strong>de</strong> unida<strong>de</strong>s <strong>de</strong> trabajo. Consiste básicamenteen lanzar los proyectos activos que e<strong>xi</strong>sten en elsistema generando las unida<strong>de</strong>s <strong>de</strong> trabajo que sean necesarias.Las características <strong>de</strong> esta división <strong>de</strong>pen<strong>de</strong>n <strong>de</strong> losparámetros que el usuario introdujo al activar el proyecto.


[ 192 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D●●Asignación <strong>de</strong> las unida<strong>de</strong>s <strong>de</strong> trabajo a los proveedores.Esta es la tarea principal <strong>de</strong>l proceso <strong>de</strong> planificación.El algoritmo tiene que tener en cuenta factores comoel software que es necesario para ren<strong>de</strong>rizar la escena, elsoftware instalado en los proveedores y la versiónespecífica <strong>de</strong> éste o el grupo al que pertenecen proveedor yproyecto. Con toda esta información, y alguna más, elDistribuidor tiene que <strong>de</strong>cidir qué unidad será enviada aqué proveedor.Composición <strong>de</strong> resultados. Con lso resultados generadospor los diferentes proveedores, el distribuidor tieneque componer el resultado final. Este proceso no es enabsoluto trivial, en especial, en los ren<strong>de</strong>r <strong>de</strong> escenasestáticas. Debido al componente aleatorio <strong>de</strong> los métodos<strong>de</strong> ren<strong>de</strong>r basados en técnicas <strong>de</strong> Monte Carlo (como elPathtracing), cada uno <strong>de</strong> los fragmentos pue<strong>de</strong> presentarpequeñas diferencias cuando se ren<strong>de</strong>rizan en distintasmáquinas. Por esta razón, es necesario suavizar lasuniones entre fragmentos contiguos usando unainterpolación lineal. En la Figura 3 (a la izquierda) sepue<strong>de</strong>n observar los problemas al unir los fragmentos sinusar este mecanismo <strong>de</strong> suavizado.Figura 3. Izqda: Artefactos sin interpolación entre fragmentos.Drcha: Usando interpolación lineal.


YafRid: Sistema Grid para Ren<strong>de</strong>r [ 193 ]●Finalización <strong>de</strong> proyectos. Los resultados parcialesalmacenados por el sistema durante el proceso soneliminados <strong>de</strong>l mismo.●Control <strong>de</strong> timeout. Cuando el tiempo má<strong>xi</strong>mo que estáestablecido que se pue<strong>de</strong> esperar por una unidad <strong>de</strong>trabajo es sobrepasado, el sistema consulta el estado <strong>de</strong> launidad. Se comprueba si la unidad enviada a un proveedorestá siendo aún procesada o no. Si una <strong>de</strong> las unida<strong>de</strong>s sepier<strong>de</strong>, ésta tiene que ser reactivada para ser enviada aotro proveedor en un futuro.2. I<strong>de</strong>ntificator. Constituye la parte pasiva <strong>de</strong>l módulo Yafrid­CORE cuya misión consiste en mantenerse a la espera <strong>de</strong>comunicaciones por parte <strong>de</strong> los proveedores. Este módulo esresponsable <strong>de</strong>l protocolo que se establece entre el servidor y losproveedores para garantizar el correcto funcionamiento <strong>de</strong>lsistema. Se encarga <strong>de</strong> todas las comunicaciones con losproveedores excepto aquella en la que una unidad <strong>de</strong> trabajo esenviada a un proveedor, que es realizada por el distribuidor.La primera vez que un proveedor contacta con el servidor <strong>de</strong> Yafrid, elI<strong>de</strong>ntificador genera un objeto, el controlador, y <strong>de</strong>vuelve al proveedor unproxy que apunta a este objeto. Cada proveedor posee su propiocontrolador. Las siguientes interacciones entre el proveedor y el servidor serealizarán a través <strong>de</strong>l controlador <strong>de</strong>l proveedor. Algunas <strong>de</strong> estasinteracciones representan operaciones como la i<strong>de</strong>ntificación, lasuscripción, la activación, la <strong>de</strong>scone<strong>xi</strong>ón, el aviso <strong>de</strong> que una unidad hasido terminada, etcétera.Capa <strong>de</strong> UsuarioEsta capa no forma parte <strong>de</strong>l sistema en un sentido estricto.Básicamente la constituyen los distintos tipos <strong>de</strong> usuarios que pue<strong>de</strong>nacce<strong>de</strong>r al sistema. Como ya se ha comentado, e<strong>xi</strong>sten tres roles quecaracterizan las tres categorías <strong>de</strong> usuarios <strong>de</strong> Yafrid:1. Proveedor <strong>de</strong> servicio.2. Cliente.3. Administrador <strong>de</strong> Yafrid.Estos usuarios pue<strong>de</strong>n acce<strong>de</strong>r a toda la información concerniente a surelación con el sistema ofrecida por el módulo Yafrid­WEB utilizandocualquier navegador (Figura 4).


[ 194 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 4. Interfaz <strong>de</strong> usuario Web – Yafrid.


YafRid: Sistema Grid para Ren<strong>de</strong>r [ 195 ]Esta caracterización <strong>de</strong> los distintos usuarios da lugar a algo similar a unasociedad en la que cada usuario tiene un papel <strong>de</strong>terminado en la misma.En concreto, e<strong>xi</strong>sten unos usuarios que proporcionan servicio a otrosmientras que unos terceros gestionan el sistema.Las características <strong>de</strong> cada uno <strong>de</strong> estos roles y <strong>de</strong> su interacción con elsistema serán abordadas en pró<strong>xi</strong>mas secciones.ProveedorEl Proveedor es el software que <strong>de</strong>ben instalar en sus sistemas losusuarios que <strong>de</strong>seen prestar sus ciclos <strong>de</strong> CPU para que se usen en tareas<strong>de</strong> ren<strong>de</strong>r. Este software pue<strong>de</strong> funcionar tanto en modo <strong>de</strong> línea <strong>de</strong>comandos como por medio <strong>de</strong> una interfaz gráfica. El primer paso que unproveedor tiene que dar para formar parte <strong>de</strong>l grid es conectarse al mismo.Una vez conectado y activado, el proveedor se pone a la espera <strong>de</strong> que elservidor le envíe una unidad <strong>de</strong> trabajo para ser procesada. Cuando finalizael ren<strong>de</strong>r, el proveedor envía los resultados <strong>de</strong> vuelta al servidor via SFTP einforma a su controlador <strong>de</strong> que el trabajo está terminado.ResultadosEn diversas etapas <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong>l sistema se han realizado pruebas conlos distintos prototipos que se iban obteniendo. Mientras que en lasprimeras fases se realizaban pruebas sencillas en una sola máquina,cuando el sistema estuvo mínimamente maduro se comenzaron a realizarpruebas en un entorno distribuido y controlado. En esta sección semuestran algunos <strong>de</strong> los resultados obtenidos en estas pruebas así comolos resultado esperados según los análisis previos.Resultados analíticosPara el siguiente estudio se suponen cone<strong>xi</strong>ones simétricas entreServidor y Proveedores y capacida<strong>de</strong>s <strong>de</strong> cálculo similares <strong>de</strong> los distintosProveedores.Como vemos en la Ecuación 1, al utilizar Yafrid para ren<strong>de</strong>rizar una escenase aña<strong>de</strong>n dos factores al tiempo <strong>de</strong> ren<strong>de</strong>r, T trans y T 0, que no aparecen enun sistema no distribuido y con un solo or<strong>de</strong>nador.


[ 196 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEl T trans es el tiempo <strong>de</strong> transmisión y <strong>de</strong>pen<strong>de</strong> en parte <strong>de</strong> la velocidad <strong>de</strong>la red que une Servidor y Proveedores. T 0 es un tiempo que el sistemautiliza en operaciones tales como la unión <strong>de</strong> las unida<strong>de</strong>s <strong>de</strong> trabajo y quese pue<strong>de</strong> acotar en funcion <strong>de</strong>l tamaño <strong>de</strong>l proyecto.T total =T ren<strong>de</strong>r T trans T 0 (1)Tanto en Yafrid como en un sistema centralizado, el tiempo <strong>de</strong> ren<strong>de</strong>rrespon<strong>de</strong> a la Ecuación 2 don<strong>de</strong> fps correspon<strong>de</strong> a los frames por segundo<strong>de</strong> la animación, t al es la duración <strong>de</strong> la animación y t rf es el tiempo medioen ren<strong>de</strong>rizar un frame.fps t al t rf En el caso <strong>de</strong> AnimacionesT ren<strong>de</strong>r = (2)t rfEn el caso <strong>de</strong> FramesEl tiempo <strong>de</strong> transmisión se calcula mediante la Ecuación 3 en la que n res el número <strong>de</strong> Proveedores (o nodos <strong>de</strong> ren<strong>de</strong>r), S pet es el tamaño en bytes<strong>de</strong>l fichero fuente que el Servidor envía a los Proveedores, S res es el tamañoen bytes <strong>de</strong>l fichero resultado que cada Proveedor envía al Servidor, W i esel número <strong>de</strong> unida<strong>de</strong>s <strong>de</strong> trabajo realizadas por el Proveedor i y Vtrans i esla velocidad <strong>de</strong> transmisión (ancho <strong>de</strong> banda) entre Servidor y Proveedoresen bytes/s. El número <strong>de</strong> Proveedores es lo que se <strong>de</strong>nomina tamaño <strong>de</strong>lgrid.T trans =n r∑i=0S pet S res ×W i Vtrans i(3)Así, en un sistema con un sólo or<strong>de</strong>nador no aparecen los tiemposextra T trans y T 0 que sí aparecen en un sistema como Yafrid. Sin embargo, elproceso se <strong>de</strong>sarrolla en paralelo en distintas máquinas con lo que, en uncaso i<strong>de</strong>al, el tiempo total se divi<strong>de</strong> equitativamente entre los distintosproveedores <strong>de</strong>l sistema (Ecuación 4).T= T totaln r(4)En el caso <strong>de</strong> que las re<strong>de</strong>s que conectan los componentes <strong>de</strong>l grid sean<strong>de</strong> alta velocidad, el término T trans se pue<strong>de</strong> <strong>de</strong>spreciar, con lo que laganancia sería <strong>de</strong>l or<strong>de</strong>n <strong>de</strong>l número <strong>de</strong> proveedores n r (n r sería el valormá<strong>xi</strong>mo <strong>de</strong> la ganancia).


YafRid: Sistema Grid para Ren<strong>de</strong>r [ 197 ]En futuras mejoras <strong>de</strong>l sistema se preten<strong>de</strong> optimizar la generación <strong>de</strong>unida<strong>de</strong>s <strong>de</strong> trabajo en proyectos <strong>de</strong> ren<strong>de</strong>r estático <strong>de</strong> forma que éstas seren<strong>de</strong>ricen con distintas calida<strong>de</strong>s. Esto permitiría obtener ganancias porencima <strong>de</strong> n r ya que la suma <strong>de</strong> los tiempos en ren<strong>de</strong>rizar cada uno <strong>de</strong> losfragmentos sería menor que el tiempo en ren<strong>de</strong>rizar la imagen completa<strong>de</strong>bido a que algunos <strong>de</strong> los fragmentos se ren<strong>de</strong>rizan con una calidadmenor que la inicial.Resultados empíricosCon el fin <strong>de</strong> sacar conclusiones sobre el comportamiento <strong>de</strong>l sistemaen un entorno real, se ejecutaron varios conjuntos <strong>de</strong> pruebas (test sets).Estos conjuntos <strong>de</strong> pruebas se pue<strong>de</strong>n generar <strong>de</strong>s<strong>de</strong> el interfaz web conpermisos <strong>de</strong> administrador y consisten en una serie <strong>de</strong> proyectos <strong>de</strong> prueba(tests). Cada uno <strong>de</strong> los conjuntos <strong>de</strong> pruebas posee sus propiosparámetros <strong>de</strong> calidad (como son por ejemplo el número <strong>de</strong> muestras <strong>de</strong>luz o el número <strong>de</strong> rayos por pixel) y su propio método <strong>de</strong> ren<strong>de</strong>r. Dentro<strong>de</strong> un mismo conjunto <strong>de</strong> pruebas, los distintos proyectos <strong>de</strong> prueba sediferencian en el valor <strong>de</strong> los parámetros <strong>de</strong> calidad y en el tamaño <strong>de</strong> lasunida<strong>de</strong>s <strong>de</strong> trabajo en las que se dividirá el frame.Para hacer que los datos que se obtuvieran pudieran ser comparables, seoptó por configurar un grid homogéneo en el que todos los proveedorestuvieran similares características. Así, los proyectos <strong>de</strong> pruebamencionados se lanzaron en Yafrid mientras el grid tenía un tamaño <strong>de</strong> 16proveedores idénticos en capacida<strong>de</strong>s (procesador Pentium IV a 2.80 GHz,256Mb <strong>de</strong> RAM y el mismo sistema operativo). Este tamaño <strong>de</strong> grid semantuvo constante durante toda la prueba.Para realizar las pruebas se seleccionó una imagen bastante compleja. Laescena contiene más <strong>de</strong> 100.000 caras, 4 niveles <strong>de</strong> recursión en elalgoritmo <strong>de</strong> trazado <strong>de</strong> rayos en superficies especulares (el dragón) y 6niveles en superficies transparentes (el cristal <strong>de</strong> las copas). A<strong>de</strong>más, selanzaron 200.000 fotones para construir el mapa <strong>de</strong> fotones.Para generar la imagen se utilizaron dos métodos <strong>de</strong> ren<strong>de</strong>r:● Pathtracing con Mapeado <strong>de</strong> Fotones e Irradiance Cache (Figura 5­ Izquierda).● Trazado <strong>de</strong> Rayos clásico con una implementación <strong>de</strong> la técnicaAmbient Occlusion (Figura 5 ­ Derecha).Antes <strong>de</strong> presentar los resultados obtenidos con Yafrid (con un tamaño <strong>de</strong>grid <strong>de</strong> 16 or<strong>de</strong>nadores), en la Tabla 1 se muestran los tiempos <strong>de</strong> ren<strong>de</strong>r<strong>de</strong> cada conjunto <strong>de</strong> pruebas obtenidos usando un solo proveedor (ren<strong>de</strong>rlocal).


[ 198 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 5. Izqda: Pathtracing Drcha: Ambient Occlusion.Método Calidad Tiempo (hh:mm:ss)Pathtracing 128 Muestras 02:56:56Pathtracing 512 Muestras 07:35:28Pathtracing 1024 Muestras 14:23:07Pathtracing 2048 Muestras 23:16:12RT Clásico 1 Rayo/Píxel 00:17:50RT Clásico 8 Rayos/Píxel 00:20:39RT Clásico 16 Rayos/Píxel 00:26:47Tabla 1. Resultados obtenidos al ren<strong>de</strong>rizar en una sola máquina.Como se pue<strong>de</strong> observar en la Figura 6, el tiempo <strong>de</strong> ren<strong>de</strong>r en el mejor<strong>de</strong> los casos es más <strong>de</strong> ocho veces mejor utilizando Yafrid. En el peor <strong>de</strong> loscasos es tan sólo dos veces mejor.Del mismo modo, utilizando el algoritmo <strong>de</strong> trazado <strong>de</strong> rayos <strong>de</strong> Whitted(Figura 6), el tiempo <strong>de</strong> ren<strong>de</strong>r usando Yafrid es, en el mejor <strong>de</strong> los casos,siete veces menor y tan sólo tres veces menor en el peor <strong>de</strong> los casos.También se lanzó una sencilla animación <strong>de</strong> prueba consistente en unmovimiento <strong>de</strong> cámara en torno a los objetos principales <strong>de</strong> la escenausada en las pruebas anteriores. La duración <strong>de</strong> la animación se establecióen 50 fotogramas y se utilizó el algoritmo <strong>de</strong> trazado <strong>de</strong> rayos clásico.Tal y como se muestra en la Tabla 2 en los proyectos <strong>de</strong> animación seconsiguen ganancias más importantes que en el caso <strong>de</strong>l ren<strong>de</strong>r estático.La ganancia está en este caso más cercana al límite teórico que suponía elnúmero <strong>de</strong> Proveedores. El tiempo obtenido con Yafrid es alre<strong>de</strong>dor <strong>de</strong>catorce veces menor.


YafRid: Sistema Grid para Ren<strong>de</strong>r [ 199 ]Figura 6. Izqda: Resultados empleando Pathtracing.Drcha: Resultados empleando Raytracing Clásico.Calidad Tiempo Yafrid Tiempo 1 PC1 Rayo/Píxel 01:03:50 14:20:558 Rayos/Píxel 01:15:12 16:33:1016 Rayos/Píxel 01:22:36 20:12:02Tabla 2. Resultados obtenidos al ren<strong>de</strong>rizar una animación.Análisis <strong>de</strong> los resultadosCon la observación <strong>de</strong> los resultados empíricos obtenidos en elapartado anterior, se pone <strong>de</strong> manifiesto la importancia que tiene laelección <strong>de</strong>l tamaño <strong>de</strong> la unidad <strong>de</strong> trabajo en los proyectos <strong>de</strong> ren<strong>de</strong>restáticos. Para cada escena hay un tamaño óptimo <strong>de</strong> unidad <strong>de</strong> trabajoque permite obtener el mejor rendimiento posible.En esta escena en concreto hay algunas unida<strong>de</strong>s <strong>de</strong> trabajo que tardanmucho más que el resto (como las caústicas <strong>de</strong> las copas <strong>de</strong> cristal). Estohace que el proyecto se mantenga en proceso gran parte <strong>de</strong>l tiempo conúnicamente algunos fragmentos por terminar. Esto enmascara la gananciaobtenida perjudicando el tiempo que se ha <strong>de</strong>dicado al proyecto.En el método usado por Yafray para realizar el ren<strong>de</strong>r (Pathtracing), losfragmentos a calcular no son totalmente in<strong>de</strong>pendientes unos <strong>de</strong> otros.Para obtener las unida<strong>de</strong>s <strong>de</strong> trabajo, cada Proveedor tiene que calcular lacaché <strong>de</strong> irradiancia completa cada vez. La mejora aumentaría mucho si unProveedor calculara la caché una vez y se la enviara a los <strong>de</strong>másProveedores (mecanismo aún no implementado en Yafrid).La ganancia es mayor en el método <strong>de</strong> trazado <strong>de</strong> rayos <strong>de</strong> Whitted <strong>de</strong>bidoa que no se hace uso <strong>de</strong> la caché <strong>de</strong> irradiancia.


[ 200 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DA<strong>de</strong>más e<strong>xi</strong>ste otro factor por el que la ganancia es menor que la teórica.A la hora <strong>de</strong> dividir una imagen en fragmentos se aña<strong>de</strong> un área extra, labanda <strong>de</strong> interpolación, que servirá para suavizar las uniones entre unosfragmentos y otros. Usar una banda <strong>de</strong> interpolación menor ­en los ejemplostiene una anchura <strong>de</strong> 10 píxeles­ mejoraría la ganancia.Con respecto a las animaciones, la situación es bastante distinta. La gananciaobtenida experimentalmente está más cerca <strong>de</strong> ser proporcional al tamaño<strong>de</strong>l grid que en el caso <strong>de</strong>l ren<strong>de</strong>r <strong>de</strong> un solo frame, es <strong>de</strong>cir, está más cerca <strong>de</strong>la ganancia teórica. Una <strong>de</strong> las causas es que, habitualmente, el tiempo <strong>de</strong>ren<strong>de</strong>r es más homogéneo entre un frame y el siguiente que entre fragmentos<strong>de</strong> un mismo frame. A<strong>de</strong>más, el tiempo invertido en unir los frames <strong>de</strong> unaanimación es menor que el invertido en unir e interpolar los fragmentos <strong>de</strong>un frame. Otra razón importante es que no hay que ren<strong>de</strong>rizar un área extraya que no e<strong>xi</strong>ste banda <strong>de</strong> interpolación.Conclusiones sobre el rendimiento <strong>de</strong>l sistemaDe acuerdo con los resultados empíricos examinados con anterioridad, elsistema proporciona claramente un mejor rendimiento que en el caso <strong>de</strong>lren<strong>de</strong>r en un sistema con un sólo procesador. Esto es así incluso cuando laelección <strong>de</strong>l tamaño <strong>de</strong> la unidad <strong>de</strong> trabajo es la peor <strong>de</strong> las posibles.Yafrid ofrece una significativamente mejor productividad (número <strong>de</strong>entida<strong>de</strong>s ren<strong>de</strong>rizadas, frames o fragmentos <strong>de</strong> un frame, por unidad <strong>de</strong>tiempo) que un único or<strong>de</strong>nador porque las distintas unida<strong>de</strong>s <strong>de</strong> trabajo segeneran paralelamente en distintos proveedores. Esta productividad <strong>de</strong>pen<strong>de</strong>en gran medida <strong>de</strong>l tamaño <strong>de</strong> la unidad <strong>de</strong> trabajo y <strong>de</strong>l tamaño <strong>de</strong>l grid.Por otro lado, la latencia <strong>de</strong> cada una <strong>de</strong> las unida<strong>de</strong>s (el tiempo que tardanen ser generadas) se incrementa porque hay que tener en cuenta factores queno e<strong>xi</strong>sten en el procesamiento no distribuido. En sistemas distribuidos <strong>de</strong>cualquier tipo, a<strong>de</strong>más <strong>de</strong>l tiempo <strong>de</strong>dicado a ren<strong>de</strong>rizar la escena, el tiempo<strong>de</strong> transmisión es también importante. Este tiempo <strong>de</strong> transferencia <strong>de</strong>pen<strong>de</strong><strong>de</strong> la cantidad <strong>de</strong> datos a transferir, <strong>de</strong> la velocidad <strong>de</strong> la cone<strong>xi</strong>ón y <strong>de</strong>lestado <strong>de</strong> la red.El aumento <strong>de</strong> la latencia no es importante si obtenemos una mayorproductividad, que es lo que en realidad va a percibir el usuario final <strong>de</strong>lservicio.Por regla general, cuanto mayor sea el número <strong>de</strong> fragmentos en los que sedivi<strong>de</strong> una escena, mayor paralelismo se obtendrá y menos tiempo senecesitará para ren<strong>de</strong>rizar la imagen completa. Si analizamos el tema conmás <strong>de</strong>talle, esto no es tan simple. Si una escena se divi<strong>de</strong> en fragmentos<strong>de</strong>masiado pequeños es posible que el tiempo <strong>de</strong>dicado a la transmisión y alprocesamiento <strong>de</strong> los resultados sea mayor que el tiempo <strong>de</strong>dicado al ren<strong>de</strong>r.En este caso, los resultados obtenidos por un sistema distribuido <strong>de</strong> cualquiertipo serán peores que los obtenidos en una sola máquina. Una elecciónincorrecta <strong>de</strong>l tamaño <strong>de</strong> la unidad <strong>de</strong> trabajo pue<strong>de</strong> perjudicar elrendimiento <strong>de</strong>l grid.


Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>rCarlos González MorcilloCarlos.Gonzalez@uclm.es ::Aun alto nivel <strong>de</strong> abstracción po<strong>de</strong>mos ver el proceso <strong>de</strong>Ren<strong>de</strong>r como el encargado <strong>de</strong> convertir una <strong>de</strong>scripción<strong>de</strong> una escena tridimensional en una imagen.Prácticamente cualquier disciplina <strong>de</strong> aplicación <strong>de</strong> los gráficos3D (vi<strong>de</strong>ojuegos, cine, visualización científica, marketing, etc...)necesitan obtener resultados visibles mediante un proceso <strong>de</strong>Ren<strong>de</strong>ring.La naturaleza interdisciplinar <strong>de</strong>l proceso <strong>de</strong> Ren<strong>de</strong>r se pue<strong>de</strong>comprobar en que multitud <strong>de</strong> disciplinas científicas hacen uso <strong>de</strong>algortimos y técnicas relacionadas con este campo, como física, astrofísica,biología, astronomía, psicología y estudio <strong>de</strong> la percepción, matemáticasaplicadas...En los primeros años <strong>de</strong> estudio <strong>de</strong> este campo la investigación se centróen cómo resolver problemas relacionados con la <strong>de</strong>tección <strong>de</strong> superficiesvisibles, sobreado básico, etc... Según se encontraban soluciones a estosproblemas, se continuó el estudio en algoritmos <strong>de</strong> síntesis más realistasque simularan el comportamiento <strong>de</strong> la luz con la mayor fi<strong>de</strong>lidad posible.En la actualidad, el grado <strong>de</strong> realismo alcanzado es muy alto, siendo unas<strong>de</strong> las principales áreas <strong>de</strong> investigación en este campo las técnicas <strong>de</strong>optimización en tiempos <strong>de</strong> ejecución.Síntesis <strong>de</strong> Imagen FotorrealistaPo<strong>de</strong>mos <strong>de</strong>finir el proceso <strong>de</strong> síntesis <strong>de</strong> imagen fotorrealista comoaquel que persigue la creación <strong>de</strong> imágenes sintéticas que no se puedandistinguir <strong>de</strong> aquellas captadas en el mundo real. En este campo <strong>de</strong> losgráficos por computador ha ocurrido una rápida evolución. Des<strong>de</strong> elalgoritmo <strong>de</strong> Scan-Line, propuesto por Bouknight [BOU70] que norealizaba ninguna simulación física <strong>de</strong> la luz, hasta los inicios <strong>de</strong>lfotorrealismo, en el artículo <strong>de</strong> Whitted [WHI80] con la propuesta <strong>de</strong>lmétodo <strong>de</strong> trazado <strong>de</strong> rayos y posteriormente la introducción <strong>de</strong> laRadiosidad [GOR84] hicieron uso <strong>de</strong> técnicas habituales en el campo <strong>de</strong> laóptica y el cálculo <strong>de</strong> transferencia <strong>de</strong> calor.Ren<strong>de</strong>r[ 201 ]


[ 202 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 1. Izqda: Escena ren<strong>de</strong>rizada aplicando únicamente iluminación directaDrcha: Escena ren<strong>de</strong>rizada con iluminación global empleando mapeado <strong>de</strong> fotones; seobserva la caja <strong>de</strong> color azul pegada a la pared que no recibe iluminación directa.En la búsqueda <strong>de</strong> la generación <strong>de</strong> imagen fotorrealista un punto clavees la simulación <strong>de</strong> la luz. La simulación siguiendo las leyes físicas <strong>de</strong> todala luz dispersa en un mo<strong>de</strong>lo 3D sintético se <strong>de</strong>nomina iluminaciónglobal (global illumination). El objetivo <strong>de</strong> las técnicas <strong>de</strong> iluminaciónglobal es simular todas las refle<strong>xi</strong>ones <strong>de</strong> la luz y así obtener en cada punto<strong>de</strong>l mo<strong>de</strong>lo el valor <strong>de</strong> intensidad <strong>de</strong> luz que vendrá <strong>de</strong>terminado por lainteracción <strong>de</strong> la luz con el resto <strong>de</strong> elementos <strong>de</strong> la escena. De esta forma,el objetivo <strong>de</strong>l algoritmo <strong>de</strong> iluminación global es calcular la interacción <strong>de</strong>todas las fuentes <strong>de</strong> luz con los elementos que forman la escena. Estastécnicas <strong>de</strong> iluminación global son necesarias para calcular la iluminaciónindirecta; sin esta iluminación el mo<strong>de</strong>lo parece artificial y sintético (verFigura 1). E<strong>xi</strong>sten varias técnicas <strong>de</strong> iluminación global, pero la mayoríaestán basadas en el Trazado <strong>de</strong> Rayos (o Muestreo <strong>de</strong> Puntos) o enRadiosidad (o Elementos Finitos) o en ambas a la vez (técnicas híbridas).Cada uno <strong>de</strong> estos métodos tiene sus ventajas e inconvenientes.Técnicas <strong>de</strong> Trazado <strong>de</strong> RayosMediante la técnica <strong>de</strong> trazados <strong>de</strong> rayos se trazan un alto número <strong>de</strong>rayos <strong>de</strong> luz a través <strong>de</strong>l mo<strong>de</strong>lo 3d que se preten<strong>de</strong> ren<strong>de</strong>rizar. En estemo<strong>de</strong>lo, introducido en 1980 por Whitted [WHI80], se trazan rayos <strong>de</strong>s<strong>de</strong>el observador hacia las fuentes <strong>de</strong> luz. Algunas limitaciones importantes <strong>de</strong>este tipo <strong>de</strong> trazado <strong>de</strong> rayos básico es que no pue<strong>de</strong> representarprofuncidad <strong>de</strong> campo, caústicas o iluminación indirecta. Para simularestos efectos, es necesario exten<strong>de</strong>r el trazado <strong>de</strong> rayos empleandométodos <strong>de</strong> Monte Carlo [COO86], que lancen rayos adicionales parasimular todos los caminos posibles <strong>de</strong> la luz. Los métodos <strong>de</strong> Monte Carlotienen un problema importante <strong>de</strong>bido a su varianza, que se percibecomo ruido en las imágenes generadas.


Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>r [ 203 ]Figura 2: Ejemplo <strong>de</strong> uso <strong>de</strong> radiosidad. a) Malla original; en el techo <strong>de</strong> la habitaciónse observan las caras emisoras <strong>de</strong> luz. b) Malla <strong>de</strong> radiosidad resultado. c) Ren<strong>de</strong>r <strong>de</strong> lahabitación con los valores <strong>de</strong> radiosidad calculados en (b).La eliminación <strong>de</strong> este ruido requiere aumentar el número <strong>de</strong>muestras. Se han realizado numerosos estudios sobre cómo distribuir losrayos <strong>de</strong> forma que el ruido sea menor. Las alternativas que mejoresresultados han dado hasta la fecha son los métodos guiados <strong>de</strong> trazado <strong>de</strong>rayos, cuyas propieda<strong>de</strong>s <strong>de</strong> convergencia son mucho mejores (como porejemplo las técnicas <strong>de</strong> irradiance caché [WAR92], que almacenan yreutilizan la iluminación indirecta interpolando los valores <strong>de</strong>sconocidos).En este tipo <strong>de</strong> técnicas la geometría se trata como una “caja negra”. Losrayos se trazan en la escena y obtienen un valor <strong>de</strong> iluminación. Esta esuna importante ventaja en escenas con una geometría compleja, ya que lastécnicas <strong>de</strong> Muestreo <strong>de</strong> Puntos sólo tienen que gestionar la complejidad<strong>de</strong> la iluminación, y no <strong>de</strong> la geometría. Sin embargo, esta in<strong>de</strong>pen<strong>de</strong>ncia<strong>de</strong> la geometría tiene inconvenientes, como la necesidad <strong>de</strong> un alto número<strong>de</strong> muestras para unos resultados aceptables.Técnicas <strong>de</strong> RadiosidadEn este tipo <strong>de</strong> técnicas se calcula el intercambio <strong>de</strong> luz entresuperficies. Esto se consigue subdividiendo el mo<strong>de</strong>lo en pequeñasunida<strong>de</strong>s <strong>de</strong>nominadas “parches”, que serán la base <strong>de</strong> la distribución <strong>de</strong>luz final. Inicialmente los mo<strong>de</strong>los <strong>de</strong> radiosidad calculaban lasinteracciones <strong>de</strong> luz entre superficies difusas (aquellas que reflejan la luzigual en todas las direcciones) [COH85] [GOR84], aunque e<strong>xi</strong>sten mo<strong>de</strong>losmás avanzados que tienen en cuenta mo<strong>de</strong>los <strong>de</strong> refle<strong>xi</strong>ón más complejos.


[ 204 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D1243Figura 3: Esquema <strong>de</strong> la matriz <strong>de</strong> radiosidad. En cada posición <strong>de</strong> la matriz se calculael factor <strong>de</strong> forma. La diagonal principal <strong>de</strong> la matriz no es calculada.El mo<strong>de</strong>lo básico <strong>de</strong> radiosidad calcula una solución in<strong>de</strong>pendiente<strong>de</strong>l punto <strong>de</strong> vista. Sin embargo, el cálculo <strong>de</strong> la solución es muy costosoen tiempo y en espacio <strong>de</strong> almacenamiento. No obstante, cuando lailuminación ha sido calculada, pue<strong>de</strong> utilizarse para ren<strong>de</strong>rizar la escena<strong>de</strong>s<strong>de</strong> diferentes ángulos, lo que hace que este tipo <strong>de</strong> soluciones se utilicenen visitas interactivas y vi<strong>de</strong>ojuegos en primera persona actuales.En el mo<strong>de</strong>lo <strong>de</strong> radiosidad, cada superficie tiene asociados dos valores: laintensidad luminosa que recibe, y la cantidad <strong>de</strong> energía que emite(energía Radiante). En este algoritmo se calcula la interacción <strong>de</strong> energía<strong>de</strong>s<strong>de</strong> cada superficie hacia el resto. Si tenemos n superficies, lacomplejidad <strong>de</strong>l algoritmo será O(n²). El valor matemático que calcula larelación geométrica entre superficies se <strong>de</strong>nomina Factor <strong>de</strong> Forma.Será necesario calcular n² factores <strong>de</strong> forma ya que no cumple lapropiedad conmutativa <strong>de</strong>bido a que se tiene en cuenta la relación <strong>de</strong> áreaentre superficies. La matriz que contiene los factores <strong>de</strong> formarelacionando todas las superficies se <strong>de</strong>nomina Matriz <strong>de</strong> Radiosidad.Cada elemento <strong>de</strong> esta matriz contiene un factor <strong>de</strong> forma para lainteracción <strong>de</strong>s<strong>de</strong> la superficie in<strong>de</strong>xada por la columna hacia la superficiein<strong>de</strong>xada por la fila (ver figura 3).En general, el cálculo <strong>de</strong> la radiosidad es eficiente para el cálculo <strong>de</strong>distribuciones <strong>de</strong> luz en mo<strong>de</strong>los simples con materiales difusos, peroresulta muy costoso para mo<strong>de</strong>los complejos (<strong>de</strong>bido a que se calculan los


Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>r [ 205 ]valores <strong>de</strong> energía para cada parche <strong>de</strong>l mo<strong>de</strong>lo) o con materiales nodifusos. A<strong>de</strong>más, la solución <strong>de</strong>l algoritmo se muestra como una nuevamalla poligonal que tien<strong>de</strong> a <strong>de</strong>senfocar los límites <strong>de</strong> las sombras. Estamalla poligonal pue<strong>de</strong> ser inmanejable en complejidad si la representaciónoriginal no se realiza con cuidado o si el mo<strong>de</strong>lo es muy gran<strong>de</strong>, por lo queeste tipo <strong>de</strong> técnicas no se utilizan en la práctica con mo<strong>de</strong>los complejos.Técnicas MixtasLa radiosidad es buena para simular las refle<strong>xi</strong>ones difusas, mientrasque el trazado <strong>de</strong> rayos da mejores resultados en refle<strong>xi</strong>ón especular. Deeste modo po<strong>de</strong>mos utilizar trazado <strong>de</strong> rayos para el cálculo <strong>de</strong> lasrefle<strong>xi</strong>ones especulares y radiosidad para superficies con refle<strong>xi</strong>ón difusa.E<strong>xi</strong>sten varias apro<strong>xi</strong>maciones en las que se utiliza radiosidad para elcáculo <strong>de</strong> iluminación indirecta, ya que las técnicas <strong>de</strong> Monte Carlorequieren un alto número <strong>de</strong> muestras para que no se perciba el ruido. Eluso <strong>de</strong> algoritmos basados en radiosidad tienen un importanteinconveniente y es que limitan la complejidad <strong>de</strong> los mo<strong>de</strong>los que pue<strong>de</strong>nser ren<strong>de</strong>rizados. Una apro<strong>xi</strong>mación a estos problemas se basa ensimplificar la malla origen para utilizarla únicamente en el cálculo <strong>de</strong> lailuminación indirecta cuyos cambios suelen ser suaves y no requieren unalto nivel <strong>de</strong> <strong>de</strong>talle en la superficie.El mapeado <strong>de</strong> fotones [JEN01] se basa en una apro<strong>xi</strong>macióndifentente, ya que separa la información <strong>de</strong> la iluminación <strong>de</strong> la geometría,almacenándola en una estructura <strong>de</strong> datos diferente (el mapa <strong>de</strong> fotones).Este mapa se construye trazando fotones <strong>de</strong>s<strong>de</strong> las fuentes <strong>de</strong> luz, y guardainformación sobre los impactos <strong>de</strong> los fotones, que se utilizará pararen<strong>de</strong>rizar la escena <strong>de</strong> una forma eficiente, tal y como se utilizaba lainformación sobre la iluminación en la radiosidad. Este <strong>de</strong>sacople <strong>de</strong> lageometría permite simplificar la representación y utilizarla en mo<strong>de</strong>los <strong>de</strong>cualquier nivel <strong>de</strong> complejidad.Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>rizadoA continuación vamos a <strong>de</strong>scribir algunos métodos <strong>de</strong> ren<strong>de</strong>rizadoampliamente utilizados en la actualidad. Nos centraremos en los métodos<strong>de</strong> ren<strong>de</strong>rizado Píxel a Píxel (frente a las alternativas basadas enprimitivas, que concluyen en una etapa <strong>de</strong> rasterización).


[ 206 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DPo<strong>de</strong>mos consi<strong>de</strong>rar que todas las alternativas <strong>de</strong> ren<strong>de</strong>rizado preten<strong>de</strong>ndar solución a la ecuación <strong>de</strong> ren<strong>de</strong>rizado, propuesta en 1986 por Kajiya[KAJ86]:L o x , w =L e x , w∫f r x , w ' , w L i x , w ' w '⋅n d w 'Que pue<strong>de</strong> leerse como: “dada una posición x y dirección w <strong>de</strong>terminada,el valor <strong>de</strong> iluminación saliente L o es el resultado <strong>de</strong> sumar la iluminaciónemitida L e y la luz reflejada. La luz reflejada (el segundo término <strong>de</strong> lasuma <strong>de</strong> la ecuación anterior) viene dado por la suma <strong>de</strong> la luz entrante L i<strong>de</strong>s<strong>de</strong> todas las direcciones, multiplicado por la refle<strong>xi</strong>ón <strong>de</strong> la superficie yel ángulo <strong>de</strong> inci<strong>de</strong>ncia.Para expresar la interacción <strong>de</strong> la luz en cada superficie se utiliza la función<strong>de</strong> distribución <strong>de</strong> reflectancia bidireccional (BRDF), que correspon<strong>de</strong>ríacon el término f r <strong>de</strong> la expresión anterior y es particular <strong>de</strong> cada superficie.En la medida <strong>de</strong> lo posible trataremos <strong>de</strong> respon<strong>de</strong>r a las siguientespreguntas sobre cada método: ¿En qué consiste?, ¿Quién lo propuso?,¿Cuándo se <strong>de</strong>scubrió?, ¿Por qué surgió?, ¿Cual es la <strong>de</strong>scripción <strong>de</strong> sualgoritmo?, así como una enumeración <strong>de</strong> ventajas y <strong>de</strong>sventajas frente aotros métodos <strong>de</strong> ren<strong>de</strong>r.ScanlineEs un método propuesto en 1970 por Bouknight [BOU70], como algoritmopara la representación punto a punto <strong>de</strong> una imagen. Cuando se calculanlos píxeles que forman cada línea <strong>de</strong> la imagen, se continúa con lasiguiente.Descripción <strong>de</strong>l Algoritmopara cada píxel <strong>de</strong> la imagenlinea := trazar una línea <strong>de</strong>s<strong>de</strong> la cámara al píxelcolor = scanline(linea)scanline(linea)punto := encontrar el punto <strong>de</strong> intersección más cercanocolor := color <strong>de</strong> fondopara cada fuente <strong>de</strong> luzcolor := color + iluminacion directa<strong>de</strong>volver(color)VentajasEs un método muy rápido, que permite simular cualquier tipo <strong>de</strong>sombreado, funciona correctamente con texturas.


Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>r [ 207 ]DesventajasNo permite simular <strong>de</strong> forma realista refle<strong>xi</strong>ones y refracciones <strong>de</strong> laluz. En el caso <strong>de</strong> las refle<strong>xi</strong>ones pue<strong>de</strong>n simularse mediante mapas <strong>de</strong>entorno (que dan una apro<strong>xi</strong>mación rápida, pero no físicamente correcta).Las refracciones no son correctas, aunque en cuerpos planos pue<strong>de</strong>n sermedianamente realistas simulándolas con transparencia a nivel <strong>de</strong>polígono.RaytracingEl método <strong>de</strong> trazado <strong>de</strong> rayos es una propuesta elegante y recursivaque permite calcular <strong>de</strong> forma sencilla superficies con reflejos ytransparencia. Fue propuesto en 1980 por Whitted [WHI80].La i<strong>de</strong>a base en Raytracing es la <strong>de</strong> trazar rayos <strong>de</strong>s<strong>de</strong> el observador a lasfuentes <strong>de</strong> luz. En realidad, son las fuentes <strong>de</strong> luz las que emiten fotonesque rebotan en la escena y llegan a los ojos <strong>de</strong>l observador. Sin embargo,sólo una pequeñísima fracción <strong>de</strong> los fotones llegan a este <strong>de</strong>stino, por loque el cálculo en esta forma directa resulta <strong>de</strong>masiado costosa. Los rayosque se emiten a la escena son evaluados respecto <strong>de</strong> su visibilidad trazandonuevos rayos <strong>de</strong>s<strong>de</strong> los puntos <strong>de</strong> intersección (rayos <strong>de</strong> sombra).Descripción <strong>de</strong>l Algoritmopara cada píxel <strong>de</strong> la imagenrayo := trazar un rayo <strong>de</strong>s<strong>de</strong> la cámara al píxelcolor = raytracing(rayo)raytracing(rayo)punto := encontrar el punto <strong>de</strong> intersección más cercanocolor := color <strong>de</strong> fondopara cada fuente <strong>de</strong> luzrayo_sombra := trazar un rayo <strong>de</strong>s<strong>de</strong> (punto) hasta lafuente <strong>de</strong> luzsi el rayo no choca con ningún objetocolor := color + iluminacion directasi el material tiene propiedad <strong>de</strong> refle<strong>xi</strong>óncolor := color + raytracing(rayo_reflejado)si el material tiene propiedad <strong>de</strong> refraccióncolor := color + raytracing(rayo_transmitido)sinocolor := negro<strong>de</strong>volver (color)E<strong>xi</strong>sten métodos <strong>de</strong> aceleración <strong>de</strong>l algoritmo <strong>de</strong> raytracing, como eluso <strong>de</strong> árboles octales, grids jerárquicos, árboles BSP, etc... A<strong>de</strong>más, sepue<strong>de</strong>n calcular los valores <strong>de</strong> píxeles cercanos y si la variación es pequeñainterpolar los valores (irradiance cache).


[ 208 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DCámaraCámaraObjetoObjetoSuperficieSuperficieFigura 4. Pasos para el cálculo <strong>de</strong> Ambient Occlusion. La figura <strong>de</strong> la izquierdarepresenta el primer paso <strong>de</strong>l método, don<strong>de</strong> se calcula el punto P. El valor <strong>de</strong> ocultaciónW(P) en la figura <strong>de</strong>recha será proporcional al número <strong>de</strong> rayos que alcanzan el "cielo",teniendo en cuenta la distancia má<strong>xi</strong>ma entre P y el primer objeto <strong>de</strong> intersección. En elcaso <strong>de</strong> la figura <strong>de</strong> la <strong>de</strong>recha será <strong>de</strong> 1/3 <strong>de</strong> los rayos.VentajasPermite simular refle<strong>xi</strong>ones <strong>de</strong> espejo y materiales transparentes(refracción <strong>de</strong> la luz).DesventajasNo es un método <strong>de</strong> iluminación global. No permite la simulación <strong>de</strong>iluminación indirecta ni sombras difusas. Sólo funciona perfectamente ensuperficies con brillo especular don<strong>de</strong> la luz entrante tenga una únicadirección <strong>de</strong> refle<strong>xi</strong>ón.No permite simular profundidad <strong>de</strong> campo ni motion blur (aunque pue<strong>de</strong>nsimularse en postproducción).Ambient OcclusionEl empleo <strong>de</strong>l término <strong>de</strong> luz ambiente viene aplicándose <strong>de</strong>s<strong>de</strong> elinicio <strong>de</strong> las técnicas <strong>de</strong> síntesis <strong>de</strong> imagen 3D. La técnica <strong>de</strong> AmbientOcclusion es un caso particular <strong>de</strong>l uso <strong>de</strong> pruebas <strong>de</strong> oclusión en entornoscon iluminación local para <strong>de</strong>terminar los efectos difusos <strong>de</strong> iluminación.Fueron introducidos inicialmente por Zhurov en 1998 como alternativa alas técnicas <strong>de</strong> radiosidad para aplicaciones interactivas (vi<strong>de</strong>ojuegos), porsu bajo coste computacional [ZHU98]. Po<strong>de</strong>mos <strong>de</strong>finir la ocultación <strong>de</strong> unpunto <strong>de</strong> una superficie como:W P = 1 ∫ d P , cos d ∈


Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>r [ 209 ]Obteniendo un vador <strong>de</strong> ocultación W(P) entre 0 y 1, siendo d(P,ω) ladistancia entre P y la primera intersección con algún objeto en la dirección<strong>de</strong> ω, ρ(d(P,ω)) es una función con valores entre 0 y 1 que nos indica lamagnitud <strong>de</strong> iluminación ambiental que viene en la dirección <strong>de</strong> ω, y θ esel ángulo formado entre la normal en P y la dirección <strong>de</strong> ω.Estas técnicas <strong>de</strong> ocultación (obscurances) se <strong>de</strong>sacoplan totalmente <strong>de</strong> lafase <strong>de</strong> iluminación local, teniendo lugar en una segunda fase <strong>de</strong>iluminación secundaria difusa. Se emplea un valor <strong>de</strong> distancia paralimitar la ocultación únicamente a polígonos cercanos a la zona a sombrearmediante una función. Si la función toma como valor 0 <strong>de</strong> ocultaciónaquellos puntos que no superan un umbral y un valor <strong>de</strong> 1 si están porencima <strong>de</strong>l umbral, la técnica <strong>de</strong> ocultación se <strong>de</strong>nomina AmbientOcclusion. E<strong>xi</strong>sten multitud <strong>de</strong> funciones exponenciales que se utilizanpara lograr estos efectos.VentajasEs al menos un or<strong>de</strong>n <strong>de</strong> magnitud más rápido que el PathTracing. Enmuchos casos la simulación obtenida es suficientemente buena y conmenos ruido.DesventajasNo es un método <strong>de</strong> iluminación global, aunque ofrece apro<strong>xi</strong>macionesbastante buenas. No permite la simulación <strong>de</strong> caústicas, y pue<strong>de</strong> resultarcostoso si aumentamos el número <strong>de</strong> muestras (para eliminar ruido). Eltiempo <strong>de</strong> ren<strong>de</strong>r aumenta muy rápido con el número <strong>de</strong> samples <strong>de</strong>Antialiasing.RadiosidadEn este tipo <strong>de</strong> técnicas se calcula el intercambio <strong>de</strong> luz entresuperficies. Inicialmente fue propuesto por Goral en 1984 [GOR84]. Elcálculo <strong>de</strong>l intercambio <strong>de</strong> luz entre superficies se hace mediante el factor<strong>de</strong> forma, que se calcula mediante la siguiente expresión:F i , j= 1 cos∫∫i cos jHA i A iA j r² ijdA jdA iSiendo F i,j el factor <strong>de</strong> forma <strong>de</strong> la superficie i a la superficie j, cos θ i cosθ jes el ángulo entre las normales <strong>de</strong> los planos <strong>de</strong> cada parche (esto nosasegura que una superficie que esté en frente <strong>de</strong> otra que emite luzrecibirá más luz que una tercera superficie que esté inclinada a ésta). πr²nos mi<strong>de</strong> la distancia entre los parches y H ij es el factor <strong>de</strong> visibilidad,entre 0 y 1, que indica cuánta superficie <strong>de</strong> j ve la superficie i <strong>de</strong>bido a laoclusión <strong>de</strong> otras superficies. Finalmente dA x es el área <strong>de</strong> la superficie x.


[ 210 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DVentajasOfrecen buenos resultados con superficies difusas. Al ofrecer unasolución in<strong>de</strong>pendiente <strong>de</strong>l punto <strong>de</strong> vista, pue<strong>de</strong>n emplearse pararen<strong>de</strong>rizar animaciones incluso <strong>de</strong> forma interactiva.DesventajasLimitan la complejidad <strong>de</strong> la geometría con la que po<strong>de</strong>mos trabajar.Tien<strong>de</strong> a suavizar las zonas <strong>de</strong> penumbra, lo cual no siempre es <strong>de</strong>seable.El tiempo <strong>de</strong> cálculo <strong>de</strong> la matriz <strong>de</strong> radiosidad pue<strong>de</strong> ser muy alto, inclusotrabajando con técnicas incrementales. No funcionan bien con sombreadoespecular.PathtracingEs una extensión <strong>de</strong>l algoritmo <strong>de</strong> Raytracing clásico que permitecalcular una solución <strong>de</strong> iluminación global completa. Fue formulado porKajiya en 1986 como solución a la ecuación <strong>de</strong> ren<strong>de</strong>rizado (en el mismoartículo don<strong>de</strong> era propuesta) [KAJ86], basándose en las i<strong>de</strong>as <strong>de</strong> Cook ensu artículo <strong>de</strong> 1984 [COO84].El Pathtracing se basa en la i<strong>de</strong>a <strong>de</strong> calcular todos los posibles caminos <strong>de</strong>la luz en sus rebotes en superficies que no tengan reflejo especular. Estassuperficies requieren la evaluación <strong>de</strong> integrales complejas. Estasintegrales se solucionan trazando rayos “aleatorios” <strong>de</strong>ntro <strong>de</strong>l dominio <strong>de</strong>la integral para estimar su valor (empleando integración <strong>de</strong> Monte Carlo).Realizando la media <strong>de</strong> un alto número <strong>de</strong> muestras por cada píxelpo<strong>de</strong>mos obtener una estimación <strong>de</strong>l valor <strong>de</strong> la integral para ese píxel.Un aspecto importante <strong>de</strong>l Pathtracing es que sólo utiliza un rayo reflejadopara estimar la iluminación indirecta. Es <strong>de</strong>cir, cuando un rayo chocasobre una superficie difusa, sólo se realizará una llamada con un nuevorayo <strong>de</strong> cálculo <strong>de</strong> la iluminación indirecta, cuya dirección será aleatoria<strong>de</strong>ntro <strong>de</strong>l dominio <strong>de</strong> <strong>de</strong>finición <strong>de</strong> la superficie. Se podrían tener encuenta múltiples rayos, pero al ser un método recursivo, el número <strong>de</strong>rayos crecería <strong>de</strong> forma exponencial si estos nuevos rayos chocaran consuperficies difusas...


Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>r [ 211 ]Descripción <strong>de</strong>l Algoritmopara cada píxel <strong>de</strong> la imagencolor := 0para cada muestra <strong>de</strong>l píxelrayo := trazar un rayo <strong>de</strong>s<strong>de</strong> la cámara a una posiciónaleatoria <strong>de</strong>l píxelcolor := color + pathtracing(rayo)color_pixel := color / numero_muestraspathtracing(rayo)punto := encontrar el punto <strong>de</strong> intersección más cercanocolor := color <strong>de</strong> fondopara cada fuente <strong>de</strong> luzcomprobar visibilidad <strong>de</strong> una posición aleatoria <strong>de</strong> lafuente <strong>de</strong> luzsi es visiblecolor := color + iluminacion directacolor := color + pathtracing(un rayo reflejadoaleatorio)sinocolor := negro<strong>de</strong>volver (color)VentajasSi la iluminación varía poco (por ejemplo, una escena exterior don<strong>de</strong> elcielo es totalmente visible), ofrece resultados sin ruido con pocas muestras.DesventajasPara que no se perciba ruido en la imagen final hay que aumentar elnúmero <strong>de</strong> muestras por píxel, sobre todo en escenas don<strong>de</strong> hayvariaciones muy fuertes en las fuentes <strong>de</strong> luz (fuentes pequeñas y muypotentes, o imágenes HDRI con zonas <strong>de</strong> iluminación muy concentradas).Debido a las propieda<strong>de</strong>s <strong>de</strong> integración <strong>de</strong> Monte Carlo, el errordisminuye proporcionalmente a 1/ N , siendo N el número <strong>de</strong> muestras.Esto significa que para eliminar la mitad <strong>de</strong> ruido tenemos que utilizarcuatro veces más muestras.Irradiance CacheEs un método que evita el cálculo <strong>de</strong> la iluminación global en cadapunto <strong>de</strong>l mo<strong>de</strong>lo. Se seleccionan algunos píxeles y se interpolan losvalores intermedios. Esto hace que se suavice el ruido (aunque se obtieneruido <strong>de</strong> baja frecuencia). Funciona bien con imágenes estáticas, pero sepercibe ruido en animaciones.


[ 212 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DPhoton MappingEs un método que <strong>de</strong>sacopla la representación <strong>de</strong> la iluminación <strong>de</strong> lageometría. Se realiza en dos pasos, primero se construye la estructura <strong>de</strong>lmapa <strong>de</strong> fotones (trazado <strong>de</strong> fotones), <strong>de</strong>s<strong>de</strong> las fuentes <strong>de</strong> luz al mo<strong>de</strong>lo.En una segunda estapa <strong>de</strong> ren<strong>de</strong>r se utiliza la información <strong>de</strong>l mapa <strong>de</strong>fotones para realizar el ren<strong>de</strong>rizado <strong>de</strong> manera más eficiente.Este método fue propuesto por Jensen en 1996 [JEN96]. En una primeraetapa un elevado número <strong>de</strong> fotones son lanzados <strong>de</strong>s<strong>de</strong> las fuentes <strong>de</strong> luz,dividiendo la energía <strong>de</strong> las fuentes <strong>de</strong> luz entre los fotones emitidos (cadafotón transporta una fracción <strong>de</strong> la energía <strong>de</strong> la fuente <strong>de</strong> luz).Cuando se emite un fotón, éste es trazado a través <strong>de</strong> la escena <strong>de</strong> igualforma que se lanzan los rayos en raytracing, excepto por el hecho <strong>de</strong> quelos fotones propagan Flux en vez <strong>de</strong> radiancia. Cuando un fotón choca conun objeto pue<strong>de</strong> ser reflejado, transmitido o absorbido (según laspropieda<strong>de</strong>s <strong>de</strong>l material y un factor aleatorio <strong>de</strong>ntro <strong>de</strong>l dominio <strong>de</strong>lmaterial).Los fotones son almacenados cuando impactan sobre superficies noespeculares (para reflejos se utiliza raytracing clásico). Estealmacenamiento se realiza sobre una estructura <strong>de</strong> datos que está<strong>de</strong>sacoplada <strong>de</strong> la geometría <strong>de</strong>l mo<strong>de</strong>lo, y se utilizará en la etapa <strong>de</strong> ren<strong>de</strong>rpara obtener información sobre qué impactos <strong>de</strong> fotones están más cerca<strong>de</strong>l punto <strong>de</strong>l que queremos calcular su valor <strong>de</strong> iluminación. Para que labúsqueda sea rápida se suelen emplear kd-trees (<strong>de</strong>bido a que ladistribución <strong>de</strong> fotones no es uniforme), cuyo tiempo medio <strong>de</strong> búsquedacon n fotones es <strong>de</strong> O(log n), y O(n) en el peor <strong>de</strong> los casos.Pathtracing BidireccionalFue introducido por Lafortune y Willems en 1993 [LAF93]. Se planteócomo una extensión <strong>de</strong>l Pathtracing (en realidad el Pathtracing pue<strong>de</strong>consi<strong>de</strong>rarse como un caso particular <strong>de</strong> esta técnica) don<strong>de</strong> a<strong>de</strong>más secalculan los caminos <strong>de</strong>s<strong>de</strong> las fuentes <strong>de</strong> luz. Esto aprovecha la i<strong>de</strong>a <strong>de</strong>que hay ciertos caminos que son más fáciles <strong>de</strong> trazar <strong>de</strong>s<strong>de</strong> las fuentes <strong>de</strong>luz, como por ejemplo el caso <strong>de</strong> las caústicas. La probabilidad <strong>de</strong> que unrayo reflejado en una superficie atraviese un objeto transparente y llegue ala fuente <strong>de</strong> luz es muy pequeña comparada con el camino inverso (<strong>de</strong>s<strong>de</strong>la fuente <strong>de</strong> luz a la superficie).En el Pathtracing bidireccional se trazan dos caminos en la escena, uno quecomienza en cada fuente <strong>de</strong> luz y otro en el punto <strong>de</strong> vista. A continuaciónse combina la información <strong>de</strong> los dos caminos conectando los vértices <strong>de</strong>cada camino, y calculando la contribución individual <strong>de</strong> cada vértice <strong>de</strong>lcamino <strong>de</strong> la luz al camino trazado <strong>de</strong>s<strong>de</strong> la cámara.


Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>r [ 213 ]Finalmente la imagen se calcula como en pathtracing, realizando unnúmero <strong>de</strong> muestras por píxel.VentajasSe utiliza un número menor <strong>de</strong> muestras por píxel que en Pathtracing.Se comporta mucho mejor con los casos extremos don<strong>de</strong> Pathtracing sufre<strong>de</strong> mucho ruido (como fuentes <strong>de</strong> iluminación pequeñas con muchaenergía, por ejemplo, una pequeña ventana por don<strong>de</strong> entra la luz a unahabitación). Para escenas <strong>de</strong> exteriores o con una iluminación máshomogénea, es mejor utilizar pathtracing.Las caústicas se calculan perfectamente (en pathtracing habría que recurrira su combinación con Photon Mapping).DesventajasAunque el número <strong>de</strong> muestras es menor, el tiempo <strong>de</strong> cálculo <strong>de</strong> laescena suele ser mayor, <strong>de</strong>bido a que el coste <strong>de</strong> cada muestra es mayorque en pathtracing y se requiere el tiempo <strong>de</strong> combinación <strong>de</strong> los caminos.Igual que en pathtracing, la imagen tiene ruido a menos que se utilice unalto número <strong>de</strong> muestras.Transporte <strong>de</strong> Luz <strong>de</strong> MetrópolisPropuesto en 1997 por Veach y Guibas [VEA97], utiliza la informaciónsobre el espacio en la escena <strong>de</strong> una forma más eficiente. Es un métododiferente a Pathtracing, ya que no realiza muestras aleatorias para resolverel valor <strong>de</strong> la integral, sino que genera una distribución <strong>de</strong> muestras que esproporcional a la función que queremos resolver (esto es, la <strong>de</strong>nsidad <strong>de</strong>rayos es proporcional a la radiancia, concentrando rayos en las regionesmás brillantes <strong>de</strong> la imagen).Este método comienza con una distribución <strong>de</strong> muestras aleatorias(usando pathtracing bidireccional) <strong>de</strong> todas las fuentes <strong>de</strong> luz <strong>de</strong> la escena.Estos caminos son clonados aleatoriamente y mutados. Si el path mutadoes inválido (por ejemplo, atraviesa un muro), entonces se <strong>de</strong>scarta, y elcamino original se utilizará <strong>de</strong> nuevo para obtener una nueva mutación. Siel camino es válido, entonces será aceptado con una <strong>de</strong>terminadaprobabilidad.VentajasEste método funciona bien para simular configuraciones <strong>de</strong> luz que sondifíciles para otros métodos (por ejemplo, un agujero abierto en una pareddon<strong>de</strong> e<strong>xi</strong>ste una pequeña luz). El método <strong>de</strong> Metrópolis encuentra elcamino a través <strong>de</strong> mutaciones <strong>de</strong>l camino, siendo mucho más eficienteque Pathtracing o Pathtracing bidireccional.


[ 214 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 5. Escena ren<strong>de</strong>rizada con diferentes métodos <strong>de</strong> ren<strong>de</strong>r.DesventajasEn escenas “normales”, no e<strong>xi</strong>ste ganancia frente a otras técnicas comoPathtracing o Pathtracing Bidireccional.Comparación <strong>de</strong> tiempos en una escenaEn la siguiente tabla se muestran los tiempos <strong>de</strong> ren<strong>de</strong>r <strong>de</strong> la escena <strong>de</strong>la figura 5. La resolución <strong>de</strong> todos los ejemplos es <strong>de</strong> 640x480 píxeles yoversampling <strong>de</strong> 8 muestras por píxel. La escena está formada por 51016polígonos. El mo<strong>de</strong>lo <strong>de</strong>l dragón tiene propiedad <strong>de</strong> refle<strong>xi</strong>ón (2 niveles <strong>de</strong>recursión), y las copas <strong>de</strong> refle<strong>xi</strong>ón (3 niveles) y refracción (4 niveles).


Estudio <strong>de</strong> Métodos <strong>de</strong> Ren<strong>de</strong>r [ 215 ]La imagen ha sido ren<strong>de</strong>rizada en un Centrino 2GHz, con 1 GB <strong>de</strong> RAMbajo Debian GNU/Linux.Método Parámetros TiempoScanLineNota: En la imagen <strong>de</strong> la figura no se havariado la propiedad <strong>de</strong>l material para que sesimule la transparencia con Ztransp, pero sepodría realizar con un tiempo <strong>de</strong> ren<strong>de</strong>r similar.5 Seg.RaytracingNota: Todos los ejemplos se han ren<strong>de</strong>rizadocon Oversampling <strong>de</strong> nivel 8. La variación <strong>de</strong>lnivel <strong>de</strong> oversampling en una mismaconfiguración <strong>de</strong> resolución <strong>de</strong>l Octree (256)pue<strong>de</strong> suponer las siguientes diferencias <strong>de</strong>tiempo:AA (0): 10'' AA (5): 46'' AA (8):74''AA (11): 102'' AA (16): 146''Resol. Octree (64): 1:34.Resol. Octree (128): 1:16.Resol. Octree (256): 1:14.Resol. Octree (512): 1:23.Raytracing +AmbientOcclusion10 Muestras · Distancia para aplicar AO: 10Energía global AO: 2.0Nota: La variación en el número <strong>de</strong> muestrases <strong>de</strong>terminante en el tiempo <strong>de</strong> ren<strong>de</strong>r. Conuna resolución <strong>de</strong>l Octree <strong>de</strong> 128, los tiempos<strong>de</strong> ren<strong>de</strong>r son:2 M: 129'' 5 M: 218'' 8 M: 426'' 10 M: 615 ''Resol. Octree (64): 14:02.Resol. Octree (128): 10:15.Resol. Octree (256): 11:22.Resol. Octree (512): 16:17.Pathtracing(Skydome)Profundidad rayo má<strong>xi</strong>ma <strong>de</strong>s<strong>de</strong> la cámara: 9Emit Power: 1.5AutoAANota: La diferencia se establece en el número<strong>de</strong> samples <strong>de</strong> la Hemilight.Low (16 Samples): 9:53.Medium (24 Samples): 10:23.High (36 Samples): 16:28.Higher (64 Samples): 27:37.Best (128 Samples: 39:05.Pathtracing(Full) +IrradianceCacheSin refinamiento <strong>de</strong> sombras.Sin mapeado <strong>de</strong> fotones.Calidad <strong>de</strong> Sombras: 0.9Emit Power: 1.5GI Power: 0.5Nota: La diferencia se establece en el número<strong>de</strong> samples <strong>de</strong> la Pathlight.Low (128 Samples): 29:41.Medium (256 Samp.): 40:30.High (512 Samples): 53:12.Higher (1024 Samples):Best (2048 Samples):


[ 216 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DBibliografía[BOU70][COH85]Bouknight, W. J. , "A procedure for generation of threedimensionalhalf-tone computer graphics",Communications of the ACM (1970)Cohen, M. F., Greenberg D. P. , "The Hemi-Cube: A radiositysolution for complex environments", Siggraph 85(Proceedings) (1985)[GOR84] Goral, C. Torrance, K.E., Greenberg, D.P. Battaile, B. ,"Mo<strong>de</strong>lling the interaction of light between diffuse surfaces",Proceedings of SIGGRAPH (1984)[JEN01] Jensen H.W. , "Realistic Image Synthesis Using PhotonMapping", , A.K.Peters, (2001)[JEN96] Jensen, H. W. , "Global Illumination using photon maps",Eurographics Ren<strong>de</strong>ring Workshop (1996)[KAJ86] Kajiya, J.T. , "The ren<strong>de</strong>ring equation", Computer Graphics(1986)[COO86] Robert L. Cook , "Stochastic sampling in computergraphics", ACM Transactions on Graphics (1986)[VEA97] Veach, E., Guibas, L.J. , "Metropolis Light Transport",Proceedings of SIGGRAPH '97 (1997)[WAR92] Ward, G. J., Heckbert, P. , "Irradiance Gradients", Third[WHI80][ZHU98][LAF93][COO84]Eurographics Workshop on Ren<strong>de</strong>ring (1992)Whitted, T. , "An improved illumination mo<strong>de</strong>l for sha<strong>de</strong>ddisplay", Communications of the ACM (1980)Zhukov, S., Iones, A., Kronin, G. , "An ambient lightillumination mo<strong>de</strong>l", Proc. of Eurographics Ren<strong>de</strong>ringWorkshop '98 (1998)Lafortune, E.P., Willems, Y.D. "Bidirectional Path tracing",Compugraphics (1993)Cook, R.L, Porter, T., Carpenter, L., "Distributed raytracing", Computer Graphics (1984)


Sección VDesarrolloFotograma <strong>de</strong> la Película <strong>de</strong> Animación“Elephants Dream” realizada con Blen<strong>de</strong>r© Copyright 2006, Blen<strong>de</strong>r FoundationNetherlands Media Art Institutewww.elephantsdream.org


<strong>de</strong>f trazar (r, prof):c = color()for obj in lObjetos:obj.intersecta(r)# Probamos con todos los objetosif (r.objInter != None):matIn<strong>de</strong>x = r.objInter.materialvInterseccion = r.origen + (r.direccion * r.disInter)vInci<strong>de</strong>nte = vInterseccion - r.origenvVueltaOrigen = r.direccion * -1vVueltaOrigen.normalizar()vNormal = r.objInter.getNormal(vInterseccion)for luz in lLuces:if (luz.tipo == 'ambiental'):c += luz.colorelif (luz.tipo == 'puntual'):dirLuz = luz.posicion - vIntersecciondirLuz.normalizar()rayoLuz = rayo(vInterseccion, dirLuz)sombra = calculaSombra (rayoLuz, r.objInter)dirLuz = luz.posicion - vInterseccion # Sin normalizardirLuz /= dirLuz.modulo() # Aplicamos el fall-offNL = vNormal.pEscalar(dirLuz)if (NL > 0):if (lMateriales[matIn<strong>de</strong>x].cDifuso > 0): # ------- DifusocolorDifuso = luz.color * lMateriales[matIn<strong>de</strong>x].cDifuso * NLcolorDifuso.r *= lMateriales[matIn<strong>de</strong>x].color.r * sombracolorDifuso.g *= lMateriales[matIn<strong>de</strong>x].color.g * sombracolorDifuso.b *= lMateriales[matIn<strong>de</strong>x].color.b * sombrac += colorDifusoif (lMateriales[matIn<strong>de</strong>x].cEspecular > 0): # ----- EspecularR = (vNormal * 2 * NL) - dirLuzespec = vVueltaOrigen.pEscalar(R)if (espec > 0):espec = lMateriales[matIn<strong>de</strong>x].cEspecular * \pow(espec, lMateriales[matIn<strong>de</strong>x].dEspecular)colorEspecular = luz.color * espec * sombrac += colorEspecularif (prof < profTrazado):return cif (lMateriales[matIn<strong>de</strong>x].cRefle<strong>xi</strong>on > 0): # -------- Refle<strong>xi</strong>onT = vVueltaOrigen.pEscalar(vNormal)if (T>0):vDirRef = (vNormal * 2 * T) - vVueltaOrigenvOffsetInter = vInterseccion + vDirRef * PEQUENOrayoRef = rayo(vOffsetInter, vDirRef)c += trazar (rayoRef, prof+1) * lMateriales[matIn<strong>de</strong>x].cRefle<strong>xi</strong>onif (lMateriales[matIn<strong>de</strong>x].cTransmitividad > 0): # ---- RefraccionRN = vNormal.pEscalar(vInci<strong>de</strong>nte * -1)vInci<strong>de</strong>nte.normalizar()if (vNormal.pEscalar(vInci<strong>de</strong>nte) > 0):vNormal = vNormal * -1RN = -RNn1 = lMateriales[matIn<strong>de</strong>x].iRefraccionn2 = 1else:n2 = lMateriales[matIn<strong>de</strong>x].iRefraccionn1 = 1if (n1!=0 and n2!=0):par_sqrt = sqrt (1 - (n1*n1/n2*n2)*(1-RN*RN))The soul of themonkeyvDirRefrac = vInci<strong>de</strong>nte + (vNormal * RN) * (n1/n2) - (vNormal * par_sqrt)vOffsetInter = vInterseccion + vDirRefrac * PEQUENOrayoRefrac = rayo(vOffsetInter, vDirRefrac)c += trazar (rayoRefrac, prof+1) * lMateriales[matIn<strong>de</strong>x].cTransmitividad


YafRayNet: hardware a medida pararen<strong>de</strong>rizar con YafRayRoberto Domínguez (Hardware y Software)Miguel Ángel Guillén (Hardware y Software)Guillermo Vayá (Software)Este proyecto está basado en Yafray (www.yafray.org), uno<strong>de</strong> los motores <strong>de</strong> ren<strong>de</strong>r integrados en Blen<strong>de</strong>r. Lacalidad <strong>de</strong> YafRay alcanza niveles profesionales, y portanto requiere muchos recursos cuando se intenta afrontar unproyecto <strong>de</strong> gran envergadura.Si planificamos un proyecto profesional, tenemos por un lado el diseñoartístico, mo<strong>de</strong>lado, texturizado, iluminación y animación, y luego a<strong>de</strong>másel tiempo <strong>de</strong> ren<strong>de</strong>r, que pue<strong>de</strong> ser tanto o más que todo lo anterior junto.Así que nos pusimos a pensar cómo evitar tener nuestras máquinasocupadas durante semanas o incluso meses haciendo un ren<strong>de</strong>r.La solución en la que estamos trabajando consta <strong>de</strong> tres partes:1. Un hardware específico para ren<strong>de</strong>rizar con YafRay.Funcionalmente una caja negra a la que envías la escena en xml yla ren<strong>de</strong>riza.2. Un sistema escalable <strong>de</strong>s<strong>de</strong> el punto <strong>de</strong> vista <strong>de</strong>l usuario, <strong>de</strong>manera que pueda usar tantas tarjetas a la vez como quiera. Paraconseguir esto, hemos hecho las tarjetas externas al PC yconectadas por red. Se pue<strong>de</strong> tener una granja <strong>de</strong> ren<strong>de</strong>rmontando una red <strong>de</strong> área local don<strong>de</strong> el servidor es el PC y losclientes las tarjetas YafRayNet.3. Un sistema escalable entre usuarios. El software servidor que estácorriendo en tu PC pue<strong>de</strong> compartir los recursos <strong>de</strong> cálculo <strong>de</strong> tustarjetas con otros usuarios en una red P2P, tipo Edonkey o Emule.Así también pue<strong>de</strong>s usar las tarjetas <strong>de</strong> otros a<strong>de</strong>más <strong>de</strong> la tuya.El proyecto tiene la primera parte, lo que es el diseño <strong>de</strong>l hardware y todoel software <strong>de</strong> control <strong>de</strong> la tarjeta, prácticamente terminado y en fase <strong>de</strong>pruebas.Desarrollo[ 219 ]


[ 220 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLa tarjeta se compone principalmente <strong>de</strong> un ColdFire <strong>de</strong> Motorola y 4micros <strong>de</strong> procesamiento <strong>de</strong> señal digital <strong>de</strong> Texas. El funcionamiento es elsiguiente:1. La tarjeta se encien<strong>de</strong>. Hemos <strong>de</strong>sarrollado un cargador <strong>de</strong>arranque que hemos instalado en una pequeña flash conectada alColdFire. El cargador arranca, inicializa el hardware, compruebaque todo funciona perfectamente, activa el Phyter, que es el microque controla la Ethernet, la FPGA que controla el canal DMA y lacomunicación con los dos DSPs, y atien<strong>de</strong> al WatchDog <strong>de</strong>temperatura. Queda finalmente corriendo la pila TCP y se queda ala espera <strong>de</strong> una respuesta por parte <strong>de</strong> la aplicación servidora enel PC.2. El servidor le envía a la tarjeta por TFTP un archivo comprimido.En este archivo hay varias cosas:●Un kernel <strong>de</strong> linux, basado en uCLinux y al que le hemos<strong>de</strong>sarrollado los drivers <strong>de</strong> todo el hardware que lleva laplaca. La parte más difícil ha sido los drivers <strong>de</strong> DMA paraconectar los DSPs al ColdFire, ya que éste sólo tiene un canal


YafRayNet: Hardware a medida para ren<strong>de</strong>rizar con YafRay [ 221 ]DMA, y aún tenemos algunos problemas <strong>de</strong> equalización <strong>de</strong>pistas que nos hace per<strong>de</strong>r un poco <strong>de</strong> rendimiento.●●Un sistema <strong>de</strong> archivo para crear un disco duro virtual enmemoria SDRAM, que lleva una estructura típica <strong>de</strong> Linux.La aplicación cliente <strong>de</strong> ren<strong>de</strong>rizado.● Y el motor <strong>de</strong> ren<strong>de</strong>r que tendrá que cargarse en cada uno <strong>de</strong>los DSPs.Todo esto, sistema operativo y aplicaciones nos ocupa 2MB.3. El ColdFire recibe el archivo, lo <strong>de</strong>scomprime en SDRAM, ejecutael kernel <strong>de</strong> linux, monta el disco virtual, y ejecuta el softwarecliente. El tiempo total <strong>de</strong> arranque es <strong>de</strong> unos 3 segundos. Laventaja <strong>de</strong> hacerlo así, en vez <strong>de</strong> tenerlo todo grabado en lamemoria Flash, es que en cualquier momento se pue<strong>de</strong> actualizarel software <strong>de</strong>l PC, y con ello se actualiza tanto el sistema operativoque corre en el ColdFire como el programa que corre en los DSPs.De hecho el programa <strong>de</strong> los DSPs pue<strong>de</strong> ser cualquier aplicaciónque requiera una gran potencia <strong>de</strong> cálculo en coma fija. Lasprimeras pruebas que hemos hecho para hacer los drivers y medirel rendimiento ha sido con un compresor en tiempo real <strong>de</strong>MPEG4.4. Cuando el servidor <strong>de</strong>l PC envía un trabajo para ser ren<strong>de</strong>rizado, elColdFire carga YafRay en la memoria interna <strong>de</strong> los DSPs, carga laescena que tenemos que ren<strong>de</strong>rizar en la SDRAM externa <strong>de</strong> cadaDSP, y arranca los micros. Para ello cada DSP se conecta alColdFire por DMA sobre un bus HPI, un bus muy similar al PCI <strong>de</strong>los PCs, a 66Mhz.5. Los DSPs ren<strong>de</strong>rizan su parte <strong>de</strong> la escena y cuando terminan<strong>de</strong>vuelven el ren<strong>de</strong>r al ColdFire y éste al servidor <strong>de</strong>l PC.Los DSPs que estamos montando son micros <strong>de</strong> Texas <strong>de</strong> la serie 6000,TMS320DM64x, a 1 Ghz. Cada micro tiene 8 unida<strong>de</strong>s <strong>de</strong> cálculo <strong>de</strong> comafija, con lo que tenemos una potencia <strong>de</strong> 8000 MIPS <strong>de</strong> 32 bits por micro.Un Pentium IV a 1 Ghz con MMX o SSE hace 4 mil millones <strong>de</strong>instrucciones por segundo, por lo que la tarjeta viene a ser en coma fija elequivalente a un Pentium IV a 8 Ghz.El proceso lo va a hacer bastante más rápido <strong>de</strong> lo que lo haría un PC <strong>de</strong>gama alta, y a<strong>de</strong>más <strong>de</strong>ja el PC libre para seguir trabajando con Blen<strong>de</strong>r olo que se quiera. Como las tarjetas se conectan por ethernet se pue<strong>de</strong>nponer hasta 255 conectadas con Hubs. Lo que tenemos es una red local <strong>de</strong>PCs <strong>de</strong> gama alta que cuestan unos 200 euros cada uno.


[ 222 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DDiseño hardwareLa placa es bastante compleja, <strong>de</strong> 12 capas, con microvías y memoriasBGA, montada a mano y rutada con Espectra y Picad. En general hemosutilizado componentes <strong>de</strong> bajo consumo para evitar que se nos dispare eltamaño <strong>de</strong> la tarjeta. Por ahora en pruebas consume a pleno rendimientounos 0.6A a 12V. Para que no se queme le hemos añadido un sensor <strong>de</strong>temperatura y un Watchdog. La memoria es <strong>de</strong> un solo puerto por razón <strong>de</strong>coste, lo que nos ha obligado a gestionar bloqueos entre los DSPs y elColdFire para evitar que accedan a la memoria simultáneamente. Tambiénhemos añadido un estabilizador <strong>de</strong> tensión que hace que los micros noarranquen hasta que la tensión es estable, y como es controlable <strong>de</strong>s<strong>de</strong> elColdFire nos permite también tener reseteados los DSPs hasta que elColdFire haya configurado el bus HPI.Una <strong>de</strong> las etapas más complicadas es portar YafRay a la arquitectura <strong>de</strong>lDSP.


YafRayNet: Hardware a medida para ren<strong>de</strong>rizar con YafRay [ 223 ]Porting <strong>de</strong> YafRayNet a coma fijaLa tarjeta <strong>de</strong> YafRayNet, utiliza un procesador coldfire para realizar loscálculos. El problema que genera el uso <strong>de</strong> este procesador es el hecho <strong>de</strong>que utiliza matemáticas <strong>de</strong> coma fija, al contrario que la mayoría <strong>de</strong> losor<strong>de</strong>nadores <strong>de</strong> uso común estos días que usan matemáticas <strong>de</strong> comaflotante.Un valor en coma fija, es aquel que tiene un número fijo <strong>de</strong> dígitos<strong>de</strong>cimales, es <strong>de</strong>cir, valores cuya precisión es constante. Si un tipo <strong>de</strong> datostiene una precisión <strong>de</strong> 0,001 (3 dígitos <strong>de</strong>cimales) un valor como 0,0002sería consi<strong>de</strong>rado como 0,000; a<strong>de</strong>mas si el numero es muy gran<strong>de</strong>, lacoma fija tampoco da soporte al valor, produciéndose un <strong>de</strong>sbordamiento ydando un valor que no tiene nada que ver con el que se quiere conseguir.Como se pue<strong>de</strong> apreciar, esto pue<strong>de</strong> dar problemas a la hora <strong>de</strong> generarnúmeros muy pequeños o muy gran<strong>de</strong>s, ya que no pue<strong>de</strong> alcanzarlos. Porel contrario, la coma flotante, no tiene una precisión fija, ya que consta <strong>de</strong>dos partes una es el numero (llamado mantisa) y el otro es una potencia(llamandose radix a la base). De esta forma, po<strong>de</strong>mos generar numeroscomo 1 · 10 -3 , lo que nos da el valor <strong>de</strong> 0,001. De igual manera se pue<strong>de</strong>nrepresentar numeros gran<strong>de</strong>s si usamos un exponente positivo. He <strong>de</strong>hacer notar, que los computadores no usan un radix <strong>de</strong> 10, sinogeneralmente una potencia <strong>de</strong> 2.Esta diferencia en la arquitectura <strong>de</strong> los procesadores plantea la necesidad<strong>de</strong> un port <strong>de</strong>l proyecto yafray para ser usado en la placa YafRayNet. Yaque es muy dificil conocer <strong>de</strong> antemano los valores que va a manejar. Unaescena muy gran<strong>de</strong> o una muy pequeña podrian causar errores <strong>de</strong>precisión como los vistos anteriormente.Por todo lo anterior se ha <strong>de</strong>cidido seguir los siguientes pasos a la hora <strong>de</strong>portar el codigo:1. Realizar una version modificada <strong>de</strong> yafray para or<strong>de</strong>nadorespersonales, cambiando el tipo <strong>de</strong> datos <strong>de</strong> float (el nombre que seusa para indicar coma flotante) por un tipo <strong>de</strong> datos que emule elcomportamiento <strong>de</strong> la coma fija.2. Ofrecer esta versión a la comunidad para que la prueben yencontrar posibles errores tanto <strong>de</strong> precisión como otros que no sehayan consi<strong>de</strong>rado. Esta versión sera claramente mas lenta, ya queno es un tipo <strong>de</strong> datos nativo, pero dado que es una version pararealizar busqueda <strong>de</strong> problemas potenciales no se ha consi<strong>de</strong>radola velocidad como un factor importante.


[ 224 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D3. Una vez visto que no hay problemas o que los problemase<strong>xi</strong>stentes son facilmente resolubles, se proce<strong>de</strong>rá a portar elcodigo al ensamblador propio <strong>de</strong>l coldfire.4. Fase <strong>de</strong> <strong>de</strong>puración y optimización <strong>de</strong>l codigo.He <strong>de</strong> recalcar, que la fase 2 es crítica, ya que es aqui don<strong>de</strong> se ha <strong>de</strong><strong>de</strong>cidir como se va a realizar el “porting”. Es importante que los “betatesters”provean <strong>de</strong> toda la información posible, a fin <strong>de</strong> sacar todos losproblemas, por pequeños que estos sean. A<strong>de</strong>mas, el resultado <strong>de</strong> esta fase,mostrará si la conversión <strong>de</strong>l codigo sera una tarea facil o si habra querecrear una coma flotante ficticia para que todo funcione correctamente.Espero que esta tarea no sea necesaria, no solo por el tabajo que elloimplicaria, sino tambien porque aumentaria el tiempo <strong>de</strong> proceso <strong>de</strong> formaimportante.


Exportación <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>rFernando Arroba Rubiognotxor@gmail.com ::Este trabajo preten<strong>de</strong> exponer <strong>de</strong> una manera sencilla yamena los métodos <strong>de</strong> exportación <strong>de</strong> objetos <strong>de</strong>s<strong>de</strong>Blen<strong>de</strong>r a cualquier formato externo. Como ejemploilustrativo se ha seleccionado el lenguaje VRML v2.0 por dosmotivos fundamentales: Es un lenguaje muy extendido ein<strong>de</strong>pendiente <strong>de</strong>l sistema operativo <strong>de</strong> la máquina, peroprincipalmente es un lenguaje <strong>de</strong> <strong>de</strong>scripción <strong>de</strong> espaciosvirtuales comprensible para los humanos. Los ficheros seguardan en formato <strong>de</strong> texto y se pue<strong>de</strong>n modificar y crear concualquier editor <strong>de</strong> texto.El trabajo hace hincapié en la estructura que <strong>de</strong>be tener un scriptexportación <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r, aunque algunas <strong>de</strong> las apreciaciones sonsubjetivas. Para no <strong>de</strong>sviar la atención sobre el eje central <strong>de</strong>l mismo no setratan temas como la “herencia” cuando habla <strong>de</strong> las clases en laexportación. De la misma manera tampoco se hacen referenciasexhaustivas al lenguaje VRML para el cual es recomendable consultaralgún tipo <strong>de</strong> documentación propia. Tampoco se ha pretendido hacer unrepaso exhaustivo <strong>de</strong> las matemáticas que envuelven al 3D y en lo posiblese obviarán <strong>de</strong> la misma manera que se ha intentado evitar complejida<strong>de</strong>s<strong>de</strong> este en el script.Entrando en el menú sin hacer mucho ruidoEl primer punto importante para que Blen<strong>de</strong>r reconozca un script es laprimera línea <strong>de</strong>l código. Paralelamente a lo que hacen los script <strong>de</strong> pythonnormales, que lanzan el intérprete, Blen<strong>de</strong>r lanza el suyo propio:1 #!BPYA continuación <strong>de</strong> esta línea po<strong>de</strong>mos añadir un comentario <strong>de</strong>l scriptque añada funcionalidad a dicha i<strong>de</strong>ntificación. Es <strong>de</strong>cir, po<strong>de</strong>mos hacerun registro <strong>de</strong>l mismo en los menús <strong>de</strong> Blen<strong>de</strong>r.Desarrollo[ 225 ]


[ 226 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D2 """Registramos el script en los menús <strong>de</strong> Blen<strong>de</strong>r3 Name: 'Ejemplo <strong>de</strong> la conferencia...'4 Blen<strong>de</strong>r: 2345 Group: 'Export'6 Tooltip: 'Este es el ejemplo para la conferencia'7 """En este comentario especificamos el texto que aparecerá en el menú(3), la versión para la que está escrito (4), el grupo al que pertenece elscript (5) y la etiqueta <strong>de</strong> ayuda que aparece cuando situamos el cursorsobre la entrada <strong>de</strong>l menú (6).Si la versión <strong>de</strong> Blen<strong>de</strong>r sobre la que corremos el script es anterior a la quemarca la cabecera nos mostrará un aviso <strong>de</strong> que podría no funcionarcorrectamente:Version mismatch: script was written for Blen<strong>de</strong>r 234.It may fail with yours: 232Version mismatch: scriptwas written for Blen<strong>de</strong>r 234. It may fail with yours:232Es posible añadir más información a dicha cabecera, como el po<strong>de</strong>r daropciones al usuario a la hora <strong>de</strong> exportar. Por ejemplo, si queremos que elusuario pueda seleccionar si quiere exportar toda la escena o sólo aquellosobjetos que se encuentren seleccionados, podríamos añadir submenús <strong>de</strong>la siguiente manera:8 """Registramos el script en los menús <strong>de</strong> Blen<strong>de</strong>r9 Name: 'Ejemplo <strong>de</strong> la conferencia...'10 Blen<strong>de</strong>r: 23411 Group: 'Export'12 Submenu: 'Todos los objetos...' todos13 Submenu: 'Objetos seleccionados...' selec14 Tooltip: 'Este es el ejemplo para la conferencia'15 """Si utilizamos submenús (12-13) <strong>de</strong>bemos capturar el valor <strong>de</strong> losmismos (todos o selec). Como no todas las versiones <strong>de</strong> Blen<strong>de</strong>r pue<strong>de</strong>ncapturar ese argumento es mejor tener algún tipo <strong>de</strong> código que controlelas excepciones que pue<strong>de</strong> provocar. Vamos a ver el ejemplo, esta vez conel código completo:16 """Registramos el script en los menús <strong>de</strong> Blen<strong>de</strong>r17 Name: 'Ejemplo <strong>de</strong> la conferencia...'18 Blen<strong>de</strong>r: 23419 Group: 'Export'20 Submenu: 'Todos los objetos...' todos21 Submenu: 'Objetos seleccionados...' selec


Exportación <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r [ 227 ]22 Tooltip: 'Este es el ejemplo para la conferencia'23 """24 # ---------25 # MAIN26 # ---------27 try:28 ARG = __script__['arg'] # Capturo el argumento <strong>de</strong>lsubmenú29 except:30 print "Versión antigua"31 ARG = 'selec'3233 print "Se ha seleccionado la opción: %s" % ARG}Lo más interesante a <strong>de</strong>stacar en el código es el manejo <strong>de</strong> excepciones(27-31) que se hace para cargar en una variable global ARG (28) laselección <strong>de</strong>l usuario. Al manejar la excepción po<strong>de</strong>mos mantener enfuncionamiento el script y así po<strong>de</strong>r asignarle un valor por <strong>de</strong>fecto a lavariable (31). En la linea 33 po<strong>de</strong>mos observar que mostramos a través <strong>de</strong>la consola ese argumento como una ca<strong>de</strong>na <strong>de</strong> caracteres más. Es muchomás interesante, por supuesto, si utilizamos dicho valor para hacer cosasdistintas, por ejemplo:34 if ARG == 'todos':35 losObjetos = Scene.getCurrent().getChildren()36 else:37 losObjetos = Blen<strong>de</strong>r.Object.GetSelected()Es <strong>de</strong>cir, si el argumento pasado es “todos” se cargan todos los objetos<strong>de</strong> la escena actual en una lista llamada “losObjetos”, mientras que si elargumento es otro, se cargarán solo los objetos que estén seleccionados.Recordamos que si se produce la excepción que no permite cargar elargumento <strong>de</strong>s<strong>de</strong> el submenú, el script cargará por <strong>de</strong>fecto sólo los objetosseleccionados.Por otro lado, es muy recomendable que tengamos algún código quecontrole la versión <strong>de</strong> Blen<strong>de</strong>r que se está ejecutando. Aunque ya hemoscomentado que po<strong>de</strong>mos (<strong>de</strong>bemos) establecer la versión <strong>de</strong> Blen<strong>de</strong>r parala que se ha hecho el script y que el propio programa tiene un cierto controlsobre ello, no está <strong>de</strong> más que añadamos más seguridad a nuestro script <strong>de</strong>forma manual. Esto evitará problemas y sinsabores al usuario <strong>de</strong> unaforma sencilla y elegante. Por ejemplo, si sabemos que nuestro script nofunciona en alguna versión <strong>de</strong>terminada podríamos avisar al usuario paraevitar que pruebe una y otra vez sin conseguir nada. Es frustrante cuandolanzas un script y no hace lo que esperas y a<strong>de</strong>más tampoco sabes elporqué. Por ejemplo, si sabemos que estamos utilizando características que


[ 228 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Daparecieron en el API a partir <strong>de</strong> la versión 2.30 podríamos escribir unpoco <strong>de</strong> código <strong>de</strong> la siguiente manera, y comenzar realmente elprocesamiento <strong>de</strong>l fichero a partir <strong>de</strong> la línea 42:38 if Blen<strong>de</strong>r.Get('version') < 230:39 print "Aviso: ¡Versión incorrecta <strong>de</strong> blen<strong>de</strong>r!"40 print "No está utilizando Blen<strong>de</strong>r 2.30 o superior,<strong>de</strong>scargue"41 print "una versión más actualizada <strong>de</strong>s<strong>de</strong>http://blen<strong>de</strong>r.org/"42 else:43 .....Un vistazo a lo que necesitamosAntes <strong>de</strong> comenzar a <strong>de</strong>tallar algunos módulos que <strong>de</strong>bemos emplear <strong>de</strong>forma casi sistemática, necesitamos compren<strong>de</strong>r un poco cómo estáorganizada la información que queremos exportar. También <strong>de</strong>bemostener claro el formato en el que <strong>de</strong>be ser escrita. Esto en algunas ocasiones(por no <strong>de</strong>cir la mayoría) no coinci<strong>de</strong>. Para hacer una exportación limpiamuchas veces <strong>de</strong>beremos tener en cuenta esas peculiarida<strong>de</strong>s y adaptarlaslo mejor posible.Un poco <strong>de</strong> matemáticasUn primer foco <strong>de</strong> problemas pue<strong>de</strong> venir <strong>de</strong> la geometría <strong>de</strong> losobjetos. En algunas ocasiones lo podremos reducir a una cuestión <strong>de</strong>equivalencias <strong>de</strong> escala, en otras necesitaremos un conocimiento un pocomás preciso <strong>de</strong> las matemáticas que envuelven el 3D.Para empezar vamos a echar un vistazo a la matriz <strong>de</strong> los objetos.Comenzamos para ello con la representación <strong>de</strong> un punto. Un punto notiene dimensión, simplemente es una posición (coor<strong>de</strong>nadas) en unespacio 3D. Sin embargo, la misma posición pue<strong>de</strong> estar representada porvalores distintos <strong>de</strong>pendiendo <strong>de</strong>l origen <strong>de</strong> coor<strong>de</strong>nadas que utilicemos.Muchos sistemas y programas que representan figuras en un espacio 3Dsiguen pautas parecidas: almacenan la <strong>de</strong>scripción <strong>de</strong> una malla conrespecto a un punto (que llamaremos centro) y aña<strong>de</strong>n una matriz <strong>de</strong>modificación. En esa matriz se guardan informaciones tan valiosas como laorientación, posición y escalado <strong>de</strong> la malla. Por último, para conocer laposición real <strong>de</strong> un punto <strong>de</strong> esa malla sólo hay que aplicar dicha matriz alas coor<strong>de</strong>nadas relativas <strong>de</strong> dicho punto <strong>de</strong>ntro <strong>de</strong> la malla.


Exportación <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r [ 229 ]Pue<strong>de</strong> parecer algo alejado <strong>de</strong>l usuario normal, pero no lo es, basta pulsar“n” en modo objeto para que blen<strong>de</strong>r nos muestre los valores <strong>de</strong> la matriz<strong>de</strong>l objeto seleccionado (aunque no la matriz misma).Otro tema es la orientación <strong>de</strong> los ejes <strong>de</strong> coor<strong>de</strong>nadas. Concretamente sison ejes <strong>de</strong> coor<strong>de</strong>nadas “a <strong>de</strong>rechas” o “a izquierdas”. Blen<strong>de</strong>r utiliza unsistema orientado a <strong>de</strong>rechas, es <strong>de</strong>cir, “x” crece hacia la <strong>de</strong>recha, “y” crecehacia arriba y “z” crece hacia afuera <strong>de</strong> la pantalla. Otros programas, comoPOV-Ray utilizan un sistema orientado a izquierdas, es <strong>de</strong>cir, “x” e “y”están orientados a <strong>de</strong>recha y arriba, respectivamente y “z” crece haciaa<strong>de</strong>ntro <strong>de</strong> la pantalla.Hay que tener en cuenta todos estos <strong>de</strong>talles a la hora <strong>de</strong> exportar a otrossistemas, pues sus valores pue<strong>de</strong>n representarse <strong>de</strong> otra manera. Antes<strong>de</strong>bíamos realizar todos los cálculos necesarios por nosotros mismos(producto escalar, producto <strong>de</strong> vectores, cálculo <strong>de</strong>l módulo <strong>de</strong> un vector,etc). En la actualidad contamos con un módulo <strong>de</strong> utilida<strong>de</strong>s matemáticas<strong>de</strong>ntro <strong>de</strong> blen<strong>de</strong>r: Mathutils.Blen<strong>de</strong>r (la madre <strong>de</strong>l cor<strong>de</strong>ro)Este módulo es el base <strong>de</strong> todos los <strong>de</strong>más. Por otro lado, tambiénproporciona información útil a la hora <strong>de</strong> la exportación. Por ejemplo, siqueremos proporcionar al usuario un nombre <strong>de</strong> fichero don<strong>de</strong> guardar laexportación, po<strong>de</strong>mos solicitar a Blen<strong>de</strong>r un nombre <strong>de</strong> fichero.44 nombreFichero = Blen<strong>de</strong>r.Get('filename')Guarda en la variable “nombreFichero” el nombre <strong>de</strong>l último archivoque se ha abierto o guardado <strong>de</strong>s<strong>de</strong> blen<strong>de</strong>r. Otra <strong>de</strong> las informacionesútiles que proporciona este módulo es la versión <strong>de</strong> blen<strong>de</strong>r que está enfuncionamiento.45 blen<strong>de</strong>rVer = Blen<strong>de</strong>r.Get('version')A partir <strong>de</strong> este módulo se harán las importaciones.46 import Blen<strong>de</strong>r47 from Blen<strong>de</strong>r import NMesh, Window48 from Blen<strong>de</strong>r import Scene, Mathutils49 ....


[ 230 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEs aconsejable utilizar importaciones <strong>de</strong>s<strong>de</strong> el módulo principal y no hacerimportaciones globales con el comodín “*” para no llenar el diccionario <strong>de</strong>lespacio <strong>de</strong> nombres <strong>de</strong> python con <strong>de</strong>masiadas entradas, muchas <strong>de</strong> ellasinútiles.Por otro lado, el obligarnos a utilizar el nombre <strong>de</strong>l módulo al quepertenece alguna función, o clase, hará más legible el código queescribamos, sobre todo a la hora <strong>de</strong> revisiones posteriores.Facilitando la vida al usuarioHay ocasiones en que el programador hace el script para uso propio.Esto conlleva la ten<strong>de</strong>ncia a interactuar con él <strong>de</strong>s<strong>de</strong> el propio código, sinembargo, hace prácticamente imposible que un tercero utilice dicho script.En otras ocasiones estamos obligados a pensar en cómo otra persona, queno tienen porqué saber nada sobre programación, conseguirá aprovecharel trabajo que realiza el script. Para facilitarnos el trabajo, Blen<strong>de</strong>r provee<strong>de</strong> dos módulos interesantes: Sys y Window. En nuestro ejemploutilizamos tan sólo uno <strong>de</strong> ellos para preguntar el nombre <strong>de</strong>l ficherodon<strong>de</strong> guardará la salida y comenzará el proceso al pulsar el botóncorrespondiente.50 Window.FileSelector(fichero, "Exportar")Esta línea <strong>de</strong> código muestra en la ventana <strong>de</strong> Blen<strong>de</strong>r un diálogo <strong>de</strong>fichero. El primer argumento <strong>de</strong> FileSelector es la función que se ejecutarási se pulsa el botón <strong>de</strong>l diálogo; a dicha función le pasará el nombre <strong>de</strong>lfichero seleccionado. El segundo argumento es el texto que aparecerá endicho botón. Lo que nos interesará, por supuesto, es la estructura <strong>de</strong> lafunción que realiza el trabajo.51 <strong>de</strong>f fichero(nomFichero):52 if nomFichero.find('.wrl', -4) < 0:53 nomFichero += '.wrl'54 # Abro el fichero y lo conecto con std55 f = open(nomFichero, 'w')56 std = sys.stdout57 sys.stdout = f58 # Proceso los datos59 sce = ExportadorEscena(nomFichero)60 sce.proceso()61 # Devuelvo el control <strong>de</strong> stdout y cierro el fichero62 sys.stdout = std63 f.close()


Exportación <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r [ 231 ]Lo primero que hace dicha función es comprobar el nombre <strong>de</strong>l fichero quenos proporciona el selector <strong>de</strong> ficheros <strong>de</strong> Blen<strong>de</strong>r. Principalmente laextensión, hacemos esto para evitar pérdidas <strong>de</strong> datos producidas por unaselección errónea por parte <strong>de</strong>l usuario. Es posible que al seleccionar elnombre <strong>de</strong> un fichero éste marque equivocadamente el fichero .blend <strong>de</strong>origen, o cualquier otro. De esta manera, si el nombre <strong>de</strong>l fichero noconcluye con la extensión <strong>de</strong>seada, esta será añadida salvaguardando <strong>de</strong> lasobrescritura datos ajenos al script y el proceso que representa.En las siguientes líneas (54-63) se realiza todo el proceso. Básicamente entres pasos:1. Se abre un fichero y se redirecciona la salida estándar a él (55-57).2. Se realiza el proceso <strong>de</strong> exportación (59, 60).3. Se <strong>de</strong>vuelve la salida estándar a su estado original (62,63).Esto facilita en gran medida la legibilidad <strong>de</strong>l código pues simplementetendremos que utilizar instrucciones print para realizar la exportación. Encontrapartida, hace necesaria la instalación <strong>de</strong> Python en el sistema puesutiliza su módulo sys.Otra dificultad añadida aparece si el formato al que queremos exportar elfichero es binario. En este caso no podríamos utilizar esta forma <strong>de</strong>simplificación necesitando a<strong>de</strong>más el módulo struct que Pythonproporciona para esos menesteres.Los objetos vistos <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>rNo es objeto <strong>de</strong>l presente trabajo hacer una pormenorizada explicación <strong>de</strong>los distintos módulos que provee Blen<strong>de</strong>r para la automatización <strong>de</strong> tareas.Para eso remitimos al lector a la documentación correspondiente. Sinembargo, no podremos avanzar mucho sin unas pocas palabras sobre eltrabajo fundamental con algunos <strong>de</strong> estos módulos.El objetivo <strong>de</strong>l script <strong>de</strong> ejemplo es la “pedagogía” más que la eficiencia o laexactitud, por lo que se ha intentado mantener en un mínimo razonabletodo el aparato <strong>de</strong> importaciones y código extraño. Incluso el autor se hareprimido <strong>de</strong>l uso <strong>de</strong> la herencia a la hora <strong>de</strong> plantearlo. Por ello, sóloharemos hincapié en los puntos básicos. Uno <strong>de</strong> los cuales es el bucle <strong>de</strong>exportación, que en nuestro caso se encuentra <strong>de</strong>ntro <strong>de</strong> la claseExportadorEscena, concretamente ExportadorEscena.proceso().


[ 232 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D64 class ExportadorEscena:65 <strong>de</strong>f __init__(self, nomFichero):66 self.fichero = nomFichero6768 <strong>de</strong>f proceso(self):69 global losObjetos # Utilizo los objetos cargadosen la lista global70 print "#VRML V2.0 utf8\n" # cabecera <strong>de</strong>l fichero71 print "#%s" % self.fichero # El nombre <strong>de</strong>l fichero72 for obj in losObjetos: # Proceso la lista <strong>de</strong>objetos73 tipo = obj.getType() # Obtener el tipo <strong>de</strong>objeto que vamos a tratar74 if tipo == 'Mesh':75 o = Objeto(obj)76 o.proceso()77 elif tipo == 'Camera':78 c = Camara(obj)79 c.proceso()80 elif tipo == 'Lamp':81 luz = Luz(obj)82 luz.proceso()Lo primero que haremos en el proceso será escribir la cabecera <strong>de</strong>l fichero(70) y añadimos un comentario al mismo con el nombre <strong>de</strong>l fichero (71).Obsérvese que basta con escribir directamente en la salida estándar,puesto que la habíamos redireccionado a nuestro fichero. Después <strong>de</strong> estacabecera comienza un bucle for que constituye el centro <strong>de</strong> todo el script.Dicho bloque (72-82) se encarga <strong>de</strong> procesar los objetos que se hayanincluido en la lista global losObjetos que vimos al principio. Puesto que enel fichero .blend que nos servirá <strong>de</strong> ejemplo sólo hay objetos <strong>de</strong> tipo Mesh,Camera y Lamp, el script sólo tiene en cuenta estos tipos. Se pue<strong>de</strong>observar la similitud en la estructura <strong>de</strong> dicho proceso: primero se crea unobjeto <strong>de</strong>l tipo conveniente y a continuación se llama a su función miembroproceso(). Esta coinci<strong>de</strong>ncia está llamada a ser tratada mediante herencia,sin embargo, se ha evitado llevarla a cabo en este caso para no confundir aaquellos que no estén acostumbrados a la programación orientada aobjetos. La ventaja <strong>de</strong> dicha programación nos permitiría, por ejemplo,escribir sólo una vez el código que realizara el cambio <strong>de</strong> sistema <strong>de</strong>coor<strong>de</strong>nadas en la clase base y que los <strong>de</strong>más objetos hijos lo heredaran.


Exportación <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r [ 233 ]Los objetos <strong>de</strong>s<strong>de</strong> VRMLLa estructura que siguen las clases <strong>de</strong>ntro <strong>de</strong>l script están acomodadas a laestructura que <strong>de</strong>bemos generar para VRML. Es <strong>de</strong>cir, los objetos tienensus mallas <strong>de</strong>finidas como listas <strong>de</strong> vértices que luego son referenciados enlistas <strong>de</strong> caras. Dentro <strong>de</strong> esa estructura <strong>de</strong> sólido llevan también incluidauna estructura <strong>de</strong> “apariencia”.En el caso <strong>de</strong> la apariencia, y con el objeto <strong>de</strong> abreviar un poco, sólo se hantenido en cuenta los parámetros más importantes <strong>de</strong>l material y se hanobviado otros como las texturas.El problema fundamental <strong>de</strong>s<strong>de</strong> VRML era la representación <strong>de</strong> objetos yel cambio <strong>de</strong> origen para los puntos que <strong>de</strong>finen la malla. Como sabemos,Blen<strong>de</strong>r almacena la información <strong>de</strong> las mallas en coor<strong>de</strong>nadas locales. Es<strong>de</strong>cir, las coor<strong>de</strong>nadas <strong>de</strong> un punto están dadas teniendo como origen el“centro” <strong>de</strong>l objeto al que pertenece. Para saber la posición real <strong>de</strong> unpunto (<strong>de</strong>s<strong>de</strong> el 0 absoluto) <strong>de</strong>bemos tener en cuenta las coor<strong>de</strong>nadas <strong>de</strong>lpunto respecto al centro <strong>de</strong>l objeto y la posición, rotación y tamaño <strong>de</strong>lobjeto. Al pasar esta información a VRML nos damos cuenta que unsistema no se correspon<strong>de</strong> con el otro. Las transformaciones en VRML sealmacenan <strong>de</strong> forma distinta y en este sistema no es lo mismo rotar unafigura y luego trasladarla, que trasladar una figura y luego rotarla, pues lastransformaciones se realizan todas <strong>de</strong>s<strong>de</strong> el centro absoluto.Ante estas consi<strong>de</strong>raciones, la salida más sencilla era exportar la malla <strong>de</strong>forma absoluta haciendo la conversión <strong>de</strong> “centros”.83 class Malla:84 ....85 <strong>de</strong>f absoluto(self, v):86 vr = Mathutils.Vector([v[0], v[1], v[2]])87 vr.resize4D()88 return Mathutils.VecMultMat(vr, self.matriz)El método absoluto() se encarga <strong>de</strong> convertir una lista <strong>de</strong> tres valoresen un objeto vector <strong>de</strong>l módulo Mathutils para luego redimensionarlo ymultiplicarlo por la matriz propia <strong>de</strong>l objeto. Devuelve un vector con latrasformación realizada.Reutilizando cosasOtro <strong>de</strong> los aspectos a tener en cuenta cuando se realice unaexportación es la posible reutilización <strong>de</strong> objetos, texturas, materiales...que pueda realizar el sistema al que estamos exportando. No sólo eso, sinotambién en qué manera lo vamos a hacer.


[ 234 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEn nuestro caso hemos <strong>de</strong>cidido reutilizar los materiales. Para ello hemoshabilitado un diccionario python don<strong>de</strong> almacenar los que vamosencontrando. Eso nos permite luego <strong>de</strong>cidir si tenemos que hacer la<strong>de</strong>finición completa o sólo una inclusión <strong>de</strong> la misma.89 materiales = {}90 class Material:91 <strong>de</strong>f __init__(self, mat):92 global materiales93 self.nombre = mat.getName()94 if materiales.has_key(self.nombre):95 self.<strong>de</strong>finido = 196 else:97 self.<strong>de</strong>finido = 098 materiales[self.nombre] = 199 self.color = mat.getRGBCol()100 self.ambiente = mat.getAmb()101 self.spec = mat.getSpecCol()102 self.emit = mat.getEmit()103 self.brillo = mat.hard/255.0104 self.transparencia = 1 - mat.alphaEn el fragmento <strong>de</strong> script se pue<strong>de</strong> <strong>de</strong>stacar la <strong>de</strong>finición <strong>de</strong> undiccionario python vacío llamado materiales (89). A continuación, <strong>de</strong>ntro<strong>de</strong> la clase que va a procesar este tipo <strong>de</strong> objetos activamos <strong>de</strong>finido comoflag que nos dirá si hay que hacer el proceso completo o no (94-97). Si noestá <strong>de</strong>finido con anterioridad el constructor <strong>de</strong> la clase aña<strong>de</strong> ese materialal diccionario (98) y carga los valores necesarios para procesar el material(99-104).El script completo105 #!BPY106 """ Registramos el script en los menús <strong>de</strong> Blen<strong>de</strong>r107 Name: 'Ejemplo <strong>de</strong> la conferencia...'108 Blen<strong>de</strong>r: 23109 Group: 'Export'110 Submenu: 'Todos los objetos...' todos111 Submenu: 'Objetos seleccionados...' selec112 Tooltip: 'Esto es un ejemplo para la conferencia'113 """114115 import Blen<strong>de</strong>r116 import sys117 from Blen<strong>de</strong>r import NMesh, Lamp, Window118 from Blen<strong>de</strong>r import Scene, Mathutils119


Exportación <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r [ 235 ]120 losObjetos = []121 materiales = {}122123 class Material:124 <strong>de</strong>f __init__(self, mat):125 global materiales126 self.nombre = mat.getName()127 if materiales.has_key(self.nombre):128 self.<strong>de</strong>finido = 1129 else:130 self.<strong>de</strong>finido = 0131 materiales[self.nombre] = 1132 self.color = mat.getRGBCol()133 self.ambiente = mat.getAmb()134 self.spec = mat.getSpecCol()135 self.emit = mat.getEmit()136 self.brillo = mat.hard/255.0137 self.transparencia = 1 - mat.alpha138139 <strong>de</strong>f proceso(self):140 if self.<strong>de</strong>finido == 1:141 print "\t\t# Material:", self.nombre, "ya <strong>de</strong>finido."142 self.escribeMaterialRepetido()143 else:144 print "\t\t# Definición <strong>de</strong>l material:", self.nombre145 self.escribeMaterial()146147 <strong>de</strong>f escribeMaterial(self):148 # Inicio la <strong>de</strong>finición <strong>de</strong>l material149 print "\t\tmaterial DEF %s Material {" % self.nombre150 print "\t\t\tdiffuseColor", self.color[0],self.color[1], self.color[2]151 print "\t\t\tambientIntensity", self.ambiente152 print "\t\t\tspecularColor", self.spec[0], self.spec[1],self.spec[2]153 print "\t\t\temissiveColor", self.emit, self.emit,self.emit154 print "\t\t\tshininess", self.brillo155 print "\t\t\ttransparency", self.transparencia156 # Cierro la <strong>de</strong>finición <strong>de</strong>l material157 print "\t\t}", "# Final <strong>de</strong>l material", self.nombre158159 <strong>de</strong>f escribeMaterialRepetido(self):160 print "\t\tmaterial USE", self.nombre161162 class Apariencia:163 <strong>de</strong>f __init__(self, m):164 self.materiales = m165166 <strong>de</strong>f proceso(self):167 # Cabezara <strong>de</strong> la apariencia168 print "\tappearance Appearance {"169 for m in self.materiales: #Proceso los materiales170 mat = Material(m)171 mat.proceso()


[ 236 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D172 # Cierre <strong>de</strong> la apariencia173 print "\t} # Fin apariencia"174175 class Malla:176 <strong>de</strong>f __init__(self, m):177 self.malla = m.getData()178 self.nombre = m.name179 if (self.malla.getMo<strong>de</strong>() & NMesh.Mo<strong>de</strong>s.TWOSIDED) == 0:180 self.doblecara = 1181 else:182 self.doblecara = 0183 self.verts = self.malla.verts184 self.faces = self.malla.faces185 self.matriz = m.matrixWorld186187 <strong>de</strong>f proceso(self):188 # Inicio el proceso <strong>de</strong> la malla189 print "\tgeometry In<strong>de</strong>xedFaceSet {"190 # Una o dos caras191 if self.doblecara == 1:192 print "\t\tsolid FALSE # Dos caras"193 else:194 print "\t\tsolid TRUE # Una cara"195 self.vertices()196 self.caras()197 # Finalizo el proceso <strong>de</strong> la malla198 print "\t} # Fin <strong>de</strong> la geometría:", self.nombre199200 <strong>de</strong>f vertices(self):201 print "\t\tcoord DEF c_%s Coordinate {" % self.nombre202 print "\t\t\tpoint ["203 for v in self.verts:204 vr = self.absoluto(v)205 print "\t\t\t\t %f %f %f," % (vr[0], vr[1], vr[2])206 print "\t\t\t] # Final <strong>de</strong> los vértices"207 print "\t\t} # Fin coor<strong>de</strong>nadas c_%s" % self.nombre208209 <strong>de</strong>f absoluto(self, v):210 vr = Mathutils.Vector([v[0], v[1], v[2]])211 vr.resize4D()212 return Mathutils.VecMultMat(vr, self.matriz)213214 <strong>de</strong>f caras(self):215 print "\t\tcoordIn<strong>de</strong>x ["216 for f in self.faces:217 verCara = ""218 for v in f.v:219 verCara += "%d, " % v.in<strong>de</strong>x220 print "\t\t\t%s-1," % verCara221 print "\t\t] # Final <strong>de</strong> la <strong>de</strong>finición <strong>de</strong> las caras"222223 class Objeto:224 <strong>de</strong>f __init__(self, obj):225 self.objeto = obj


Exportación <strong>de</strong>s<strong>de</strong> Blen<strong>de</strong>r [ 237 ]226 self.nombre = obj.name227 self.malla = obj.getData()228229 <strong>de</strong>f proceso(self):230 print "# Esto es el objeto malla: %s" % self.nombre231 # Comienza el proceso232 print "DEF %s Shape {" % self.nombre233 # Obtengo los materiales234 mats = self.malla.materials235 # Proceso la "apariencia"236 ap = Apariencia(mats)237 ap.proceso()238 # Proceso la "malla"239 malla = Malla(self.objeto)240 malla.proceso()241 # Cierro la forma242 print "} # Shape %s" % self.nombre243244 class Luz:245 <strong>de</strong>f __init__(self, l):246 self.luz = l247248 <strong>de</strong>f proceso(self):249 print "# Aquí iría la <strong>de</strong>finición <strong>de</strong> un punto <strong>de</strong> luz -"250 print "# Dejamos al lector el ejercicio <strong>de</strong> <strong>de</strong>finir losdistintos tipos <strong>de</strong> luces."251 print "# Recordarle, únicamente, la conveniencia <strong>de</strong><strong>de</strong>sactivar la luz 'subjetiva'"252 print "# que coloca VRML por <strong>de</strong>fecto."253 print "# ------------------------------------"254255 class Camara:256 <strong>de</strong>f __init__(self, cam):257 self.camara = cam258 self.nombre = cam.name259 self.pos = cam.getLocation()260 self.orien = cam.getEuler()261262 <strong>de</strong>f proceso(self):263 print 'DEF %s Viewpoint {' % self.nombre264 print '\t<strong>de</strong>scription "%s"' % self.nombre265 # Hago trampas con el ángulo <strong>de</strong> rotación <strong>de</strong>l vector <strong>de</strong>orientación y escablezco un266 # valor para evitar complicar más el script267 print '\torientation', self.orien[0], self.orien[1],self.orien[2], '1.5'268 print '\tposition %f %f %f' % (self.pos[0], self.pos[1],self.pos[2])269 print '} # Fin <strong>de</strong> la <strong>de</strong>finición <strong>de</strong>', self.nombre270271 class ExportadorEscena:272 <strong>de</strong>f __init__(self, nomFichero):273 self.fichero = nomFichero274275


[ 238 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D276 <strong>de</strong>f proceso(self):277 global losObjetos #Objetos cargados en la lista global278 # escribo la cabecera <strong>de</strong>l fichero279 print "#VRML V2.0 utf8\n"280 print "#%s" % self.fichero # El nombre <strong>de</strong>l fichero281 for obj in losObjetos: # Proceso la lista <strong>de</strong> objetos282 tipo = obj.getType() # Obtener el tipo <strong>de</strong> objeto283 if tipo == 'Mesh': # y tratarlo284 o = Objeto(obj)285 o.proceso()286 elif tipo == 'Camera':287 c = Camara(obj)288 c.proceso()289 elif tipo == 'Lamp':290 luz = Luz(obj)291 luz.proceso()292293 <strong>de</strong>f fichero(nomFichero):294 if nomFichero.find('.wrl', -4) < 0:295 nomFichero += '.wrl'296 # Abro el fichero y lo conecto con std297 f = open(nomFichero, 'w')298 std = sys.stdout299 sys.stdout = f300 # Proceso los datos301 sce = ExportadorEscena(nomFichero)302 sce.proceso()303 # Devuelvo el control <strong>de</strong> stdout y cierro el fichero304 sys.stdout = std305 f.close()306307 #------------------------------------------------------308 # MAIN309 #------------------------------------------------------310 try:311 ARG = __script__['arg'] # Capturo argumento <strong>de</strong>l submenú312 except:313 print "Versión antigua"314 ARG = 'selec'315316 if Blen<strong>de</strong>r.Get('version') < 230:317 print "Aviso: ¡Versión incorrecta <strong>de</strong> blen<strong>de</strong>r!"318 print " No está utilizando Blen<strong>de</strong>r 2.30 o superior, "319 print " <strong>de</strong>scargue una versión más actualizada... "320 else:321 if ARG == 'todos':322 escena = Scene.getCurrent()323 losObjetos = escena.getChildren()324 else:325 losObjetos = Blen<strong>de</strong>r.Object.GetSelected()326327 Window.FileSelector(fichero, "Exportar")


Extendiendo Blen<strong>de</strong>r:Programando Plugins <strong>de</strong> TexturasSGuillermo Vayái el mo<strong>de</strong>lado es la parte que nos permite compren<strong>de</strong>r laforma <strong>de</strong>l objeto, las texturas son todo aquello que “dacolor” a los mo<strong>de</strong>los, tanto en el sentido figurado como enel estricto. Son imágenes aplicadas a las caras <strong>de</strong> los mo<strong>de</strong>los,las cuales <strong>de</strong>finen o modifican las propieda<strong>de</strong>s <strong>de</strong>l material.Introducción a las Texturas y a las TexturasProceduralesLas texturas pue<strong>de</strong>n tener entre una y tres dimensiones, según queramosque afecten <strong>de</strong> forma lineal, superficial o a todo un volumen. Sin embargo,lo más habitual suelen ser las texturas bidimensionales, ya que con éstas sepue<strong>de</strong> modificar todo un mo<strong>de</strong>lo aplicándol a las diversas caras.Los parámetros que pue<strong>de</strong> modificar son muy diversos. Para mucha gente,las texturas únicamente asignan el color a las caras, pero esto no es así,sino que un buen texturizado pue<strong>de</strong> hacer brillar lo que antes no era másque un mal mo<strong>de</strong>lo. Parámetros como la refle<strong>xi</strong>ón o la transparencia alphason ejemplos <strong>de</strong> algunas características <strong>de</strong>l material que una textura pue<strong>de</strong>modificar para una correcta visualización <strong>de</strong>l objeto. Mediante las texturaspo<strong>de</strong>mos simular elementos <strong>de</strong> mo<strong>de</strong>lado que no e<strong>xi</strong>sten (“bumping map”,también llamado canal nor) o incluso generarlos (“displacement map”).Para po<strong>de</strong>r conseguir nuestra biblioteca <strong>de</strong> texturas, hay que empezardistinguiéndolas en dos tipos:●Procedurales. Son aquellas generadas por un algoritmo y que seimplementan gracias a la programación. Son calculadas en tiempo<strong>de</strong> ren<strong>de</strong>rizado.Desarrollo[ 239 ]


[ 240 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D●No procedurales. Son dibujos, fotografías y, en <strong>de</strong>finitiva,cualquier imagen estática. No <strong>de</strong>pen<strong>de</strong>n <strong>de</strong> ningún parámetro y,por lo tanto, siempre quedan <strong>de</strong> la misma forma.Aunque aparentemente las no procedurales <strong>de</strong>n la impresión <strong>de</strong> sermás fáciles <strong>de</strong> conseguir (mucha gente piensa que tomando una fotografíao haciendo un dibujo rápido se pue<strong>de</strong>n generar buenas texturas), lo ciertoes que tanto uno como otro mo<strong>de</strong>lo son bastante trabajosos a la hora <strong>de</strong>crearlos.Una textura procedural se consigue mediante la aplicación <strong>de</strong> mo<strong>de</strong>losmatemáticos, es muy complicado generar un mo<strong>de</strong>lo matemático buenoque solucione el problema. Pero una vez está <strong>de</strong>sarrollado éste, el paso alalgoritmo programado es bastante sencillo. En cambio, en las noprocedurales pasa justo lo contrario: encontrar lo que necesitas es fácil,pero su conversión a una imagen <strong>de</strong> or<strong>de</strong>nador que no tenga parámetros <strong>de</strong>iluminación residuales es realmente complicado.Se ha <strong>de</strong> <strong>de</strong>stacar que el principal problema y virtud <strong>de</strong> las texturasprocedurales es su propiedad <strong>de</strong> mantener patrones repetitivos. Al aplicaruna procedural como mapa <strong>de</strong> color, po<strong>de</strong>mos ver cómo los caracterespredominantes se repiten <strong>de</strong> forma obvia, lo cual suele dar un<strong>de</strong>sagradable efecto <strong>de</strong> irrealidad. A<strong>de</strong>más, los patrones repetitivos son una<strong>de</strong> las causas más comunes <strong>de</strong> aliasing al alejarnos <strong>de</strong> la textura (o lo que eslo mismo, al reducirla).De igual manera es una característica indispensable, ya que <strong>de</strong> otra formano podríamos pre<strong>de</strong>cir el resultado: imagina una textura que a cada ren<strong>de</strong>rtomase una forma distinta; sería poco útil, ¿no? Incluso aquellas que nosparecen completamente aleatorias no lo son, y no sólo porque unor<strong>de</strong>nador no pueda generar un elemento aleatorio puro, sino porque yahemos visto que no interesa.Todo esto nos lleva a pensar que las texturas procedurales son el aliadoperfecto para generar modificaciones en los materiales.Consiguiendo bmakeLos <strong>de</strong>sarrolladores <strong>de</strong> Blen<strong>de</strong>r hacen todo lo posible por hacer más fácil lacolaboración con los proyectos <strong>de</strong> la Blen<strong>de</strong>r Foundation. Un claro ejemploes la herramienta bmake. bmake es un shell script creado para facilitar latarea a aquellos interesados en <strong>de</strong>sarrollar un plugin. Compilará nuestrocódigo y generará una librería <strong>de</strong> enlace dinámico (generalmentecaracterizada por la extensión .so en linux). De ésta manera los pluginsque ejecutemos correrán en Blen<strong>de</strong>r como si fuesen parte <strong>de</strong>l programa


Extendiendo Blen<strong>de</strong>r: Programando plugins <strong>de</strong> Texturas [ 241 ]original. Es por esto que hay que tener cierto cuidado al ejecutar pluginsque no sepamos que son estables, cualquier error en el plugin podríaestropear la ejecución <strong>de</strong> Blen<strong>de</strong>r y causar un cierre prematuro e in<strong>de</strong>seado<strong>de</strong> éste.Si bien hasta aquí es todo muy bonito, el futuro <strong>de</strong>sarrollador <strong>de</strong> pluginspue<strong>de</strong> encontrarse con un pequeño contratiempo. En los paquetes <strong>de</strong>ciertas distribuciones (como por ejemplo en Debian) la utilidad bmake ytodo lo necesario para la compilación no está empaquetado. Ésto pue<strong>de</strong> ser<strong>de</strong>bido a que realmente <strong>de</strong>bería pertenecer a un futuro blen<strong>de</strong>r-<strong>de</strong>v.Para conseguir los ficheros necesarios bajamos una versión <strong>de</strong>l cvs:# cvs -d:pserver:anonymous@cvs.blen<strong>de</strong>r.org:/cvsroot/bf-blen<strong>de</strong>rco blen<strong>de</strong>ry la compilamos# scons releaseLa utilidad bmake estará en (path cvs)/blen<strong>de</strong>r/release/plugins/bmake ylas librerías necesarias en (path cvs)/blen<strong>de</strong>r/source/blen<strong>de</strong>r/blen<strong>de</strong>rpluginapi.Copiaremos bmake en el directorio <strong>de</strong> plugins y los hea<strong>de</strong>rs loscompiaremos bajo plugins, en el directorio inclu<strong>de</strong>.En dicho directorio también hay otros dos llamados texture y secuencer.En texture será don<strong>de</strong> crearemos los ficheros .c con el código <strong>de</strong>l plugin.¡Ahora ya tenemos todo! Para compilar iremos a la carpeta textures yteclearemos:# ./bmake plugin.cPara probarlo en la carpeta textures <strong>de</strong>bería haber dos ejemplos:tiles.c y clouds2.c# ./bmake tiles.c# ./bmake clouds2.cCualquiera <strong>de</strong> los anteriores <strong>de</strong>bería compilar sin problemas.


[ 242 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEstructura <strong>de</strong> un plugin <strong>de</strong> texturasEn la documentación <strong>de</strong> Blen<strong>de</strong>r.org viene una estructura básica paracomenzar a diseñar un plugin. Aprovecharemos este recurso para evitarempezar <strong>de</strong> cero.# inclu<strong>de</strong> "plugin.hEsta directiva <strong>de</strong> preprocesador ha <strong>de</strong> estar incluida en todo plugin quequeramos <strong>de</strong>sarrollar. Si no lo hacemos así, habrá varias constantes yfunciones que no estarán disponibles y por tanto no se podrá compilarcorrectamente.char name[24] = ""; /* Texture name */Aquí irá el nombre <strong>de</strong> nuestro plugin tal y como queramos queaparezca en la interfaz <strong>de</strong> Blen<strong>de</strong>r, como se pue<strong>de</strong> apreciar, tiene unmá<strong>xi</strong>mo <strong>de</strong> 23 caracteres.#<strong>de</strong>fine NR_TYPES 3char stnames[NR_TYPES][16] = {"Intens", "Color", "Bump"};NR_TYPES da el número <strong>de</strong> subtipos que e<strong>xi</strong>stirán en nuestro plugin. Deesta manera se pue<strong>de</strong> tener varias texturas procedurales <strong>de</strong> característicasparecidas bajo un único archivo <strong>de</strong> plugin, pudiendo cambiar <strong>de</strong> una a otra<strong>de</strong>s<strong>de</strong> la selección que nos brinda la interfaz <strong>de</strong> Blen<strong>de</strong>r. Un ejemplo <strong>de</strong>esto es la textura <strong>de</strong> Clouds, po<strong>de</strong>mos seleccionarlas en blanco y negro o encolor. La siguiente línea indica los nombres que asignaremos a estossubtipos. No se <strong>de</strong>be superar los 16 caracteres para el nombre (no, nisiquiera modificando la <strong>de</strong>claración, si haces eso Blen<strong>de</strong>r pue<strong>de</strong> darresultados inesperados).VarStruct varstr[] = {{NUMIFLO, "Const 1", 1.7, -1.0, 1.0, ""},};type<strong>de</strong>f struct Cast {float a;} Cast;Estas dos estructuras son las que nos darán la información que lepidamos al usuario. Hay que tener en cuenta que han <strong>de</strong> estar or<strong>de</strong>nadaslas variables <strong>de</strong> igual forma que los botones, para que el valor <strong>de</strong> uno seaasignado a la otra.


Extendiendo Blen<strong>de</strong>r: Programando plugins <strong>de</strong> Texturas [ 243 ]varstr <strong>de</strong>fine los botones que se van a mostrar así como susparámetros básicos. Se podrían dividir en dos grupos básicos:1. Numéricos: Está dividida en 3 subtipos combinados con un flo(coma flotante) o con un int (para enteros) mediante un operadoror ("|"):●●●num: valor numérico, se edita directamente.numsli: barra <strong>de</strong>slizadora para elegir el valor.tog: un interruptor, consta <strong>de</strong> dos posiciones.2. Caracteres: label, sirven para entradas <strong>de</strong> tipo texto.A continuación especificamos el nombre, que será lo que aparezca en eltexto <strong>de</strong>l botón. No <strong>de</strong>be superar los 15 caracteres.Para los elementos <strong>de</strong> tipo numérico, <strong>de</strong>bemos especificar el valor por<strong>de</strong>fecto, mínimo y má<strong>xi</strong>mo, en este or<strong>de</strong>n. En el caso <strong>de</strong> los tog, el valormínimo es el <strong>de</strong> pulsado y el má<strong>xi</strong>mo el <strong>de</strong> libre.Detrás viene el “tip” o la ayuda que aparecerá cuando el puntero esté unosmomentos encima <strong>de</strong>l botón. El má<strong>xi</strong>mo es <strong>de</strong> 80 caracteres y si no sequiere usar, <strong>de</strong>bemos <strong>de</strong>jar un string nulo ("").El Cast es la estructura con la cual se nos pasarán los valores tomados porla interfaz. Por cada elemento que hubiese en el varstr, aquí habrá otro, enel mismo or<strong>de</strong>n y con el tipo apropiado. Generalmente se suele usar elmismo nombre que para el botón, aunque esto último no es necesario (esuna práctica recomendable, ya que mejora la legibilidad <strong>de</strong> nuestrosprogramas y acelera la <strong>de</strong>puración <strong>de</strong> los mismos).float result[8];Aquí irá lo que queramos <strong>de</strong>volver a Blen<strong>de</strong>r. No tiene porqué estarrelleno entero, sino que <strong>de</strong>pen<strong>de</strong>rá <strong>de</strong>l valor que <strong>de</strong>mos a la sentenciareturn al final <strong>de</strong> la función texDoit.●●●●●result[0]: intensidad. Éste es el único que hay que rellenarsiempre.result[1]: valor <strong>de</strong> rojo.result[2]: valor <strong>de</strong> ver<strong>de</strong>.result[3]: valor <strong>de</strong> azul.result[4]: valor <strong>de</strong> alfa● result[5]: <strong>de</strong>splazamiento <strong>de</strong> la normal en el eje X.● result[6]: <strong>de</strong>splazamiento <strong>de</strong> la normal en el eje Y.● result[7]: <strong>de</strong>splazameinto <strong>de</strong> la normal en el eje Z.


[ 244 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Dfloat cfra;Esta variable nos la establece blen<strong>de</strong>r con el frame actual.int plugin_tex_doit(int, Cast*, float*, float*, float*);Prototipo <strong>de</strong> la función principal para registrarla en la interfaz <strong>de</strong>blen<strong>de</strong>r. Más a<strong>de</strong>lante hablaremos <strong>de</strong> sus parámetros./* Fixed Functions */int plugin_tex_getversion(void) {return B_PLUGIN_VERSION;}void plugin_but_changed(int but) { }Esta parte <strong>de</strong>l código no hace falta tocarla, y no <strong>de</strong>beremos tocarla amnos que sepamos lo que estamos haciendo. Aun así, <strong>de</strong>beremos añadirlapor compatibilidad <strong>de</strong> código.void plugin_init(void) { }Esta función sólo la modificaremos si hace falta realizar algún tipo <strong>de</strong>cálculo o inicialización antes <strong>de</strong> comenzar con el procedimiento. Esimportante tener en cuenta que si este plugin se usa en más <strong>de</strong> un sitio, lafunción init será llamada cada vez que se acceda a uno <strong>de</strong> estos elementos,por lo que no se <strong>de</strong>be inicializar elementos <strong>de</strong> forma global a menos queestemos muy seguros <strong>de</strong> que es eso lo que queremos.void plugin_getinfo(PluginInfo *info) {info->name=name;info->stypes=NR_TYPES;info->nvars=sizeof(varstr)/sizeof(VarStruct);}info->snames=stnames[0];info->result=result;info->varstr=varstr;info->init=plugin_init;info->tex_doit=(TexDoit) plugin_tex_doit;info->callback=plugin_but_changed;Esta función es la que se encarga <strong>de</strong> registrar los nombres <strong>de</strong> losdistintos elementos <strong>de</strong> comunicación entre Blen<strong>de</strong>r y el plugin. Si cambiasalgún nombre más arriba, entonces también <strong>de</strong>berás cambiarlo aquí.Aunque lo más recomendable sería no cambiar ninguno <strong>de</strong> los nombresclave para que la gente pueda enten<strong>de</strong>r mejor el código.


Extendiendo Blen<strong>de</strong>r: Programando plugins <strong>de</strong> Texturas [ 245 ]int plugin_tex_doit(int stype, Cast *cast, float *texvec,float *dxt, float *dyt)Cabecera <strong>de</strong> la función principal. Cuando Blen<strong>de</strong>r quiera ejecutar elplugin, ésta será la función a la que llame (<strong>de</strong>spués <strong>de</strong> haber llamado a la<strong>de</strong> init si es la primera vez que acce<strong>de</strong> al plugin).Parámetros:●●●●stype: indica el subtipo que seleccionó el usuario, en el caso <strong>de</strong>haber más <strong>de</strong> uno.cast: estructura con los datos <strong>de</strong> la selección <strong>de</strong> parámetros <strong>de</strong>lusuario a través <strong>de</strong> la interfaz <strong>de</strong> botones que le dimos.texvec: array <strong>de</strong> tres elementos, indicando la posición x, y, z <strong>de</strong>ltexel (el punto <strong>de</strong> la textura).dxt y dyt: estos valores estarán a null a menos que se haya pedidoantialiasing (osa). En caso <strong>de</strong> contener algún valor, indicarán eltamaño <strong>de</strong> la textura en espacio <strong>de</strong> pixel (la explicación <strong>de</strong> esteconcepto queda fuera <strong>de</strong> este manual, consulta algún libro <strong>de</strong>texturas procedurales para saber lo que es).if (stype == 1) {return 1;} if (stype == 2) {return 2;}return 0;De todo lo anterior sólo explicaremos el valor <strong>de</strong> return. Según<strong>de</strong>volvamos 0, 1, 2 ó 3, Blen<strong>de</strong>r acce<strong>de</strong>rá a distintos valores <strong>de</strong>l arrayresult.●●●●0: únicamente mirará la intensidad.1: mirará tanto la intensidad como los valores <strong>de</strong> color rgba.2: usará los valores <strong>de</strong> intensidad y <strong>de</strong> mapa <strong>de</strong> <strong>de</strong>splazamiento.3: acce<strong>de</strong>rá a todo el array.Ejemplo: Smiley.cAhora comenzaremos a <strong>de</strong>sarrollar un sencillo plugin. Digo sencillo ya queno tiene ni siquiera antialiasing, sólo con este tema ya podría constituir porsí solo un tema entero <strong>de</strong>bido a la cantidad <strong>de</strong> posibilida<strong>de</strong>s que tiene asícomo la elección <strong>de</strong> cuál es mejor o peor según qué casos.


[ 246 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEl plugin generará un “smiley” ligeramente configurable, podremoscambiar el tamaño así como si está triste o alegre (menuda chorrada,¿no?). Con este plugin quiero <strong>de</strong>mostrar que mediante procedurales sepue<strong>de</strong>n realizar múltiples texturas, incluso aquellas más inverosímiles,aunque a veces no sean las más útiles. A<strong>de</strong>más nos servirán como ejemplopara introducirnos un poco más en el mundo <strong>de</strong> las texturas procedurales<strong>de</strong> Blen<strong>de</strong>r.Empezamos poniendo las librerías en las cuales se va a apoyar nuestroplugin. Como untilizaremos algunas funciones matemáticas avanzadas(seno, coseno y potencia) <strong>de</strong>beremos incluir la librería math. A<strong>de</strong>másañadiremos la <strong>de</strong>finición <strong>de</strong> plugin para que use los parámetros, funcionesy constantes necesarias para la api <strong>de</strong> plugin.#inclu<strong>de</strong> #inclu<strong>de</strong> "plugin.h"Ahora le daremos un nombre, ¿qué mejor que smiley si eso es lo quees? Es conveniente siempre dar nombres que aseguren al usuario lacomprensión <strong>de</strong> lo que hace el plugin a la vez que son cortos.char name[] == "smiley";Dado que esto es un ejemplo sencillo y no queremos complicarnos lavida, usaremos un único subtipo <strong>de</strong> plugin. Aquí podríamos haber metidotantos como posibles caras queramos tener, pero lo <strong>de</strong>jaremos en sólo uno.Le asignaremos el nombre smiley ya que no v a haber más tipos.#<strong>de</strong>fine NR_TYPES 1char stnames [NR_TYPES][16] = {"smiley"};Ahora <strong>de</strong>finimos los parámetros que queremos que sean modificablespor el usuario, así como su presentación en la interfaz <strong>de</strong> Blen<strong>de</strong>r. Ennuestro caso sólo queremos que pueda jugar con dos <strong>de</strong> ellos: el radio <strong>de</strong>lsmiley y la boca. Usaremos un <strong>de</strong>slizador (“sli<strong>de</strong>r” en inglés) para variaresos tipos. Se me ocurre que también podríamos haber usado uninterruptor (“toggle”) para la boca, pero con un <strong>de</strong>slizador po<strong>de</strong>mos dar unmayor rango <strong>de</strong> valores.Para el radio elegimos un valor <strong>de</strong> 0 a 1, con 0 no habrá cara, mientras quecon 1 ésta ocupará todo. Para la boca pondremos valores más pequeños, yaque los usaremos a modo <strong>de</strong> tanto por ciento e incluímos valores negativosy positivos para que e<strong>xi</strong>sta tanto una cara sonriente como una cara triste.


Extendiendo Blen<strong>de</strong>r: Programando plugins <strong>de</strong> Texturas [ 247 ]VarStruct varstr[] = {NUMSLI|FLO, "radio", 1.0, 0.0, 1.0, "radio <strong>de</strong> la cara",NUMSLI|FLI, "boca", 0.25, -0.25, 0.25,"altura <strong>de</strong>l centro <strong>de</strong> la boca"};Ahora hay que <strong>de</strong>cirle a Blen<strong>de</strong>r con qué variables se correspon<strong>de</strong>ránen nuestro código. Aprovecho para recordar que <strong>de</strong>beremos pasárselas enel mismo or<strong>de</strong>n que en la <strong>de</strong>finición <strong>de</strong> la interfaz par que blen<strong>de</strong>r no se lie.type<strong>de</strong>f struct Cast{float rCara;float aboca;} Cast;Las dos variables siguientes las <strong>de</strong>finimos para la compatibilidad con elsistema <strong>de</strong> plugins <strong>de</strong> Blen<strong>de</strong>r. En result es don<strong>de</strong> se almacenarán losdatos a <strong>de</strong>volver. Nosotros sólo usaremos los <strong>de</strong> intensidad y color, peroaun así hay que usar un array <strong>de</strong> 8 elementos. cfra lo <strong>de</strong>finimos pero no lousaremos (es <strong>de</strong>cir se quedará con valor 0).float result[8];float cfra;La siguiente parte es la parte que no vamos a tocas para nada. Ya queno nos sirve <strong>de</strong> mucho.int plugin_tex_doit (int, Cast*, float*, float*, float*);int plugin_tex_getversion (void){return B_PLUGIN_VERSION;}void plugin_but_changed(int but){}Ahora toca rellenar la función <strong>de</strong> inicialización <strong>de</strong>l plugin. Comonuestra cara no necesita tener ningún valor inicializado, <strong>de</strong>jaremos lafunción en blanco.void plugin_init(void){}


[ 248 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLa siguiente función es bastante importante, ya que indica a Blen<strong>de</strong>r lamanera <strong>de</strong> comunicarse. Si bien hemos usado los nombres que venían por<strong>de</strong>fecto en la estructura, aquí es don<strong>de</strong> habría que <strong>de</strong>cirle si hemos usadootros nombres en vez <strong>de</strong> esos. Personalmente recomiendo seguir usandoestos nombres, ya que así se hace más legilble para futuros <strong>de</strong>sarrolladoresformando una especie <strong>de</strong> estándar consensuado.void plugin_getinfo(PluginInfo *info){info->name=name;info->stypes= NR_TYPES;info->nvars= sizeof(varstr)/sizeof(VarStruct);info->snames= stnames[0];info->result= result;info->cfra= &cfra;info->varstr=varstr;info->init= plugin_init;info->tex_doit= (TexDoit) plugin_tex_doit;info->callback = plugin_but_changed;}El siguiente trozo <strong>de</strong> código es el corazón y cerebro <strong>de</strong> nuestro plugin.Es el que hará todos los cálculos y llamará a las funciones necesarias. He <strong>de</strong>comentar que tiene un grave problema <strong>de</strong> diseño, para aquellos que yahayan <strong>de</strong>sarrollado más cosas con anterioridad verán que este pseudomainno es modular, sino que realiza él solito y por sí mismo todos loscálculos. Cuan hubiera estado mejor separar el código en trozos máspequeños, invitando <strong>de</strong> esta manera a futuros <strong>de</strong>sarrolladores a hacerpequeñas modificaciones y hacerles la vida más cómoda posible. Perocomo esto no es un plugin pensado para su uso he preferido omitir el usaralgunas funciones típicas <strong>de</strong> los lenguajes <strong>de</strong> shading así como el dividir laestructura en trozos. Otra <strong>de</strong> las razones por las que recomendaría usar laestructura en trozos es para po<strong>de</strong>r utilizar el “antialiasing” <strong>de</strong> formacómoda. De todas formas iremos analizándola poco a poco par que que<strong>de</strong>todo claro.Primero usaremos la <strong>de</strong>finición anterior <strong>de</strong>l “main” <strong>de</strong>l plugin y <strong>de</strong>finiremoslas variables que vayamos a usar así como su inicialización en caso <strong>de</strong>ser necesaria.int plugin_tex_doit(int stype, Cast *cast, float *texvec, float*dxt, float *dyt)float cox, coy, cara, boca, rboca;cara=cast->rCara;boca=cast->aboca;result[0]=1.0;//precolocamos la intensidadresult[4]=1.0;//evitamos transparenciascox=texvec[0];coy=texvec[1];


Extendiendo Blen<strong>de</strong>r: Programando plugins <strong>de</strong> Texturas [ 249 ]Usando la fórmula básica <strong>de</strong>l círculo comprobamos si el texel a tratar está<strong>de</strong>ntro o fuera.if ((pow(cox,2) + pow(coy,2))=0.0) /* mitad superior */Movemos la altura <strong>de</strong>l pixel a un supuesto centro a la altura <strong>de</strong> los ojos.coy=texvec[1]-(0.5*cara);Ahora miramos en el lado al que está y modificamos la posición parahacerla relativa al centro <strong>de</strong>l ojo en la coor<strong>de</strong>nada X según corresponda.if (texvec[0]


[ 250 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3Delse /*mitad inferior*/{if ((texvec[0] >= -0.5*cara) && (texvec[0] = -0.5*cara) && (boca >=0)) ||((texvec[1]


Extendiendo Blen<strong>de</strong>r: Programando plugins <strong>de</strong> Texturas [ 251 ]Como se pue<strong>de</strong> apreciar, este plugin es únicamente para un primercontacto con la interfaz <strong>de</strong> plugins, podría ser mejorable <strong>de</strong> muy diversasformas:●●●●●●Permitir la personalización <strong>de</strong> los colores o incluso admitirmezclas.Utilizar splines para la <strong>de</strong>finición <strong>de</strong> la boca permitiendo así unamayor variedad <strong>de</strong> formas <strong>de</strong> la boca.Antialiasing.Soporte <strong>de</strong> canales nor o displacement maps.Utilización <strong>de</strong> otras primitivas para la <strong>de</strong>finición <strong>de</strong> los elementos.Otros...Notas y más informaciónCosas a tener en cuenta:1. Las coor<strong>de</strong>nadas UVW usan un rango <strong>de</strong> coor<strong>de</strong>nadas "[-1,1]".2. Es preferible estar abriendo y cerrando Blen<strong>de</strong>r, ya que si no,pue<strong>de</strong> no cargar bien.3. Conviene tener un .blend con el plugin cargado. De esta forma seagiliza la visualización <strong>de</strong> los resultados si se está abriendo ycerrarndo Blen<strong>de</strong>r.4. Al asignar un color no <strong>de</strong>bemos olvidarnos <strong>de</strong>l canal alfa, ya queen C las variables se inicializan a 0 y por tanto no veríamos másque el color base <strong>de</strong>l material <strong>de</strong>l objeto.La compilación <strong>de</strong> plugins en Windows, se hace <strong>de</strong> manera distinta, yaque la herramienta bmake se basa en el gcc <strong>de</strong> linux (el cual no estádisponible en windows). En cambio los comandos a ejecutar serán, auncuando no es seguro que funcionen al "100%".cd c:\blen<strong>de</strong>r\plugins\texture\sinuslcc -lc:\blen<strong>de</strong>r\plugins\inclu<strong>de</strong> sinus.clcclnk -DLL sinus.obj c:\blen<strong>de</strong>r\plugins\inclu<strong>de</strong>\tex.<strong>de</strong>fimplib sinus.dllAlgunos <strong>de</strong> los sitios <strong>de</strong> don<strong>de</strong> he sacado información y ejemplos <strong>de</strong>plugins:●●http://download.blen<strong>de</strong>r.org/documentation/htmlI/c11605.htmlpagina <strong>de</strong> la documentación oficial <strong>de</strong> Blen<strong>de</strong>r.http://www.cs.umn.edu/~mein/blen<strong>de</strong>r/plugins pagina con ejemplosy documentación <strong>de</strong> plugins.


[ 252 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEl código <strong>de</strong>l plugin completo1 #inclu<strong>de</strong> 2 #inclu<strong>de</strong> "plugin.h"34 char name [] = "smiley";56 #<strong>de</strong>fine NR_TYPES 178 char stnames [NR_TYPES][16] = {"smiley"};910 VarStruct varstr[]={11 NUMSLI|FLO, "radio", 1.0, 0.0, 1.0, "radio <strong>de</strong> la cara",12 NUMSLI|FLO, "boca", 0.25, -0.25, 0.25, "altura <strong>de</strong>l centro<strong>de</strong> la boca"};1314 type<strong>de</strong>f struct Cast15 {16 float rCara;17 float aboca;18 } Cast;1920 float result[8];21 float cfra;2223 /***********Parte fija *********/24 int plugin_tex_doit (int, Cast*, float*, float*, float*);25 int plugin_tex_getversion (void)26 {27 return B_PLUGIN_VERSION;28 }2930 void plugin_but_changed(int but)31 {32 }3334 void plugin_init(void)35 {36 }3738 void plugin_getinfo(PluginInfo *info)39 {40 info->name=name;41 info->stypes= NR_TYPES;42 info->nvars= sizeof(varstr)/sizeof(VarStruct);43 info->snames= stnames[0];44 info->result= result;45 info->cfra= &cfra;46 info->varstr=varstr;47 info->init= plugin_init;48 info->tex_doit= (TexDoit) plugin_tex_doit;49 info->callback = plugin_but_changed;50 }


Extendiendo Blen<strong>de</strong>r: Programando plugins <strong>de</strong> Texturas [ 253 ]51 /***********Fin parte fija *********/5253 int plugin_tex_doit(int stype, Cast *cast, float *texvec,float *dxt, float *dyt)54 {55 float cox, coy, cara, boca, rboca;5657 cara=cast->rCara;58 boca=cast->aboca;59 result[0]=1.0; //precolocamos la intensidad60 result[4]=1.0; //evitamos transparencias61 cox=texvec[0];62 coy=texvec[1];6364 if ((pow(cox,2) + pow(coy,2))=0.0) /*mitad superior*/ {67 coy=texvec[1] - (0.5*cara);68 if (texvec[0] = -0.5*cara) && (texvec[0]= -0.5*cara) && (boca >=0)) ||86 ((texvec[1]


[ 254 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D101 else {102 result[1]=1.0;103 result[2]=1.0;104 result[3]=0.0;105 }106 }107 }108 else {109 result[4]=0.0;/*alfa al minimo*/110 result[1]=0.0;111 result[2]=0.5;112 result[3]=0.0;113 }114 return 1;115 }


Rediseño <strong>de</strong> Yafray: Parte 1. La luzAlejandro Conty Estévezaconty@gmail.com ::La luz en yafray se <strong>de</strong>scompone en una serie <strong>de</strong> elementosen la escena llamados luces. La afirmación parece trivial,pero la singularidad resi<strong>de</strong> en que no todos estos objetosse correspon<strong>de</strong>n con lo que intuitivamente llamaríamos luz.Estado actualAntes <strong>de</strong> entrar en <strong>de</strong>talles, veamos el diseño <strong>de</strong> estos elementos. Cada luzen yafray consiste en un objeto abstracto capaz <strong>de</strong> iluminar un punto <strong>de</strong> laescena. Por ello, <strong>de</strong>finimos un método virtual llamado illuminate que tomacomo argumento un punto <strong>de</strong> una superficie y <strong>de</strong>vuelve el color reflejadoen una dirección concreta.Para <strong>de</strong>volver el color reflejado, es necesario que la luz llame al sha<strong>de</strong>r(material) asignado a esa superficie. Éste es uno <strong>de</strong> los puntos confusos <strong>de</strong>ldiseño sobre el que la gente a menudo pregunta. Parece poco intuitivo quela llamada a los sha<strong>de</strong>rs se <strong>de</strong>legue en las luces, por lo que volveremossobre este punto más a<strong>de</strong>lante. Por lo <strong>de</strong>más, con este interfaz, la lógica <strong>de</strong>lcómputo <strong>de</strong> iluminación queda oculta tras esos objetos.Desarrollo[ 255 ]


[ 256 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DDe esta forma podíamos separar el núcleo <strong>de</strong>l ren<strong>de</strong>r <strong>de</strong>l cálculo <strong>de</strong> lailuminación. Definíamos la implementación <strong>de</strong> los distintos tipos <strong>de</strong> lucesen ficheros separados sin que hubiera más <strong>de</strong>pen<strong>de</strong>ncia que el citadointerfaz. En una fase posterior <strong>de</strong>l <strong>de</strong>sarrollo, estos tipos <strong>de</strong> luces fueronseparados aún más lejos con un sistema <strong>de</strong> plugins. Al ser tipos abstractos,sólo había que preocuparse <strong>de</strong> la creación <strong>de</strong> las instancias. A partir <strong>de</strong> esepunto, el objeto se manejaba <strong>de</strong> forma anónima y transparente.Para la gestión <strong>de</strong> la creación <strong>de</strong> objetos se usaron factorías abstractas (verpatrón factory). El entorno <strong>de</strong> la escena disponía <strong>de</strong> una tabla <strong>de</strong> funciones<strong>de</strong> construcción in<strong>de</strong>xadas por el tipo <strong>de</strong>l objeto. No sólo para las luces,también para los sha<strong>de</strong>rs y fondos <strong>de</strong> escena. Éstas funciones factoría sediseñaron con un prototipo como el siguiente:1 light_t * light_factory_t(paramMap_t &params,ren<strong>de</strong>rEnvironment_t &env);Don<strong>de</strong> el parámetro “params” guardaba toda la configuración <strong>de</strong>lobjeto a crear. Todas estas factorías se in<strong>de</strong>xaron en una tabla por nombre<strong>de</strong>finida <strong>de</strong> la siguiente manera:2 std::map light_factories;


Rendiseño <strong>de</strong> Yafray: Parte 1. La luz. [ 257 ]De la misma forma se hizo para las texturas, sha<strong>de</strong>rs, etc ... Cuando unplugin se carga, se llama a una función pre<strong>de</strong>finida que éste ha <strong>de</strong> contenery que se encarga <strong>de</strong> registrar las factorías necesarias para todo lo que éstecontiene. Veamos un ejemplo <strong>de</strong> código <strong>de</strong>l plugin con los sha<strong>de</strong>rs básicos:3 void registerPlugin(ren<strong>de</strong>rEnvironment_t &ren<strong>de</strong>r)4 {5 ren<strong>de</strong>r.registerFactory("generic",genericSha<strong>de</strong>r_t::factory);6 ren<strong>de</strong>r.registerFactory("constant",constantSha<strong>de</strong>r_t::factory);7 std::cout


[ 258 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DComo se indica en el gráfico, un supuesto módulo <strong>de</strong> subsurface scatteringintroduciría aún más <strong>de</strong>pen<strong>de</strong>ncias. La única forma <strong>de</strong> evitarlo seríameterlo directamente <strong>de</strong>ntro <strong>de</strong> la iluminación global, haciendo crecer lapathLight aún más. Ninguna <strong>de</strong> las dos opciones es muy recomendable.Valoración <strong>de</strong>l estado actualAnte esta situación se pue<strong>de</strong>n hacer las siguientes observaciones:●Los plugins pier<strong>de</strong>n sentido en el momento que aparecen<strong>de</strong>pen<strong>de</strong>ncias camufladas y colisiones.●El interfaz limitado con los plugins nos para <strong>de</strong> mejorar ciertosalgoritmos y <strong>de</strong> añadir nuevas características.El primer error viene <strong>de</strong> mezclar los conceptos <strong>de</strong> “fuente <strong>de</strong> luz” y“método <strong>de</strong> iluminación”. Las fuentes <strong>de</strong> luz son posiciones, superficies ovolúmenes que emiten energía. ¿Qué se espera <strong>de</strong> ellas? Teniendo encuenta los algoritmos usados en yafray, lo que se necesita <strong>de</strong> una fuente <strong>de</strong>luz se pue<strong>de</strong> resumir en:●●Muestrear la fuente <strong>de</strong>s<strong>de</strong> un punto cualquiera.Muestrear la fuente en cualquier punto <strong>de</strong> ésta y en cualquierdirección.


Rendiseño <strong>de</strong> Yafray: Parte 1. La luz. [ 259 ]La primera <strong>de</strong> las funciones está pensada para el raytracing <strong>de</strong>s<strong>de</strong> el punto<strong>de</strong> vista hacia las fuentes <strong>de</strong> luz, también conocido como raytracingestándar. En este proceso, para calcular la energía que llega a un punto seusan técnicas <strong>de</strong> montecarlo en las que se muestrea la fuente <strong>de</strong> luz paracada punto visible <strong>de</strong>s<strong>de</strong> la cámara. Las luces puntuales son un casoparticular <strong>de</strong> superficie nula en las que sólo una muestra es necesaria. Engeneral, asumimos que todas las fuentes <strong>de</strong> luz son muestreables.El segundo requisito es para po<strong>de</strong>r llevar a cabo el photon mapping.Cuando hacemos esto recorremos el camino inverso, <strong>de</strong>s<strong>de</strong> las luces haciala escena. Por eso necesitamos una forma <strong>de</strong> obtener direcciones <strong>de</strong>disparo <strong>de</strong> fotones.Interacción luz-sha<strong>de</strong>rAl principio <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong> yafray se partía <strong>de</strong>l principio <strong>de</strong> que unafuente no puntual se muestreaba en diferentes direcciones y se llamaba alsha<strong>de</strong>r por cada una <strong>de</strong> ellas. Esto se <strong>de</strong>be a que originalmente, elresultado <strong>de</strong>l sha<strong>de</strong>r <strong>de</strong>pen<strong>de</strong> no sólo <strong>de</strong> la energía que llega sino también<strong>de</strong> la dirección.Uno <strong>de</strong> los típicos efectos que se consiguen con este sistema son las“specular highlights”. Un “fake” <strong>de</strong> una refle<strong>xi</strong>ón borrosa <strong>de</strong> una luzpuntual. Sin embargo, actualmente en yafray este método no se usasiempre. Por ejemplo en la iluminación global, don<strong>de</strong> el entorno semuestrea en la semiesfera tangente a la superficie. En lugar <strong>de</strong> llamar alsha<strong>de</strong>r para cada muestra, se calcula la energía total por separado y luegose llama al sha<strong>de</strong>r. Esto evita hacer tantas llamadas, y el resultado es losuficientemente bueno como para que nadie se haya quejado aún.Lo interesante es que si seguimos este principio <strong>de</strong> calcular la energía porseparado y luego llamar al sha<strong>de</strong>r sin dirección alguna, el diseño sesimplifica. Quitamos libertad al sha<strong>de</strong>r para hacer ciertos efectos. Perodado que las refle<strong>xi</strong>ones se calculan en yafray por separado, el único efectocomúnmente usado que per<strong>de</strong>mos es el <strong>de</strong> los brillos especulares <strong>de</strong> lucespuntuales. No hay manera <strong>de</strong> simular este efecto por ninguna otra vía, asíque trataremos <strong>de</strong> poner algún añadido al diseño para conservarlas.


[ 260 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DPropuesta <strong>de</strong> diseño para fuentes <strong>de</strong> luzSiguiendo la directiva anteriormente <strong>de</strong>scrita <strong>de</strong> calcular la energía porseparado y asumir que el sha<strong>de</strong>r no tendrá la libertad <strong>de</strong> hacer ningún otrotipo <strong>de</strong> cálculo experimental, el interfaz <strong>de</strong> una fuente <strong>de</strong> luz se reduce acalcular la energía que llega a un <strong>de</strong>terminado punto.Con esto nos ahorramos el hacer un sistema <strong>de</strong> muestreo <strong>de</strong> fuentes <strong>de</strong> luz.Aún nos queda otro, el <strong>de</strong>l mapeo <strong>de</strong> fotones, <strong>de</strong>l que no podremos<strong>de</strong>shacernos. Pero ahora en vez <strong>de</strong> lanzar rayos en el núcleo en dirección alas fuentes, <strong>de</strong>jamos que sea la misma fuente la que haga el cálculo quetenga que hacer.Para el caso <strong>de</strong> luces puntuales para las que pueda ser interesante uncálculo <strong>de</strong> luz especular, pondremos un método adicional que nos permitaconservar dicha característica.El primer método proporciona la manera estándar <strong>de</strong> calcular la cantidad<strong>de</strong> luz que llega a una superficie. Los parámetros son:●●●●P: El punto en cuestión.N: La normal al plano tangente al punto.NU y NV: Los dos vectores ortogonales que <strong>de</strong>finen el planotangente.scene: La escena.El segundo <strong>de</strong> los métodos es un método Ad--hoc para las luces puntualesque puedan provocar reflejos especulares <strong>de</strong> ellas mismas. En el caso <strong>de</strong>luces no puntuales, la manera correcta <strong>de</strong> calcularlo es con una refle<strong>xi</strong>ónborrosa que se verá en una fase posterior <strong>de</strong> diseño.


Rendiseño <strong>de</strong> Yafray: Parte 1. La luz. [ 261 ]Evi<strong>de</strong>ntemente, esta <strong>de</strong>cisión <strong>de</strong> diseño que limita la libertad <strong>de</strong> un sha<strong>de</strong>rtiene un propósito. El método “incomingEnergy” encapsula toda la técnicamontecarlo, y po<strong>de</strong>mos aplicar ahí sin que afecte al resto una técnica <strong>de</strong>aceleración vía hardware gráfico. A continuación veremos cuales son lasi<strong>de</strong>as <strong>de</strong>trás <strong>de</strong> este concepto.Iluminación montecarlo vía GPUE<strong>xi</strong>sten varias formas en las que po<strong>de</strong>mos aprovechar el hardware gráficopara acelerar el ren<strong>de</strong>r. Recor<strong>de</strong>mos que hay una fase <strong>de</strong> “final gather” enla que para cada punto <strong>de</strong> la escena visible disparamos rayos en lasemiesfera tangente. Hacemos esto para simular una integral <strong>de</strong> toda la luzque llega a ese punto. Al fin y al cabo no <strong>de</strong>ja <strong>de</strong> ser un ren<strong>de</strong>r estocástico<strong>de</strong>l entorno <strong>de</strong>l punto que vamos a sombrear.El propósito <strong>de</strong> este proceso es el <strong>de</strong> sumar toda la luz entrante. No es porlo tanto necesario que la calidad <strong>de</strong> ese ren<strong>de</strong>r local sea muy alta. Enrealidad lo único importante es que el promedio <strong>de</strong> energía vista seapro<strong>xi</strong>me a la real. Como es <strong>de</strong> esperar, para hacer un buen promedio esnecesario lanzar bastantes rayos ralentizando el ren<strong>de</strong>r.Ahora supongamos que disponemos <strong>de</strong> una forma <strong>de</strong> ren<strong>de</strong>rizar unaapro<strong>xi</strong>mación <strong>de</strong> la escena usando openGL por ejemplo. Se entien<strong>de</strong> queesta apro<strong>xi</strong>mación usa la iluminación <strong>de</strong>l mapa <strong>de</strong> fotones mediante algúntruco como texturas o colores en los vértices. Si disponemos <strong>de</strong> estacaracterística, en lugar <strong>de</strong> lanzar todos esos rayos en la semiesferatangente, po<strong>de</strong>mos simplemente hacer un ren<strong>de</strong>r a baja resolución usandoopenGL.La i<strong>de</strong>a es ren<strong>de</strong>rizar con un ángulo muy abierto que apro<strong>xi</strong>me lavisibilidad <strong>de</strong> la semiesfera. Supongamos que hacemos un ren<strong>de</strong>r <strong>de</strong>100x100 pixels y luego hacemos la suma pon<strong>de</strong>rada <strong>de</strong> esos pixels. Sería loequivalente a tomar 10000 muestras por montecarlo estándar. Sólo que elhardware lo haría muchísimo más rápido. Teniendo en cuenta que elmá<strong>xi</strong>mo razonable <strong>de</strong> muestras en yafray viene a ser unas 2000 ya que apartir <strong>de</strong> ahí empieza a ser excesivamente lento, el po<strong>de</strong>r tomar 10000muestras <strong>de</strong> golpe es sin duda un empujón bastante gran<strong>de</strong>.A<strong>de</strong>más, no sólo este proceso pue<strong>de</strong> beneficiarse <strong>de</strong>l hardware, también elren<strong>de</strong>r <strong>de</strong> refle<strong>xi</strong>ones borrosas, luces <strong>de</strong> área y cualquier otra cosa quepueda funcionar con una apro<strong>xi</strong>mación <strong>de</strong> la escena. En estos casosparticulares lo que se hará es ren<strong>de</strong>rizar con un cono pequeño en lugar <strong>de</strong>usar uno <strong>de</strong> 180 grados.


[ 262 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DComo se ve en el diagrama, siempre po<strong>de</strong>mos tener ambas alternativaspresentes. El ren<strong>de</strong>r apro<strong>xi</strong>mado por hardware o el <strong>de</strong> calidad. Po<strong>de</strong>moselegir uno u otro a voluntad según los requisitos <strong>de</strong> calidad.Tareas a completarPara po<strong>de</strong>r llegar a esto es necesario resolver los siguientes problemas:●●Recorrer el árbol BSP con un cono en lugar <strong>de</strong> un rayo.Po<strong>de</strong>r ren<strong>de</strong>rizar en openGL con un cono <strong>de</strong> 180 grados sabiendoque ángulo correspon<strong>de</strong> a cada pixel <strong>de</strong>l resultado.● Po<strong>de</strong>r ren<strong>de</strong>rizar triángulos con la información <strong>de</strong> color <strong>de</strong>l mapa<strong>de</strong> fotones.El último problema po<strong>de</strong>mos aplazarlo ya que po<strong>de</strong>mos avanzar dandopasos previos con sistemas <strong>de</strong> iluminación menos ambiciosos como hace la“hemiLight”.Para evitar volcar todos los triángulos <strong>de</strong> la escena en cada uno <strong>de</strong> esosren<strong>de</strong>rs locales, vendría bien po<strong>de</strong>r escoger aquellos que caigan <strong>de</strong>ntro <strong>de</strong>lcono en el que vamos a ren<strong>de</strong>rizar. Hasta ahora cuando trazábamos unrayo, recorríamos los triángulos <strong>de</strong> la escena usando el árbol binario BSP.Eso evita tener que comprobarlos todos. Ahora queremos hacer lo mismopero usando un cono en lugar <strong>de</strong> un rayo.


Rendiseño <strong>de</strong> Yafray: Parte 1. La luz. [ 263 ]Afortunadamente este algoritmo es bastante sencillo y se pue<strong>de</strong> alcanzarcon algunas modificaciones sobre el algoritmo original para rayos.Añadiendo este método extra <strong>de</strong> recorrido al árbol ya tenemos una formasencilla <strong>de</strong> esquivar los triángulos que no nos interesan.En cuanto al segundo problema es sólo una cuestión <strong>de</strong> estudiar laproyección usada en openGL o el sistema que vayamos a usar. Para separarla interacción con el API <strong>de</strong> openGL, crearemos una clase <strong>de</strong> driver gráfico.En lugar <strong>de</strong> usar openGL directamente para el ren<strong>de</strong>rizado, lo haremos através <strong>de</strong> este interfaz. En la siguiente sección veremos como podría ser.Driver GPULa funcionalidad que esperamos <strong>de</strong>l hardware gráfico no es mucha.Simplemente querremos dibujar triángulos con un color o texturaopcionalmente. El ren<strong>de</strong>r se hará siempre sobre un buffer arbitrario.Veamos el interfaz propuesto:


[ 264 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DLa primera función, “ren<strong>de</strong>rCone” se llamará al principio <strong>de</strong>l ren<strong>de</strong>r localpara elegir el cono <strong>de</strong> visión y el buffer don<strong>de</strong> se pondrá el resultado.Despúes se podrán usar el resto <strong>de</strong> funciones para pintar triángulos con uncolor plano o con una textura. Para las texturas, será responsabilidad <strong>de</strong>ldriver el mantener una tabla <strong>de</strong> correspon<strong>de</strong>ncias entre las texturas que elllamante está usando y las que vaya creando en el espacio <strong>de</strong>l hardwaregráfico.Como vemos, se <strong>de</strong>fine un interfaz genérico <strong>de</strong> ren<strong>de</strong>r simple <strong>de</strong>l que luego<strong>de</strong>rivamos a la implementación específica <strong>de</strong> openGL. Seguramente nousaremos otra cosa para ren<strong>de</strong>rizar vía hardware, pero <strong>de</strong> esta formacentralizamos el uso <strong>de</strong>l API y <strong>de</strong>scontaminamos el resto <strong>de</strong>l código.E<strong>xi</strong>ste un problema adicional en el uso <strong>de</strong>l hardware. Yafray contempla laposibilidad <strong>de</strong> ren<strong>de</strong>rizar con hilos en varias CPU's. Hay que evitar quevarios hilos accedan al hardware <strong>de</strong> manera concurrente. AfortunadamenteopenGL trabaja con contextos que se pue<strong>de</strong>n intercambiar.


Rendiseño <strong>de</strong> Yafray: Parte 1. La luz. [ 265 ]En yafray, cada hilo <strong>de</strong> ren<strong>de</strong>rizado posee un contexto que nada tiene quever con el <strong>de</strong> openGL. En este contexto se guarda información <strong>de</strong> interésque es específica <strong>de</strong> cada hilo, como:●●●Último objeto intersecado.Profundidad <strong>de</strong> ren<strong>de</strong>r.Contribución actual al pixel que se está ren<strong>de</strong>rizando.● etc ...Lo mejor que po<strong>de</strong>mos hacer es introducir un driver GPU en cada uno <strong>de</strong>estos contextos. De esta forma no se pisarán unos hilos a otros. Suponemosque el mismo driver se ocupa <strong>de</strong> crear su propio contexto openGL.¿Por dón<strong>de</strong> empezar?Antes <strong>de</strong> meternos directamente con la iluminación global total porhardware, conviene abordar problemas relajados relacionados con lamisma. Si conseguimos hacer que funcione para los siguientes casos yatenemos una gran parte <strong>de</strong>l problema resuelta.GPU hemilightVeamos como podríamos calcular la iluminación que llega <strong>de</strong>s<strong>de</strong> elfondo <strong>de</strong> la escena usando la GPU. El método <strong>de</strong> funcionamiento <strong>de</strong> lahemilight consiste en disparar rayos en una semiesfera tangente al punto<strong>de</strong> intersección. Si estos rayos golpean algún objeto se asume que son rayos<strong>de</strong> sombra y su contribución es nula. De otra forma alcanzan el fondo y loscontamos como una contribución <strong>de</strong> luz positiva. Usamos el color <strong>de</strong>l cielocomo valor <strong>de</strong> contribución. Ya que estos son los primeros pasos,asumiremos que el color <strong>de</strong>l cielo es constante. Más a<strong>de</strong>lante se pue<strong>de</strong>contemplar como hacer que podamos tener una textura <strong>de</strong> cielo o inclusoun mapa HDR.Para que una escena <strong>de</strong> cielo abierto tenga una acabado <strong>de</strong> calidadaceptable es necesario lanzar un número <strong>de</strong> muestras alre<strong>de</strong>dor <strong>de</strong> 200. Sibajamos este número empieza a aparecer ruido en torno a las sombras.Evi<strong>de</strong>ntemente este método es costoso. Lo que se propone aquí es evitarese proceso <strong>de</strong> lanzar 200 rayos. Para ello po<strong>de</strong>mos intentar ren<strong>de</strong>rizaruna apro<strong>xi</strong>mación <strong>de</strong>l cielo visible <strong>de</strong>s<strong>de</strong> dicho punto con la GPU. Dadoque la contribución <strong>de</strong> los objetos a la luz es completamente nula, elproceso es sencillo. Veamos el siguiente pseudocódigo:


[ 266 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D9 // P -> punto <strong>de</strong> interseccion10 // N -> normal a dicho punto1112 gpudriver->ren<strong>de</strong>rCone(cone_t(P,N,180),buffer);13 gpudriver->clear(background_color);1415 for each object in cone_t(P,N,180):16 {17 for each object face in cone_t(N,180):18 gpudriver->putTriangle(face.a, face.b, face.c,color_t(0));19 }2021 gpudriver->flush();22 color_t light=0;23 for each pixel in buffer:24 {25 contri=cos(angle(pixel,N));26 light+=contri*pixel;27 }2829 return light/buffer.numPixels;Como se ve, lo que hacemos es primer rellenar el buffer con el color <strong>de</strong>lfondo. Acto seguido, lo que hacemos es pintar todos los triángulos <strong>de</strong> laescena <strong>de</strong> color negro. El resultado es un buffer en el que tenemos el cieloque pue<strong>de</strong> verse <strong>de</strong>s<strong>de</strong> ese punto. Si hacemos una media <strong>de</strong> todos lospixels, tenemos una apro<strong>xi</strong>mación <strong>de</strong> la luz que llega <strong>de</strong>s<strong>de</strong> el cielo.El problema <strong>de</strong> este método es que apro<strong>xi</strong>madamente más <strong>de</strong> la mitad <strong>de</strong>las caras presentes en la escena tienen que volcarse para hacer el ren<strong>de</strong>r.Cuando el número <strong>de</strong> caras en la escena es mucho mayor que el número <strong>de</strong>rayos necesarios para conseguir un resultado libre <strong>de</strong> ruido, es <strong>de</strong> esperarque la tarjeta gráfica lo haga más rápido que un método <strong>de</strong> raytracing. Elproblema está en lo que pasa cuando el número <strong>de</strong> caras es muy elevado.En ese caso habría que experimentar que es más rápido:1. Lanzar 400 rayos contra 300000 caras.2. Hacer un ren<strong>de</strong>r <strong>de</strong> 20x20 <strong>de</strong> 300000 caras.Es <strong>de</strong> esperar que 1 sea más rápido, sobre todo si <strong>de</strong>jamos crecer elnúmero <strong>de</strong> triángulos <strong>de</strong> manera <strong>de</strong>scontrolada. Pero habría quecomprobar don<strong>de</strong> está el límite. También cabría estudiar si se podríatrabajar con versiones <strong>de</strong>cimadas <strong>de</strong> la escena. En resumen, el ren<strong>de</strong>r <strong>de</strong>escenas con esta iluminación en la GPU es algo a experimentar.


Rendiseño <strong>de</strong> Yafray: Parte 1. La luz. [ 267 ]GPU spherelightCuando la fuente <strong>de</strong> luz <strong>de</strong>ja <strong>de</strong> ser algo tan gran<strong>de</strong> como un cielo, lasexpectativas en cuando a usar la GPU mejoran. Si nuestra fuente <strong>de</strong> luz esuna esfera <strong>de</strong> pequeño tamaño como podría ser una lámpara o unabombilla gran<strong>de</strong>, el cono a ren<strong>de</strong>rizar disminuye.Ya no es necesario volcar la mitad <strong>de</strong> los triángulos <strong>de</strong> la escena. Sóloaquellos que estén <strong>de</strong>ntro <strong>de</strong>l cono que une el punto a sombrear con laesfera que actúa <strong>de</strong> fuente <strong>de</strong> luz. En un punto alejado <strong>de</strong> ésta, el número<strong>de</strong> triángulos implicados es <strong>de</strong> esperar que se apro<strong>xi</strong>me al número <strong>de</strong>muestras que queremos tomar o incluso que sea inferior.Aquí es don<strong>de</strong> realmente nos po<strong>de</strong>mos beneficiar <strong>de</strong>l hardware gráfico. Unren<strong>de</strong>r <strong>de</strong> escasos polígonos sería mucho más rápido que lanzar 100 rayoscontra la escena. En casos como estos podríamos permitirnos el lujo <strong>de</strong>tomar ren<strong>de</strong>rs <strong>de</strong> 100x100, equivalente a 10000 muestras. Veamos uncódigo <strong>de</strong> ejemplo:30 // P -> punto <strong>de</strong> interseccion31 // N -> normal a dicho punto32 // C -> centro <strong>de</strong> la esfera33 // R -> radio <strong>de</strong> la esfera3435 angulo=atan(R/distance(C,P));36 direccion=C-P;37 gpudriver->ren<strong>de</strong>rCone(cone_t(P,direccion,angulo),buffer);38 gpudriver->clear(color_t(0));39 for each face in esfera:40 gpudriver->putTriangle(face.a, face.b, face.c,color_esfera);4142 for each object in cone_t(P,direccion,angulo):43 {44 for each object face in cone_t(P,direccion,angulo):45 gpudriver->putTriangle(face.a, face.b, face.c,color_t(0));46 }4748 gpudriver->flush();49 color_t light=0;50 for each pixel in buffer:51 {52 contri=cos(angle(pixel,N));53 light+=contri*pixel;54 }5556 return 4*light/(buffer.numPixels*M_PI);


[ 268 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEl ren<strong>de</strong>r se hace siempre sobre buffers cuadrados, dado que el elementoemisor ren<strong>de</strong>rizado sobre él es un círculo, quedan puntos en negro que<strong>de</strong>bemos ignorar. El factor 4/π <strong>de</strong>l cómputo final se aplica para compensaresos puntos que en principio estamos contando como sombra cuando no loson. Otra forma más eficiente sería esquivar <strong>de</strong> la suma esos puntos. Se hapuesto así por hacer el código más sencillo.Este mismo método podría usarse para calcular refle<strong>xi</strong>ones borrosas. Estoes comúnmente llamado “conetracing”, y sigue el mismo esquema elmétodo <strong>de</strong> la esfera. La diferencia es que para tal cosa necesitaríamos unaapro<strong>xi</strong>mación <strong>de</strong> la escena que incluya la iluminación, no servirían carasnegras sin más.GPU ambient occlusionÉste es otro método que podría beneficiarse ampliamente <strong>de</strong>l hardwaregráfico. El ambient occlusion es un sistema muy parecido a la hemilight. Ladiferencia es que sólo se tienen en cuenta los triángulos que están a unadistancia menor a un radio pre<strong>de</strong>finido.Es una forma <strong>de</strong> estimar la cantidad <strong>de</strong> luz ambiente que llega a un punto<strong>de</strong> la escena. Dado que ignora todo lo que esté más allá <strong>de</strong> cierto radio. Poreste motivo es aún más falso <strong>de</strong> lo que produce la hemilight. No obstante,este método goza <strong>de</strong> gran popularidad entre los usuarios <strong>de</strong> Blen<strong>de</strong>r. Dadoque el número <strong>de</strong> triángulos a volcar en el ren<strong>de</strong>r está limitado por el radiopre<strong>de</strong>finido, no sobrecargamos el hardware tanto como hacemos con lahemilight.


Rendiseño <strong>de</strong> Yafray: Parte 1. La luz. [ 269 ]El código apro<strong>xi</strong>mado sería parecido al siguiente:57 // P -> punto <strong>de</strong> interseccion58 // N -> normal a dicho punto59 // R -> radio <strong>de</strong> occlusion6061 gpudriver->ren<strong>de</strong>rCone(cone_t(P,N,180),buffer);6263 for each object in esfera(P,R):64 {65 for each object face in esfera(P,R):66 gpudriver->putTriangle(face.a, face.b, face.c,color_t(0));67 }6869 gpudriver->flush();70 float occlusion=;71 for each pixel in buffer:72 {73 occ=<strong>de</strong>pth(pixel)/R;74 if(occ>1) occlusion+=1; else occlusion+=occ;75 }7677 return ambient_color*occlusion/buffer.numPixelsSe calcula la oclusión media en base a las distancias a los objetos que estánen ese radio. El resultado se multiplica por el color <strong>de</strong> la luz ambiente y se<strong>de</strong>vuelve. Nótese que asumimos que el driver gráfico nos pue<strong>de</strong>proporcionar la profundidad <strong>de</strong> cada pixel ren<strong>de</strong>rizado.ConclusiónCon este diseño <strong>de</strong>l interfaz <strong>de</strong> las fuentes <strong>de</strong> la luz po<strong>de</strong>mos implementarel cálculo <strong>de</strong> la energía en un punto <strong>de</strong> manera in<strong>de</strong>pendiente. Esto es loque permite plantearse el usar el hardware gráfico para estimar estasenergías y ahorrar cómputo. Es posible que todo esto sea un esfuerzo envano. Este documento no preten<strong>de</strong> ser más que un compendio <strong>de</strong> i<strong>de</strong>as atener en cuenta para el futuro <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong> yafray.


[ 270 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D


Mo<strong>de</strong>lado 3D basado en BocetosInmaculada Gijón CardósCarlos González Morcilloinmagijon@gmail.com · Carlos.Gonzalez@uclm.es ::La fase <strong>de</strong> mo<strong>de</strong>lado <strong>de</strong> en proyectos 3D es dificil y tediosaen muchos casos, más aún cuando son necesariassuperficies orgánicas. En la mayoría <strong>de</strong> las ocasiones, separte <strong>de</strong> una primitiva y, aplicando transformacionesgeométricas, se obtiene el objeto <strong>de</strong>seado.Este proyecto presenta un prototipo <strong>de</strong> sistema que utiliza los trazosdibujados por el usuario para construir directamente una superficietridimensional implícita. Nuestra apro<strong>xi</strong>mación difiere <strong>de</strong> las propuestasen trabajos previos (como Teddy <strong>de</strong> Takeo Igarashi) en que es un enfoquegeneral y que implementa, con la misma apro<strong>xi</strong>macion, la creacion <strong>de</strong>nuevos objetos y la operacion <strong>de</strong> extrusion (positiva y negativa).IntroducciónLa forma general <strong>de</strong> construir objetos mediante mo<strong>de</strong>lado sólido escomenzar mediante una primitiva y, empleando operadores ytransformaciones, construir un mo<strong>de</strong>lo modificado. En una primeraclasificación, po<strong>de</strong>mos hablar <strong>de</strong> mo<strong>de</strong>lado poligonal y mo<strong>de</strong>lado basadoen superficies curvas.Des<strong>de</strong> principios <strong>de</strong> los 90 se han <strong>de</strong>sarrollado técnicas que permiten laconstrucción <strong>de</strong> mo<strong>de</strong>los orgánicos <strong>de</strong> una forma rápida, como lassuperficies <strong>de</strong> subdivisión que comienzan con una Malla <strong>de</strong> Control que essubdividida recursivamente para obtener un resultado suave <strong>de</strong>nominadoSuperficie Límite.Otra apro<strong>xi</strong>mación es el uso <strong>de</strong> superficies implícitas (con trabajos previosen la construcción <strong>de</strong> una superficie que cubre un esqueleto). Nuestraapro<strong>xi</strong>mación se basa en la silueta dibujada por el usuario. En la figura 1 semuestra el interfaz <strong>de</strong> usuario <strong>de</strong>l prototipo <strong>de</strong>nominado MoSkIS(Mo<strong>de</strong>lling from Sketches Implicit Surfaces). En esta figura se calcula laespina dorsal <strong>de</strong>l mo<strong>de</strong>lo que se emplea para situar las meta-elipses queformarán nuestro mo<strong>de</strong>lo.Desarrollo[ 271 ]


[ 272 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 1. Interfaz <strong>de</strong> usuario <strong>de</strong>l prototipo MoSkIS 3D.Creación <strong>de</strong> un objetoA continuación se hace una <strong>de</strong>scripción <strong>de</strong>l algoritmo que MoSkIS 3D<strong>de</strong>sarrolla para llevar a cabo la generación <strong>de</strong> un objeto 3D a partir <strong>de</strong> untrazo libre realizado por el usuario.Construcción <strong>de</strong> la siluetaEl usuario dibuja un contorno mediante un trazo libre, el cual <strong>de</strong>be sercerrado y no producir intersecciones consigo mismo, ya que en este caso elalgoritmo fallaría.A partir <strong>de</strong> este trazo se genera un polígono plano cerrado mediante lacone<strong>xi</strong>ón <strong>de</strong>l punto <strong>de</strong> comienzo y <strong>de</strong>l punto final <strong>de</strong>l trazo. Se i<strong>de</strong>ntificanlas aristas <strong>de</strong> este polígono mediante el ángulo mínimo que es requeridoentre aristas consecutivas para crear una nueva arista.


Mo<strong>de</strong>lado 3D basado en Bocetos [ 273 ]Figura 2. Izqda: Vértices convexos a triangularizar.Drcha: División <strong>de</strong>l polígono en dos.Este parámetro es <strong>de</strong>cidido por el usuario, al cual se le permite la opción <strong>de</strong>seleccionar el nivel <strong>de</strong> <strong>de</strong>talle con el que se construirá dicho polígono. Amás <strong>de</strong>talle, más vértices y más coste computacional pero más exactitud enel objeto final obtenido.El polígono que es generado a partir <strong>de</strong> este contorno dibujado, servirácomo silueta <strong>de</strong>l objeto 3D obtenido.Obtención <strong>de</strong> la superficieA la hora <strong>de</strong> obtener una superficie (compuesta <strong>de</strong> triángulos) a partir<strong>de</strong>l polígono generado (ver figura 3 drcha) se realizan los siguientes pasos:1. Triangularización básica: se realiza i<strong>de</strong>ntificando sucesivamentelos vértices convexos <strong>de</strong>l polígono, concretamente cuatro, que son sobre losque se tiene la seguridad <strong>de</strong> ser convesos, ya que la figura pue<strong>de</strong> ser tancomplicada, que <strong>de</strong> lugar a errores fácilmente en esta i<strong>de</strong>ntificación. Losvértices convexos <strong>de</strong> un polígono con toda seguridad, son los situados enlos extremos, tanto <strong>de</strong>l eje X, como <strong>de</strong>l eje Y, es <strong>de</strong>cir, el vértice superior, elvértice inferior, el vértice situado más a la <strong>de</strong>recha y el vértice situado mása la izquierda. Para cada uno <strong>de</strong> estos vértices se evalúa si es posible eltrazado <strong>de</strong> la arista interna que va a formar un triángulo con las dos aristasque comparten el vértice <strong>de</strong>tectado, y si es posible la construcción <strong>de</strong> dichotriángulo, ese vértice es eliminado <strong>de</strong>l proceso <strong>de</strong> triangularización juntocon las dos aristas que comparte, al estar ya triangularizada esa zona, conlo cual, el problema se va reduciendo.Para que se lleve a cabo la construcción <strong>de</strong>l triángulo, la arista interna aconstruir no pue<strong>de</strong> cortar a ninguna otra arista <strong>de</strong>l polígono (ver figura 2Izqda.), es <strong>de</strong>cir, no pue<strong>de</strong> e<strong>xi</strong>stir ningún vértice <strong>de</strong>l polígono <strong>de</strong>ntro <strong>de</strong>lárea <strong>de</strong>l triángulo a construir ya que en ese caso la la triangularizaciónsería errónea.


[ 274 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 3. Izqda: Flip <strong>de</strong> arista ilegal.Drcha: Resultado <strong>de</strong> Delaunay con la catalogación <strong>de</strong> los tres tipos <strong>de</strong> triángulos.A la hora <strong>de</strong> construir un triángulo, se tiene que asegurar que la arista nocorta a ninguna otra arista <strong>de</strong>l polígono (ver figura 2 Izqda.), es <strong>de</strong>cir, queno hay parte <strong>de</strong>l polígono <strong>de</strong>ntro <strong>de</strong> la superficie <strong>de</strong>l triángulo a construir,ya que en ese caso, se alteraría la figura al no generar los triángulos en lasuperficie que encierra el polígono.Como se pue<strong>de</strong> ver en la figura 2 Izqda., no sería válida la arista internaque se ve punteada en el vértice superior. Para solucionar esta situación, setraza una arista interna que va <strong>de</strong>s<strong>de</strong> este vértice hasta el más pró<strong>xi</strong>mo a él<strong>de</strong> los que permanecen en interior <strong>de</strong>l triángulo que se pretendía formar.Esta arista divi<strong>de</strong> el polígono en dos (ver figura 2 Drcha.) y <strong>de</strong> esta formase sigue aplicando una triangularización básica a cada uno <strong>de</strong> los polígonos(se divi<strong>de</strong> el problema).En la figura 2 Drcha. se observa también que el vértice inferior <strong>de</strong>tectadoen el polígono P2, aunque sea convexo y no contenga parte <strong>de</strong>l polígono enel área que <strong>de</strong>l triángulo a trazar, choca con otra arista interna <strong>de</strong> latriangularización, este caso nunca se da porque si ya se ha trazado la aristainterna para formar un triángulo con las aristas que comparten el vérticesituado más a la izquierda, este vértice y aristas se han eliminado <strong>de</strong>lproceso <strong>de</strong> triangularización, con lo cual, la arista válida es la que vemos encolor rojo.De esta forma queda triangularizada toda la superficie limitada por elpolígono cerrado generado.Se <strong>de</strong>nominan aristas externas, a las aristas que <strong>de</strong>finen el polígono osilueta generada y aristas internas, a las aristas que han sido generadasmediante triangularización (ver figura 3 Drcha).2. Delaunay: a la triangularización básica generada, se le aplica laoptimización <strong>de</strong> Delaunay, consistente en la i<strong>de</strong>ntificación y sustitución <strong>de</strong>aristas internas ilegales por aristas internas legales.


Mo<strong>de</strong>lado 3D basado en Bocetos [ 275 ]Figura 4. Espina Dorsal.Una arista es legal cuando ma<strong>xi</strong>miza el ángulo mínimo <strong>de</strong>l triánguloformado, y es ilegal en caso contrario. Si se i<strong>de</strong>ntifica una arista ilegal, serealiza un giro (también <strong>de</strong>nominado flip) <strong>de</strong> esa arista, por la opuesta enel cuadrilátero formado por los dos triángulos que comparten dicha arista.De esta forma se asegura que la superficie <strong>de</strong>l polígono que<strong>de</strong> repartidamediante triángulos <strong>de</strong> la forma más homogénea posible (ver figura 3Izqda.).Los triángulos generados a partir <strong>de</strong> la triangularización se pue<strong>de</strong>ncatalogar como (ver figura 3 Drcha.):●●●T-triangles: compuestos <strong>de</strong> dos aristas externas.S-triangles: compuestos <strong>de</strong> una arista externa.J-triangles: compuestos <strong>de</strong> tres aristas internas.Detección y elevación <strong>de</strong> la espina dorsalUna vez generado el plano, se proce<strong>de</strong> a <strong>de</strong>tectar la espina dorsal(spine) <strong>de</strong> éste. Para ello se <strong>de</strong>tectan los puntos principales <strong>de</strong>l eje mediano<strong>de</strong> la forma inicial, a lo que llamaremos puntos <strong>de</strong> cone<strong>xi</strong>ón <strong>de</strong> la espinadorsal. La unión meidante aristas <strong>de</strong> estos puntos <strong>de</strong> cone<strong>xi</strong>ón me dan laespina dorsal <strong>de</strong>l plano que representa la silueta <strong>de</strong>l objeto.Estos puntos <strong>de</strong> cone<strong>xi</strong>ón se calculan recorriendo cada uno <strong>de</strong> los triángulosque forman el plano y analizando cada uno <strong>de</strong> ellos como se explica acontinuación (ver figura 4):●T-triangle: se <strong>de</strong>tecta un punto <strong>de</strong> cone<strong>xi</strong>ón en el centro <strong>de</strong> laarista interna <strong>de</strong>l triángulo. Este punto también será <strong>de</strong>tectado alevaluar el otro triángulo que comparte esta misma arista interna, ysi es un S-triangle o un J-Triangle unirá este punto <strong>de</strong> cone<strong>xi</strong>óncon el que corresponda según se explica a continuación.


[ 276 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3D●S-triangles: se <strong>de</strong>tectan dos puntos <strong>de</strong> cone<strong>xi</strong>ón, uno por cadauna <strong>de</strong> las aristas internas <strong>de</strong>l triángulo y serán situados en elcentro <strong>de</strong> cada arista. Estos dos puntos <strong>de</strong> cone<strong>xi</strong>ón serán unidospor una arista para formar la espina dorsal.●J-triangles: se <strong>de</strong>tectan cuatro puntos <strong>de</strong> cone<strong>xi</strong>ón, uno por cadauna <strong>de</strong> las aristas internas, situados cada uno en el punto medio <strong>de</strong>las correspondientes aristas, y un punto <strong>de</strong> cone<strong>xi</strong>ón situado en elcentro <strong>de</strong>l triángulo. Cada punto <strong>de</strong> cone<strong>xi</strong>ón pertenecientes a lasaristas internas serán unidos mediante una arista <strong>de</strong> la espinadorsal al punto <strong>de</strong> cone<strong>xi</strong>ón <strong>de</strong>l centro <strong>de</strong>l triángulo.Una vez que todos los puntos <strong>de</strong> cone<strong>xi</strong>ón han sido unidos mediantearistas formando la espina dorsal <strong>de</strong>l plano, se proce<strong>de</strong> a la elevación <strong>de</strong> laespina (ver figura 5).El problema es computar la distancia <strong>de</strong>s<strong>de</strong> la espina dorsal al límite <strong>de</strong>lpolígono. Lo i<strong>de</strong>al es construir secciones representativas exactas <strong>de</strong> laforma, en cada uno <strong>de</strong> los vértices <strong>de</strong> la espina dorsal, cuyo coste esbastante elevado. Por ello se calcula, para cada punto <strong>de</strong> cone<strong>xi</strong>ón,<strong>de</strong>pendiendo <strong>de</strong> si está asociado a una arista interna o está situado en elcentro <strong>de</strong> un triángulo.●●Para el caso en el que los puntos <strong>de</strong> cone<strong>xi</strong>ón sean punto medio <strong>de</strong>aristas internas, se calcula un promedio <strong>de</strong> las distancias entre lospuntos <strong>de</strong> cone<strong>xi</strong>ón y los vértices externos (cualquier vértice <strong>de</strong>lplano) que están conectados directamente a ese vértice, y esa serála altura <strong>de</strong> ese punto <strong>de</strong> la espina.Para el caso en el que los puntos <strong>de</strong> cone<strong>xi</strong>ón son el punto central<strong>de</strong> un J-triangle, se calcula como promedio <strong>de</strong> las distancias <strong>de</strong>elevación <strong>de</strong> los puntos <strong>de</strong> cone<strong>xi</strong>ón directamente conectados aéste.Figura 5. Elevación <strong>de</strong> la espina dorsal.


Mo<strong>de</strong>lado 3D basado en Bocetos [ 277 ]Figura 6. Izqda: Dimensiones X e Y y orientación <strong>de</strong> cada metaelipse.Drcha: Dimension Z <strong>de</strong> cada metaelipse.Obtención <strong>de</strong>l volumen mediante metasuperficiesLa obtención <strong>de</strong>l volumen se realiza añadiendo para cada vértice opunto <strong>de</strong> cone<strong>xi</strong>ón <strong>de</strong> la espina dorsal un metaelemento, concrétamenteuna metaelipse con una dimensión y orientación <strong>de</strong>terminada (ver figura6).●●La dimensión X <strong>de</strong> cada metaelipse se correspon<strong>de</strong> para el casoen el que su punto <strong>de</strong> cone<strong>xi</strong>ón asociado es el punto medio <strong>de</strong> unaarista interna, con la longitud <strong>de</strong> dicha arista interna; si por elcontrario, el punto <strong>de</strong> cone<strong>xi</strong>ón asociado se correspon<strong>de</strong> con elpunto medio <strong>de</strong> un J-triangle, la dimensión X se correspon<strong>de</strong> conla longitud media <strong>de</strong> las bisectrices <strong>de</strong>l J-triangle.La dimensión Y <strong>de</strong> cada metaelipse se correspon<strong>de</strong> con ladistancia media <strong>de</strong>s<strong>de</strong> ese punto <strong>de</strong> cone<strong>xi</strong>ón al resto <strong>de</strong> puntos <strong>de</strong>cone<strong>xi</strong>ón directamente conectados al mismo.●La dimensión Z <strong>de</strong> cada metaelipse se correspon<strong>de</strong> con el doble<strong>de</strong> la altura <strong>de</strong> la espina en el punto <strong>de</strong> cone<strong>xi</strong>ón asociado a lametaelipse, ya que la figura resultante va a ser simétrica, y tendráuna componente Z positiva <strong>de</strong> valor el <strong>de</strong> la altura <strong>de</strong> la espina yuna componente Z negativa <strong>de</strong>l mismo valor absoluto (ver figura 6Drcha.).Con este algoritmo se obtiene una malla 3D creada a partir <strong>de</strong> la unión<strong>de</strong> esas metaelipses añadidas, consiguiendo el objeto 3D con lasdimensiones correspondientes a la forma inicial pintada por el usuario.


[ 278 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 7. Izqda: Metaelipses <strong>de</strong> dimensión fija y reducida.Drcha: Metaelipses a lo largo <strong>de</strong>l eje Z.Mejoras en la obtención <strong>de</strong>l volumenEn la generación <strong>de</strong>l objeto 3D según el algoritmo <strong>de</strong> generación <strong>de</strong>volumen especificado en el apartado anterior surgen dos problemasprincipales:●Cuando en la generación <strong>de</strong> la espina dorsal, aparecen por ejemplodos puntos <strong>de</strong> cone<strong>xi</strong>ón muy distantes, pero que a sus otros ladosrespectivamente tienen puntos <strong>de</strong> cone<strong>xi</strong>ón muy cercanos, como ladimensión Y que se establece para cada metabola es la media <strong>de</strong>las distancias, pue<strong>de</strong>n aparecer huecos o cavida<strong>de</strong>s en la malla 3D<strong>de</strong>l objeto resultante <strong>de</strong>bido a la falta <strong>de</strong> metaelementos en esazona.●En algunas figuras creadas por el usuario, se i<strong>de</strong>ntifican saltosbruscos entre las metasuperficies, cuando en realidad, no se <strong>de</strong>bíapo<strong>de</strong>r i<strong>de</strong>ntificar visualmente cada metasuperficie, sino que se<strong>de</strong>bería obtener una malla suavizada como resultado <strong>de</strong>l trazorealizado originariamente por el usuario. Estos saltos son más<strong>de</strong>stacados a cuánto menor es el nivel <strong>de</strong> <strong>de</strong>talle. A mayor nivel <strong>de</strong><strong>de</strong>talle en la generación <strong>de</strong>l polígono a partir <strong>de</strong>l trazo <strong>de</strong>l usuario,más vértices otenemos, por lo tanto más triángulos son generadosen la triangularización y más puntos <strong>de</strong> cone<strong>xi</strong>ón obtendremos enla construcción <strong>de</strong> la espina dorsal, con lo cual las dimensiones <strong>de</strong>los metaelementos cambian <strong>de</strong> uno a otro más progresivamente.La solución a estos problemas pasa por la creación <strong>de</strong> metaelipses <strong>de</strong>dimensiones fijas reducidas, en vez <strong>de</strong> una por cada punto <strong>de</strong> cone<strong>xi</strong>ón <strong>de</strong>la espina dorsal, crear las necesarias para cubrir todas las dimensiones (verfigura 7 Izqda.).


Mo<strong>de</strong>lado 3D basado en Bocetos [ 279 ]●Se sitúan metaelipses con dimensiones fijas y reducidas a lo largo<strong>de</strong> cada arista interna.● Se sitúan metaelipses a lo largo <strong>de</strong> la mayor bisectriz <strong>de</strong> cada J-triangle.●●Se sitúan metaelipses a lo largo <strong>de</strong>l eje <strong>de</strong> la espina dorsal, y cadacierta distancia, en ausencia <strong>de</strong> aristas internas, se crearán aristasinternas imaginarias, con el mismo comportamiento que el citadoanteriormente para la situación <strong>de</strong> metaelipses. Con esta <strong>de</strong>cisión,se evita la generación <strong>de</strong> huecos in<strong>de</strong>seados en el objeto 3Dgenerado.Se sitúan metaelipses cubriendo la distancia media <strong>de</strong>s<strong>de</strong> el punto<strong>de</strong> cone<strong>xi</strong>ón con los puntos conectados directamente.●Se sitúan metaelipses a lo largo <strong>de</strong>l eje Z cubriendo la altura <strong>de</strong> laespina dorsal, estableciendo una altura incremental <strong>de</strong>s<strong>de</strong> la altura<strong>de</strong> un punto <strong>de</strong> cone<strong>xi</strong>ón al siguiente. Así evitamos escalonesbruscos en la malla 3D generada.Como se pue<strong>de</strong> ver en la figura 7 Drcha., (la figura ha sido simplificadaviéndose únicamente metaelipses a lo largo <strong>de</strong> la espina dorsal para mayorclaridad), se muestra hasta dón<strong>de</strong> llegarían las metaelipses a lo largo <strong>de</strong>leje Z, estableciendo como se ha dicho anteriormente un promedio entre laposición (en el eje Z) <strong>de</strong> las que están situadas en la posición <strong>de</strong> los puntos<strong>de</strong> cone<strong>xi</strong>ón que las limitan.Algoritmo <strong>de</strong> extrusiónA continuación se <strong>de</strong>scribe el algoritmo para la ejecución <strong>de</strong> la operación<strong>de</strong> extrusión sobre un objeto 3D previamente creado. Este algoritmo aún seencuentra en <strong>de</strong>sarrollo en el sistema MOSKIS3D.Trazo <strong>de</strong>l usuarioEn primer lugar, el usuario realiza un trazo seleccionando la superficie<strong>de</strong>l objeto 3D a extruir, ese trazo, también llamado trazo base, <strong>de</strong>be formaruna superficie cerrada. A continuación, realiza otro trazo, llamado trazo <strong>de</strong>extrusión, con la forma que <strong>de</strong>sea conseguir con la operación (ver figura 8Izqda.).El algoritmo <strong>de</strong> extrusión, crea una nueva malla 3D basada en el trazobase creado por el usuario y en el trazo <strong>de</strong> extrusión.


[ 280 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DFigura 8. Izqda: Trazos <strong>de</strong>l usuario al realizar la operación <strong>de</strong> extrusión.Drcha: Polígono triangularizado.El usuario pue<strong>de</strong> <strong>de</strong>sear una extrusión positiva, es <strong>de</strong>cir, una prolongación<strong>de</strong>l objeto 3D hacia el exterior siguiendo la forma <strong>de</strong>l trazo realizado;o una extrusión negativa, es <strong>de</strong>cir, una concavidad en el interior <strong>de</strong>lobjeto 3D con la forma indicada (ver figura 8 Izqda.).A partir <strong>de</strong>l trazo base, se construye un polígono plano cerrado con elmismo nivel <strong>de</strong> <strong>de</strong>talle que el establecido para la generación <strong>de</strong>l objeto 3Dprevio.A partir <strong>de</strong>l trazo <strong>de</strong> extrusión, también se genera un polígono plano, peroabierto, que tendrá el mismo nivel <strong>de</strong> <strong>de</strong>talle que en el caso anterior (verfigura 8 Drcha.).Triangularización y generación <strong>de</strong> la espinaUna vez obtenido el polígono <strong>de</strong>l trazo base, se proce<strong>de</strong> a la triangularización<strong>de</strong> ese polígono cerrado, al igual que se hacía en el caso <strong>de</strong> creación<strong>de</strong> un objeto nuevo. Primero se triangulariza mediante un algoritmo <strong>de</strong>triangularización básica y a continuación se proce<strong>de</strong> a una optimizaciónpor Delaunay (ver figura 3 Drcha).Una vez triangularizado el trazo base, se tiene una superficie compuesta <strong>de</strong>los tres tipos <strong>de</strong> triángulos citados anteriormente T-triangles, J-triangles yS-triangles (ver figura 3 Drcha).En este momento, se calcula la espina dorsal <strong>de</strong>l plano generado a partir<strong>de</strong>l trazo base, evaluando cada uno <strong>de</strong> los triángulos como se hacía en la<strong>de</strong>tección <strong>de</strong> la espina para el caso <strong>de</strong> creación <strong>de</strong> un objeto nuevo (verfigura 4), obteniendo una serie <strong>de</strong> puntos conectados formando el ejecentral <strong>de</strong> la superficie seleccionada por el usuario, es <strong>de</strong>cir, la superficie aextruir.


Mo<strong>de</strong>lado 3D basado en Bocetos [ 281 ]Figura 9. Izqda: Trazo base triangularizado y espina dorsal <strong>de</strong>tectada.Drcha: Anillos <strong>de</strong> extrusión.En la creación <strong>de</strong> un objeto nuevo, el siguiente paso era la elevación <strong>de</strong>la espina dorsal mediante el cálculo <strong>de</strong> un promedio en cada uno <strong>de</strong> lospuntos <strong>de</strong> cone<strong>xi</strong>ón <strong>de</strong> la espina. En el algoritmo <strong>de</strong> extrusión, por elcontrario, no se quiere crear un objeto 3D a partir <strong>de</strong> la forma creada por elusuario como trazo base, sino extruir esa forma a lo largo <strong>de</strong>l trazo <strong>de</strong>extrusión, por lo que no tiene sentido el cálculo <strong>de</strong>l objeto 3D asociado aesa forma, y por tanto, no tiene sentido el paso <strong>de</strong> elevación <strong>de</strong> la espinadorsal (ver figura 9 Izqda.).Generación <strong>de</strong> la extrusiónUna vez obtenido el plano correspondiente al trazo base, y la espinadorsal <strong>de</strong> dicho plano, se proce<strong>de</strong> a rellenar el plano con metaelipses.Se sitúan metaelipses con dimensiones fijas y reducidas a lo largo <strong>de</strong> cadaarista interna, para cada triángulo, y para el caso en el que se tenga un J-triangle se sitúan metaelipses a lo largo <strong>de</strong> la mayor bisectriz <strong>de</strong>l triángulo.Para evitar la generación <strong>de</strong> huecos in<strong>de</strong>seados, se sitúan metaelipses a lolargo <strong>de</strong>l eje <strong>de</strong> la espina dorsal, y cada cierta distancia, si no e<strong>xi</strong>sten aristasinternas, se crearán imaginarias, con el mismo comportamiento. Tambiénse sitúan metaelipses cubriendo la distancia media entre el punto <strong>de</strong>cone<strong>xi</strong>ón y los puntos conectados directamente a este.Con este paso obtenemos un conjunto <strong>de</strong> metabolas con la forma <strong>de</strong> lasuperficie que <strong>de</strong>limitaba el trazo base generado originalmente por elusuario. Para generar la extrusión <strong>de</strong>l trazo base a lo largo <strong>de</strong>l trazo <strong>de</strong>extrusión se proce<strong>de</strong> a la proyección <strong>de</strong>l conjunto <strong>de</strong> metabolas, <strong>de</strong> formaque cada una <strong>de</strong> las proyecciones resultantes que<strong>de</strong>n situadasperpendicularmente con respecto al trazo <strong>de</strong> extrusión y se redimensionenpara ajustarse al tamaño <strong>de</strong>l trazo.


[ 282 ] Tecnologías Libres para Síntesis <strong>de</strong> Imagen 3DEl número <strong>de</strong> proyecciones en principio <strong>de</strong>pen<strong>de</strong> <strong>de</strong>l nivel <strong>de</strong> <strong>de</strong>talle con elcual se haya generado el polígono abierto correspondiente al trazo <strong>de</strong>extrusión creado por el usuario. En los casos en los que la distancia entrelos vértices <strong>de</strong>l polígono (<strong>de</strong>l trazo <strong>de</strong> proyección) sea muy gran<strong>de</strong>, paraevitar el problema <strong>de</strong> zonas huecas o poco pobladas <strong>de</strong>l que hablábamos enel apartado <strong>de</strong> Mejoras en la obtención <strong>de</strong>l volumen, <strong>de</strong>limitaremos ladistancia má<strong>xi</strong>ma que <strong>de</strong>be haber para una nueva proyección, y en el casoen el que no se cumpla, se añadirá una nueva proyección (ver figura 9Drcha).Hay que diferenciar el caso en el que la extrusión es positiva o negativa, yaque en el primer caso las metaelipses generadas <strong>de</strong>ben tener una atracciónpositiva, mientras que en el caso en el que la extrusión es negativa, seproducirá una repulsión, para conseguir la concavidad o hueco que se<strong>de</strong>sea (ver figura 8 Izqda).ResultadosEmpleando el método explicado en este artículo hemos obtenido el mo<strong>de</strong>lo<strong>de</strong> la figura 10. La silueta original fue convertida a 431 superficiesimplícitas (incluyendo las necesarias para realizar las extrusiones). Elsiguiente paso fue convertir la superficie a malla poligonal (formada por12403 caras). Finalmente, el mo<strong>de</strong>lo fue suavizado y se aplicó un algoritmo<strong>de</strong> eliminación <strong>de</strong> aristas.Figura 10. Ejemplo <strong>de</strong> personaje realizado con MoSkIS 3D.


Ciudad RealJunio 2006

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!