Saltar a contenido

2026

POV-Ray como herramienta de visualización

En este post me voy a centrar en cómo usar POV-Ray, Python y ffmpeg como herramientas de visualización. Recientemente, como parte de las actividades de una jornada de puertas abiertas, decidimos añadir una visualización en un monitor que teníamos disponible que ayudara a explicar la síntesis de materiales usando reacciones autolimitadas. El resultado es el siguiente vídeo, el producto de jugar unas horas con POV-Ray, Python y ffmpeg para conseguir generar animaciones sencillas de manera automática.

Sobre POV-Ray

POV-Ray (Persistence of Vision Ray-tracer) es un programa de raytracing de software libre. Las animaciones se construyen usando scripts, tradicionalmente con la extensión .pov.

El usuario define una cámara, iluminación y el contenido de una escena en la que se describen los objetos y sus texturas. Cada imagen generada por POV-Ray es un fotograma de la animación.

Sobre FFmpeg

La idea es usar POV-Ray para generar una secuencia de imágenes y convertirlas luego en una animación. Para esta segunda parte del proceso decidí usar el programa FFmpeg.

FFmpeg es un programa para crear y convertir vídeos. Desde la línea de comandos, es posible generar un vídeo en formato mp4 a partir de una colección de imágenes usando el siguiente comando:

ffmpeg -framerate 10 -i image%04d.png -c:v libx264 -pix_fmt yuv420p output.mp4

Esta instrucción coge una secuencia de ficheros image%04d.png (por ejemplo image0001.png, image0002.png) y genera un vídeo usando diez fotogramas por segundo.

Integrándolo todo con Python

Una vez escogidas estas dos herramientas, lo único que falta es automatizar el proceso para generar cientos de fotogramas de manera automática. Para ello, Python es perfecto.

El objetivo es generar los ficheros .pov de manera automática a partir de una colección de objetos. Para ello decidí crear una clase PovSpace que contiene los siguientes elementos:

  1. Una lista de templates, prototipos de objetos que queremos representar
  2. Una colección de objetos, donde especificamos el tipo de objeto (la template a la que pertenecen) y su posición.
  3. Una paleta que permite asociar colores específicos (en el espacio RGB) con nombres sencillos, de manera que podamos definir "verde" como (0,0.9,0). POV-Ray usa una escala de 0 a 1 en lugar de 0 a 255.
class PovSpace:

    def __init__(self, palette):
        self.templates = {}
        self.objs = []
        self.current = 1
        self.palette = palette

La clase PovSpace contiene un método, generate, que crea el contenido del fichero .pov a partir del contenido del objeto:

    def generate(self):

        out = header
        out += self._generate_templates()
        out += self._generate_boxes()
        return out

Finalmente, una función run_pov coge un objeto de la clase PovSpace y se encarga de crear el fichero, ejecutar POV-Ray y opcionalmente visualizar el resultado.

def run_pov(ps, filename, full_hd=False, quality=9, view=True)

Con estos métodos, podemos generar todos los fotogramas necesarios para crear el vídeo de arriba usando un script muy sencillo:

basename = "ald{:04d}.pov"

index = 1

ps = PovSpace(palette)
ps.add_box((0,0,0), (8,2,16), "grey")
index = grow_cycle(ps, index, 2, 0.25, "red", basename)

ps = PovSpace(palette)
ps.add_box((0,0,0), (8,2,16), "grey")
ps.add_box((0,2,0), (8,0.25,16), "red")

index = add_n(ps, index, 10)

index = grow_cycle(ps, index, 2.25, 0.5, "green", basename)

ps = PovSpace(palette)
ps.add_box((0,0,0), (8,2,16), "grey")
ps.add_box((0,2,0), (8,0.25,16), "red")
ps.add_box((0,2.25,0), (8,0.5,16), "green")

index = add_n(ps, index, 10)

index = grow_cycle(ps, index, 2.75, 0.25, "blue", basename)

ps = PovSpace(palette)
ps.add_box((0,0,0), (8,2,16), "grey")
ps.add_box((0,2,0), (8,0.25,16), "red")
ps.add_box((0,2.25,0), (8,0.5,16), "green")
ps.add_box((0,2.75,0), (8,0.25,16), "blue")

