Simulación de fluidos 3D: tutorial práctico para programadores

Fuentes: Fluid Simulation for Dummies
Imagen generada por IA con el prompt: 3D grid of translucent cubes with colorful dye flowing through cells, technical illustration, dark background with blue and orange fluid highlights, schematic style
Imagen generada con IA

Este artículo del blog de Mike Ash ofrece una introducción paso a paso a la simulación de fluidos en 3D, pensada para programadores sin formación profunda en física o ecuaciones diferenciales. El autor basa su explicación en el trabajo de Jos Stam, "Real-Time Fluid Dynamics for Games", y comparte la guía que él mismo echó en falta durante su tesis de máster (primavera-verano de 2005) sobre simulación de fluidos en tiempo real y renderizado volumétrico. Su propósito es acercar una técnica habitual en gráficos por ordenador y videojuegos, pero a menudo envuelta en formulaciones matemáticas inaccesibles.

El texto parte de una idea intuitiva: representar el fluido como una rejilla tridimensional de celdas, cada una con propiedades como velocidad y densidad. Para visualizar el movimiento, Ash añade un tinte (colorante) cuya "densidad" —el término que emplea a lo largo del artículo— no es la densidad real del fluido, sino la del propio tinte. Este matiz, aparentemente menor, le costó al autor unos seis meses de trabajo, según reconoce.

El núcleo del tutorial se articula en torno a tres operaciones que componen cada paso de la simulación: la difusión, que reparte velocidad y colorante entre celdas vecinas; la proyección, que garantiza la incompresibilidad del fluido ajustando los flujos para que la cantidad que entra en cada celda sea igual a la que sale; y la advección, que transporta las propiedades siguiendo el campo de velocidades. A estas operaciones se suman dos subrutinas: set_bnd, que establece condiciones de contorno para que el fluido no se "escape" de la rejilla, y lin_solve, un resolvedor de ecuaciones lineales que el autor admite no comprender del todo, pero que resulta imprescindible para la difusión y la proyección.

En el plano práctico, Ash muestra las estructuras de datos en C necesarias para implementar la simulación: la estructura FluidCube, con arreglos unidimensionales que simulan un espacio tridimensional, y un macro IX(x,y,z) para indexarlos. También presenta la función FluidCubeStep, que orquesta el orden de las operaciones en cada iteración: difundir las tres componentes de velocidad, proyectar para forzar incompresibilidad, advectar las velocidades, proyectar de nuevo, difundir el tinte y, finalmente, advectar la densidad.

El artículo se dirige a desarrolladores que quieran introducirse en la simulación de fluidos incompresibles —para animación, efectos visuales o videojuegos— sin descifrar manualmente las ecuaciones de Navier-Stokes. Como consideraciones, el autor señala las limitaciones de su enfoque: la simulación asume fluido incompresible, ignora la física detallada de gases y deja en el aire el funcionamiento exacto de lin_solve. Para una cobertura más profunda, paralelización o renderizado volumétrico en 3D, remite a su tesis de máster y al artículo original de Stam.