Introducción a Structure Synth ( I )
Nada, ya está la primera parte de esta introducción a Structure_Synth, sin mas dilación...
Todos lo que se puede hacer en Structure Synth se basa en unos elementos básicos llamados reglas, las reglas básicas (llamadas primitivas) son:
-
Sphere (esfera) [http://3.bp.blogspot.com/_26RJWnubh-w/TESbLnXFlrI/AAAAAAAAAMU/WkZo-TcXQWA/ s320/sphere.png]
-
Box (caja) [http://1.bp.blogspot.com/_26RJWnubh-w/TESbMjbb_vI/AAAAAAAAAMY/dYJLkeWHL3o/ s320/box.png]
-
Grid (Rejilla) [http://3.bp.blogspot.com/_26RJWnubh-w/TESbOPkyi8I/AAAAAAAAAMg/zxdi_EYpfcM/ s320/grid.png]
-
Line (Línea) [http://4.bp.blogspot.com/_26RJWnubh-w/TESbNI8TUfI/AAAAAAAAAMc/A-M_soM3WpA/ s320/line.png]
Lo único necesario para que se muestre una regla es poner su nombre en el archivo que se va a "leer", por ejemplo
=============================================================================== Sphere =============================================================================== Mostraría una esfera.
Como no, este lenguaje permite comentarios multilínea, desde / hasta / y comentarios de una sola línea, poniendo // al principio del comentario, como cualquier comentario en C.
Por cierto, si estas viendo que las imágenes tienen el fondo en blanco, pero si lo haces tu no, es por que hay que añadir
=============================================================================== set background white =============================================================================== Ya explicaré más tarde para que sirve, pero no afecta a la programación en si.
Transformaciones geométricas: Movimiento, Traslaciones
En este lenguaje siempre se parte del sistema de coordenadas, para mover una regla lo que hay que hacer es mover sus coordenadas a través de lo que se llaman transformaciones, estas se especifican entre '{' '}' antes de una regla, para mover el sistema de coordenadas del eje X en 2 unidades haremos { x 2 } regla
Lo mismo para cualquier otro eje ('Y' o 'Z'). Así si queremos poner dos cajas separadas, haremos
=============================================================================== Box { x 2 } Box =============================================================================== El resultado es este: [http://1.bp.blogspot.com/_26RJWnubh-w/TESfluHPlUI/AAAAAAAAAMo/7p6049Gm7rs/ s320/box2.png]
Hay que recordar que las transformaciones solo se aplican para esa regla en concreto, las nuevas reglas seguirán partiendo del sistema de coodenadas original.
=============================================================================== Box { x 2 } Box { x 4 } Box =============================================================================== [http://1.bp.blogspot.com/_26RJWnubh-w/TESgH44zjDI/AAAAAAAAAMs/ueK2lZ6uuUk/ s320/box3.png]
Esto se puede hacer pesado si se tiene que repetir muchas veces, así que se
puede utilizar un bucle que lo haga, la sintaxis para hacerlo es:
Por ejemplo, si queremos que se repita lo que hemos estado haciendo (poner cajas separadas), digamos... 10 veces, haremos:
=============================================================================== 10 * { x 2 } Box ===============================================================================
Importante: Cada iteración del bucle parte del sistema de coordenadas de la anterior (la primera parte del original)
[http://3.bp.blogspot.com/_26RJWnubh-w/TESh9jU1CFI/AAAAAAAAAMw/VxQHJSEFRxQ/ s320/box4.png]
Por supuesto, también se pueden anidar para hacer cosas más complejas, por ejemplo:
=============================================================================== 10 * { x 2 } 10 * { y 2 } Box ===============================================================================
[http://3.bp.blogspot.com/_26RJWnubh-w/TESj_cEjewI/AAAAAAAAAM0/O3kOrFs5LGo/ s320/box5.png]
Transformaciones geométricas: Rotaciones
Otro tipo de movimiento que se realiza a través de las transformaciones es el
de rotación, pero como la posición inicial depende del sistema de
coordenadas, lo que se hace es rotar este sistema, por ejemplo, para rotarlo
sobre el eje Y ( se "moverán" los ejes 'X' y 'Z' ), especificaremos una
transformación
ry
Entonces, para dibujar un circulo solo hay que poner una caja, girar el eje 'X' (rotando sobre uno de los otros dos), y avanzar sobre este eje, repitiendo esto hasta que se hayan completado los 360 grados, por ejemplo:
=============================================================================== 360 * { ry 1 x 1 } Box =============================================================================== [http://1.bp.blogspot.com/_26RJWnubh-w/TESmanGWP3I/AAAAAAAAAM4/1s4sOuZ0y_4/ s320/box6.png]
Transformaciones geométricas: Cambios de tamaño
Además se puede cambiar el tamaño del sistema de coordenadas, hacerlo implica
cambiar el tamaño de las figuras y la distancia que se recorrerá con los
mismos valores, la transformacion es:
s
La proporcion original es 1, 2 el doble, 0.5 la mitad... Si al ejemplo anterior se le añade esta transformación...
=============================================================================== 360 * { ry 1 x 1 s 0.995 } Box =============================================================================== [http://3.bp.blogspot.com/_26RJWnubh-w/TESpZmdusxI/AAAAAAAAAM8/hOBAi0BlHww/ s320/spiral.png]
Si se añaden más iteraciones la espiral continúa...
=============================================================================== 1080 * { ry 1 x 1 s 0.995 } Box =============================================================================== [http://2.bp.blogspot.com/_26RJWnubh-w/TESpeZUvU2I/AAAAAAAAANA/4zYBbUU_hYk/ s320/spiral2.png]
Transformaciones de color: Tono, saturación y brillo
Structure Synth usa un tipo de color llamado HSV_(Tono,_saturación_y_valor), en vez del RGB, esto divide los colores en 3 valores, tono, la saturación y el valor (o brillo). Tono es el "color" que tiene: rojo, verde, azul... La saturación, que indica la cantidad de color (va de blanco a todo color). Y el valor (o el brillo), que indica la cantidad de luz (de blanco a negro).
El tono va de 0 a 360 y vuelta a empezar (361 es igual a 1), su
transformación es
hue
Para ver como funciona de una forma más grafica, volveré al ejemplo del circulo (por problemas con Structure Synth esta pasado por Sunflow) ...
=============================================================================== 360 * { ry 1 x 1 hue 1 } Box =============================================================================== [http://2.bp.blogspot.com/_26RJWnubh-w/TESwC92AldI/AAAAAAAAANE/DjRhanD6C_g/ s320/circle_hue.png]
La saturación es una proporción (como el cambio de tamaño), la
transformación es
sat
Volviendo al caso de las cajas contiguas:
=============================================================================== 10 * { x 1 sat 0.8 } Box =============================================================================== [http://1.bp.blogspot.com/_26RJWnubh-w/TESx4bzDMCI/AAAAAAAAANI/p3Fso7Mw7_0/ s320/line_sat.png]
El valor (o brillo) es también una proporción, de 1 (claro) a 0 (negro), la
transformación es
b
Siguiendo con el ejemplo de las cajas contiguas
=============================================================================== 10 * { x 1 b 0.8 } Box =============================================================================== [http://4.bp.blogspot.com/_26RJWnubh-w/TESzEuKMy9I/AAAAAAAAANM/JDlgwcwWjEs/ s320/line_sat.png] Transformaciones de color: Alfa y colores absolutos
El alfa (o alpha) es el grado de transparencia que tiene un objeto, es una
proporción, de opaco a totalmente transparente, la transformación es
a
Si seguimos con las cajas...
=============================================================================== 10 * { x 1 a 0.8 } Box =============================================================================== [http://1.bp.blogspot.com/_26RJWnubh-w/TES0UhmjoeI/AAAAAAAAANQ/KYbcmbe5BCs/ s320/line_a.png]
Por último decir que Structure Synth permite usar colores absolutos con la
transformación
color
Los colores pueden ser RGB (rojo: #FF0000, verde: #0000FF ...) y los colores predefinidos de SVG (red, lightred, blue, gray ...)
Parámetros y preprocesador
Structure Synth se basa en unos parámetros para definir el "límite" de lo que se renderizará (ahora puede que no parezca muy lógico, pero con recursividad lo será), estos parámetros se especifican con:
set maxdepth
El preprocesador sirve para definir constantes de la misma forma que se hace en C, no tiene ninguna dificultad...
define nombre_de_la_constante constante
Mezclando un poco de todo...
=============================================================================== 1080 * { ry 1 x 1 hue 1 s 0.997 } Box ===============================================================================
[http://3.bp.blogspot.com/_26RJWnubh-w/TETIEy2b9eI/AAAAAAAAANU/r9rWXubLDtA/ s320/spiral_color.png]
Eso es todo por ahora, con el próximo más y mejor: definir nuevas reglas, recursividad, fractales, aleatoriedad...
Hasta entonces