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.
MCC900
Googleando aleatoriamente, buscando material sobre fractales en 3d me encontré con esto. Sé que es viejo, pero me pareció muy interesante, y por cierto muy bonito! Y pensé en comentar.
Hace unos días que vengo retomando el hobbie de hacer fractales en 3d basados. Mi idea ahore es hacerlos basados en rotación, en Povray; pero lo más que he logrado es esto, y esta imagen es ya de hace bastante tiempo:
http://i1034.photobucket.com/albums/a421/MCC900/Graphics%20Art/KochCube2.jpg
El Cristal de MCC, o Cubo de Koch. 😉
El tuyo es definitivamente mas bonito… las esferas en vez de cubos le dan un toque muy bueno.
Se aprecia como las esferas más pequeñas en cada cara del octaedro forman una figura muy parecida a la pirámide de Sierpinski.
Muy bueno!
Me likes.
Antonio Castro
MCC900, Suponía que ya estaba inventado, es casi igual que lo que se me ocurrió a mí. Nunca había oído hablar del Cubo de Koch. Gracias por tu aportación.
Mario Antonio Herrero Machado
Felicitaciones Antonio. Gracias por la explicación tan detallada. Saludos.