La he llamado «bola hexaédrica recursiva», porque no sabría qué otro nombre dar a esto tan raro.
Es una forma inesperada surgida de unas pruebas que hice. Me ha sorprendido el resultado. Cada bola da origen a otras seis bolas más pequeñas. De ahí el nombre, pero he intentado hacer algo similar usando un patrón tetraédrico y el resultado no es ni de lejos tan llamativo como este. Supongo que la gente que diseña fractales hace pruebas hasta que obtiene algún resultado curioso. Este sin duda lo es.
El vídeo está pensado para que se comprenda como surge la forma final. Sólo dura 1min y 16 segundos.
La macro recursiva que genera la forma es bastante sencilla y se ha implementado en un fichero include.
// hexarec.inc
// (C) Antonio Castro Snurmacher
// Licencia GPL de GNU
#declare NullObj=object{ sphere{<0,0,0>,0.00000000001} pigment {color rgb <0,0,0>} }
#macro Hexa(K, Level, T1, T2)
union{
object{
sphere {<0,0,0>, 1}
texture {T1}
}
#if (Level>0)
object{ Hexa(K, Level-1, T2, T1) scale K translate x }
object{ Hexa(K, Level-1, T2, T1) scale K translate -x }
object{ Hexa(K, Level-1, T2, T1) scale K translate y }
object{ Hexa(K, Level-1, T2, T1) scale K translate -y }
object{ Hexa(K, Level-1, T2, T1) scale K translate z }
object{ Hexa(K, Level-1, T2, T1) scale K translate -z }
#else
object {NullObj}
#end
}
#end
El programa principal que llama a esa macro recursiva, se complica algo con el fin de introducir algunas optimizaciones, sentencias para la animación y algunas mejoras estéticas. Es este:
// demo_hexarec.pov
// (C) Antonio Castro Snurmacher
// Licencia GPL de GNU
#include "hexarec.inc"
#include "colors.inc"
#include "textures.inc"
#include "shapes.inc"
#declare Oliva = pigment {color rgb <0, 0.5, 0.3>} // Verde oliva oscuro
#declare Azul = pigment {color rgb <.2, 0.6, 0.9>}
#declare AmarilloClaro = pigment {color rgb <1,1, 0.6>}
#declare RojoOscuro = pigment {color rgb <.7, 0, 0.1>} // Rojo oscuro
#declare Blanco = pigment {color rgb <.9,.9,.95>} // Blanco azulado
#declare Textu1=texture{
pigment {RojoOscuro}
finish{
reflection .4
ambient 0.2
diffuse 0.4
phong .4
phong_size 40
}
}
#declare Textu2=texture{
pigment {Blanco}
finish{
reflection 0
ambient 0.3
diffuse 0.7
phong .5
phong_size 20
}
}
#declare Textu3=texture{
pigment {AmarilloClaro}
finish{
reflection 0
ambient 0.3
diffuse 0.7
phong .5
phong_size 20
}
}
#declare Textu4=texture{
pigment {Azul}
finish{
reflection .6
ambient 0.1
diffuse 0.3
}
}
#declare Luz=light_source { <30, 40, -60> color White }
#declare CameraUp= camera {
location <0, 10, -40>
look_at <0,0,0>
angle 65
// AspectRatio debe declararse en el '.ini'
// Su valor es el ancho/alto y normalmente valdrá 16/9 o 4/3
right AspectRatio*x
}
/**
Pensado para clock 1..1900
pov.py demo_hexarec t 11 11 1 1900 1 1900
**/
// En el intervalo de clock de 0 a 1000 va aumentando la recursividad luego ya no.
#declare Clock1 = clock/2000;
#declare Clock2=clock/2;
global_settings { charset utf8 }
#declare FontSize = 3;
#declare FonTTF = "aa_cooperbt.ttf"
#declare texto="CIBERDROIDE.COM"
#declare Clock3 = clock -1000;
#if (Clock3<0)
#declare Clock3=0;
#end
#if (Clock3>0)
#declare PosText=19-(Clock3/12);
text { ttf FonTTF texto 1, 0
texture { Textu4 }
scale FontSize
translate
}
text { ttf FonTTF texto 1, 0
texture { Textu3 }
scale
translate
}
#end
/** Ajustar la recursividad al nivel de detalle requerido para
acelerar los primeros fotogramas. **/
#declare K=7;
#if (Clock1>.5)
#declare Clock1=.5;
#end
#if (Clock1<.4)
#declare K=6;
#end
#if (Clock1<.3)
#declare K=5;
#end
#if (Clock1<.2)
#declare K=4;
#end
#if (Clock1<.1)
#declare K=3;
#end
object{
Hexa(Clock1, K, Textu1, Textu2) /** LLAMADA A LA MACRO RECURSIVA **/
rotate y*Clock2
scale 8
}
camera {CameraUp}
Luz
El fichero ttf con la fuente "aa_cooperbt.ttf" no se proporciona, pero se puede usar cualquier fuente ttf.
Es la primera vez que usamos en la primitiva text. Como puedes ver en el fuente, su uso es trivial, y no hay ninguna otra cuestión técnica que hayamos mencionado anteriormente. En cualquier caso si tienes dudas no tienes más que preguntar aquí en los comentarios.