sábado, 28 de diciembre de 2013

Particle systems

Fuente: Irrlicht engine (http://irrlicht.sourceforge.net/)

Desde comienzos de siglo las funcionalidades para sistemas de partículas han sido integradas en la mayor parte de tecnologías gráficas. De este modo las APIs proporcionadas por los SDKs de nVidia o ATI, por ejemplo, extienden la capacidades proporcionadas en el ámbito de DirectX y OpenGL para alcanzar el máximo rendimiento de la GPU.
Los sistemas de partículas consisten en un conjunto de pequeños objetos que emanan de un objeto contenedor denominado emitter. El emitter actúa a modo de fuente generadora de partículas, controlando su posición en el espacio 3D, cantidad de partículas y su movimiento. Cada partícula contiene información de su tiempo de vida (lifespan), el color, la textura, la forma, etc. Además de estos objetos, otro módulo se encarga del comportamiento de la partícula aplicando efectos de gravedad, incluso diferentes tipos de aceleraciones, como una función euleriana o personalizada.

Para ilustrar esta idea, la siguiente imagen muestra un pseudo-diagrama de clases en UML con los diferentes tipos de componentes relacionados con un sistema de partículas:

 
Fuente: wiki/Blender

Como puede apreciarse, el objeto principal de Partícula controla la información de sus objetos de datos y mantiene una referencia al módulo predefinido de comportamiento. Los datos de la partícula se suelen asociar a la textura y sus atributos principales de simulación física (velocidad, aceleración, posición y fuerzas). En lo concerniente a la textura, es posible aplicar diferentes tipos de técnicas de rendering como: Billboards, Halos y Strands (para simular hierba y pelo). En la fase final de renderizado se decide el objeto 3D que representará a la partícula. En este caso se puede optar por simples píxeles, cruces, círculos y Strands; aunque para la representación de la partícula en sistemas de bajo rendimiento se utilizarán casi siempre píxeles.

Adicionalmente se puede añadir un objeto colisionador en la fase de simulación que deberá ser controlado y  redefinido por el módulo de comportamiento. El objeto colisionador puede ser cualquier objeto 3D o una simple superficie.

Finalmente cabe decir que el éxito de los motores de partículas no ha tardado en hacerse notar, pues su repercusión en la sociedad a través de videojuegos, cine y simulación de efectos astrofísicos ha sido sobresaliente.

------
 
Para código fuente pedagógico véase applet en el lenguaje Processing:

http://processing.org/examples/simpleparticlesystem.html

jueves, 12 de diciembre de 2013

Cutting edge design patterns


Fuente: Arbotante de la Catedral de Amiens (Wikipedia)

En 1979 el arquitecto Christopher Alexander publicó un impactante libro conocido como "The Timeless Way of Building" (El modo intemporal de construir), que supuso una mejora en la calidad de la construcción de edificios al introducir una serie de patrones basados principalmente en la arquitectura clásica y en menor medida en la vanguardista. En los años posteriores, Christopher Alexander y sus colegas publicaron el volumen "A Pattern Language" donde se recopilaba todo el conocimiento arquitectónico hasta la fecha.

La repercusión de estos libros se vio reflejado en el mundo de la ingeniería en 1987, cuando los informáticos Ward Cunningham y Kent Beck sorprendidos por el pobre conocimiento que se transmitía a los alumnos de programación orientada a objetos decidieron aplicar los conceptos de Alexander a las técnicas de polimorfismo y herencia de la OOP. Es así como surgen publicaciones exitosas como el libro "Dessign Patterns" del conocido grupo GoF (Gang of Four: Erich Gamma, Richard Helm, Ralph Johnson y John Vlisides) donde se aglutinan los patrones más conocidos hasta 1995. Otros libros como el "Thinking in Patterns" de Bruce Eckel han tenido también bastante repercusión en el mundo de la Ingeniería del Software y Java.


Hoy, los patrones permiten aplicar una posible solución correcta para un problema de diseño dentro de un contexto dado: aplicaciones cliente-servidor (patrón MVC), aplicación gráficas (patrón Command), dispositivos hardware (patrón Observer), bases de datos (patrón Facade), procesadores de texto (patrón Composite), etc. Incluso ya existen patrones de diseño para sistemas masivamente paralelos (MPP) de simulación de sistemas dinámicos (N-Body particle simulation) y análisis de modelos climáticos que pueden ser consultados en la página del departamento de Ingeniería Informática de la Universidad de Illinois:

La importancia de los patrones de diseño y arquitectónicos que propuso Christopher Alexander nos recuerda que a veces tenemos que olvidar la tendencia al desarrollo rápido de aplicaciones y volver a los fundamentos, a las bases iniciales, pues es allí donde se forjan los conocimientos clave para el desarrollo de aplicaciones duraderas y mantenibles en el tiempo.

Finalizamos esta entrada en el blog citando la frase del mítico literato T.S. Eliot, puesto que evoca la relevancia de la utilización de patrones también en Ingeniería Informática y TIC:  «La imaginación, cuando se ve forzada a trabajar dentro de un marco muy estricto, debe realizar el mayor de los esfuerzos, lo que le llevará a producir sus mejores ideas. Cuando se le ofrece una libertad total, probablemente su trabajo resulte deslavazado».