Pues sí, se supone que la serie se quedaría en el 2, pero resulta que acaban de_lanzar_la_versión_1.5_de_Structure_Synth, que añade:

* Un raytracer integrado, ya no hay que usar programas externos como
Sunflow

* Scripting con Javascript para hacer animaciones (a estas alturas más de
uno, entre los que me incluyo, ya debe estar salivando =D )

* Exportación de archivos OBJ (confieso que esto aún no se que es)

* Cambios varios... en la GUI, se añadio un generador de números
aleatorios para el preprocesador, etc
*

Y uno no se puede quedar sin hablar de ella =P La nueva versión se puede descargar aquí: http:// structuresynth.sourceforge.net/download.php

Empezamos...

Raytracer

No tiene sentido explicar como utilizar el raytracer por lo sencillo que es, en el menú desplegable de render se puede elegir entre Raytrace (final) y Raytrace (in window), el último sirve para hacer una previsualización y tiene un botón más a mano al lado del de "Reset View". Sea como fuere, los resultados son bastante buenos para el tiempo que tarda.

La imágen que genera el código de ejemplo

Javascript

Desde que descubrí_que_se_añadiría_un_lenguaje_de_scripting (Javascript) tuve ganas de probar la nueva versión, siempre es fuente de inspiración meter un lenguaje turing completo en cualquier programa (que se lo digan a los de PDF xD ), y evita tener que ensamblar todo frame a frame, que aunque se pueda automatizar, para resoluciones considerables es impracticable.

La verdad sea dicha, las animaciones aún se hacen ensamblando frame a frame (juntar todo queda de tu mano), pero dado que el raytracer interno es relativamente rapido puede llegar a ser usable (dejarlo funcionando mientras vas a tomar algo hace que sea más soportable ;)  )

Pero me estoy yendo por las ramas, al parecer el programa utiliza QT’s QScriptEngine como motor, así que tienes a tu disposición todo el poder de javascript, y obviamente se añadió una clase que permite interactuar con el programa, Builder.

Nota: El código javascript debe estar en un archivo separado y debe comenzar por #javascript  sin nada antes (similar a como hace *nix con #! ).

Métodos que proporciona Builder (copy-traduce-paste de la_referencia):

===============================================================================

Builder.load(string fileName) Carga un archivo EisenScript en el buffer.

Builder.define(string input, string value) Realiza substutuciones de texto en el buffer (¡pero ignora las líneas de preprocesador!) .

Builder.prepend(string prescript); Añade 'prescript' al principio del buffer.

Builder.append(string postscript); Añade 'postscript' al final del buffer.

Builder.build(); Construye el sistema. La salida es visible a través de la ventana OpenGL de trabajo.

Builder.renderToFile(string fileName, bool overwrite); Guarda lo que se ve en el OpenGL a un archivo. 'overwrite' indica si esta bien sobreescribir archivos existentes sin avisar.

Builder.raytraceToFile(string fileName, bool overwrite); Trazar los rayos de la imágen con el trazador interno y guardarlo en un archivo. 'overwrite' indica si esta bien sobreescribir archivos existentes sin avisar.

Builder.templateRenderToFile(string templateName, string fileName, bool overwrite);Traza los rayos con las mismas dimensiones que la vista, a un archivo. 'overwrite' indica si esta bien sobreescribir archivos existentes sin avisar.

Builder.execute(string fileName, string args, bool waitForFinish); Ejecuta un proceso externo. Pensado para ser usado después de llamar a 'templateRenderToFile'. Si 'waitForFinish' es true, el intérprete de JavaScript se bloqueará hasta que el proceso se complete.

Builder.reset(); Restaura el contenido original del buffer (útil para cuando se hicieron substituciones.)

Builder.setSize(int width, int height); Ajusta las dimensiones de la salida (raytracer interno y plantillas). Si el ancho y el alto son cero, se usan las dimensiones de la pantalla (por defecto). Si el ancho o el alto son cero, la otra dimensión se calcula usando las proporciones del visor.

===============================================================================

Como mezclarlo todo es cuestión de cada un@.

Esta es una animación de ejemplo (es algo simple, que ya no son horas para andar tecleando): http://videobin.org/+2kk/2v9.html

El código javascript (en el video se repite 4 veces):

===============================================================================

javascript

// Basado en la referencia // http://blog.hvidtfeldts.net/index.php/2010/11/scripting-in-structure-synth/

function pad(number) { // Añade 0's a un número para que el comando number = number.toString(); // que genere el video no se lie while (number.length < 4) { number = "0" + number; } return number; }

Builder.load("sierpinski_carpet.es"); // Carga la base max = 45; for (i = 0; i <= max; i++) { Builder.reset(); // Se reinicia todo Builder.setSize(0,0); // Inutil, usa tamaño por defecto Builder.define("rotation", (i * 2).toString()); // Se rota 2 grados Builder.build(); // Genera la figura Builder.raytraceToFile("Image" + pad(i) + ".png",true); // La traza en un archivo }

===============================================================================

El código de la figura sierpinski_carpet.es :

===============================================================================

// Sierpinksi carpet 3D Fractal set background white set maxdepth 5

define space 3

define ratio 0.33

define color_change 50

define size 4

{s size ry rotation}sierpinski

rule sierpinski{

{ hue color_change s ratio x space } sierpinski { hue color_change s ratio x -space } sierpinski

{ hue color_change s ratio y space } sierpinski { hue color_change s ratio y -space } sierpinski

{ hue color_change s ratio z space } sierpinski { hue color_change s ratio z -space } sierpinski

{ hue color_change s ratio x space y space } sierpinski { hue color_change s ratio x space y space z space } sierpinski { hue color_change s ratio x space y space z -space } sierpinski { hue color_change s ratio x space y -space } sierpinski { hue color_change s ratio x space y -space z space } sierpinski { hue color_change s ratio x space y -space z -space } sierpinski

{ hue color_change s ratio x -space y space } sierpinski { hue color_change s ratio x -space y space z space } sierpinski { hue color_change s ratio x -space y space z -space } sierpinski { hue color_change s ratio x -space y -space } sierpinski { hue color_change s ratio x -space y -space z space } sierpinski { hue color_change s ratio x -space y -space z -space } sierpinski

{ hue color_change s ratio y space z space } sierpinski { hue color_change s ratio y space z -space } sierpinski { hue color_change s ratio y -space z space } sierpinski { hue color_change s ratio y -space z -space } sierpinski

{ hue color_change s ratio z space x space } sierpinski { hue color_change s ratio z space x -space } sierpinski { hue color_change s ratio z -space x space } sierpinski { hue color_change s ratio z -space x -space } sierpinski box }

===============================================================================

ps: Por desgracia parece que no es del todo estable al ejecutar el raytracer.

Saludos