index = add_n(ps, index, 10)

...

Papers favoritos: la primera aplicación del método de Monte Carlo al estudio de la materia

En 1953 Metropolis, Rosenbluth, Rosenbluth, Teller y Teller publicaron el primer trabajo en el que describen el llamado método de Metropolis para calcular las propiedades de sistemas en equilibrio. Titulado Equation of State Calculations by Fast Computing Machines, establece el llamado método de Metropolis, un proceso basado en números aleatorios pque permite evolucionar un sistema complejo hasta alcanzar el estado de equilibrio y por tanto extraer sus propiedades acumulando estadísticas de una manera que satisface las condiciones de equilibrio.

Modelo de superficie
Un gran paper

Es un paper fantástico: a pesar de que tiene más de 70 años, entender este trabajo es entender una buena parte de la física estadística y de los métodos que se utilizan para explorar las propiedades de los diferentes estados de la materia.

En el apartado "así se escribe la historia", aunque el algoritmo se llama método de Metropolis, la contribución de Metropolis es principalmente el ordenador en el que se corre el algoritmo, el MANIAC de Los Alamos, descendiente del ENIAC. El desarrollo y la implementación del algoritmo corresponden a Marshall y Arianna Rosenbluth, quienes continuaron explorando sistemas físicos en trabajos posteriores. Teller contribuyó ideas fundamentales incluyendo el énfasis en explorar el problema desde la perspectiva de la física estadística, pero no se dedicó extensivamente a estudiar este método.

Cosas que me parecen fascinantes de este trabajo:

  • El algoritmo se puede reimplementar fácilmente.

  • Cada iteración tardaba 3 minutos, y cada punto en el paper era el trabajo de al menos un día completo.

  • Aunque el método de Metropolis establece que la probabilidad de transicionar de un estado a otro depende exponencialmente de la diferencia de energía, el sistema que exploran, basado en un potencial de esferas duras, no require el cálculo de exponenciales. Aparte de la importancia de este sistema, es sin duda una elección práctica para acelerar el algoritmo.

  • Conceptos avanzados, como el desarrollo del virial de la ecuación de estado de un fluido y su expansión diagramática se dan prácticamente por sentado. Por eso entender algunos de los resultados del artículo requiere unos buenos mimbres teóricos.

  • Arianna Rosenbluth era una máquina programando los primeros ordenadores.

...

Primer post

Este sitio usa Materials for Mkdocs. Uno de los motivos por los que me decidí a usarlo es por su integración con Markdown. Otros generadores de sitios web que uso actualmente o he llegado a usar son los siguientes:

  • sphinx: Es el paquete estándar para escribir documentación en Python pero también permite generar sitios estáticos. Sphinx es la forma más común de escribir documentación e integrarla con sitios como Read The Docs. Genera webs estáticas.

  • jekyll: También funciona con Markdown. Su integración con github es fantástica y tiene plugins bastante interesantes. El único inconveniente es que se basa en Ruby. Lo sigo usando para otros proyectos. Genera webs estáticas.

  • Nikola: Es un generador de sitios estáticos en Python. No lo he llegado a usar mucho.

  • Pelican: Otro generador de páginas web estáticas. He jugado con él pero nunca me ha atraído mucho su estética.

  • Wordpress: Dinámico, basado en PHP y uno de los más conocidos. Lo he usado siempre con hosting sites que te proporcionan una distribución y un mínimo mantenimiento. Volví a él después de casi veinte años y casi me tiro por la ventana con algunas de las opciones más modernas.

  • html+css: Crear un sitio sencillo directamente en html y css no es difícil, siempre y cuando no te importe el prueba y error. Está bien mantener un mínimo conocimiento de html si eres un científico. Algunos programas como pandoc te permiten convertir tex o Markdown directamente a html.

Mi objectivo es explorar Materials for Mkdocs y ver si merece la pena usarlo en otros de mis sitios. Si me canso, borrón y cuenta nueva. De momento, he mantenido la configuración lo más sencilla posible, actualmente tengo sólo los siguientes plugins:

plugins:
  - privacy
  - blog
  - rss
Y extensiones para trabajar con ecuaciones.

...