- 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
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
No hay comentarios:
Publicar un comentario