// Persistence of Vision Ray Tracer Scene Description File // File: jenga.pov // Vers: 3.5 // Desc: macro to build a jenga tower // Date: 13/01/2003 // Auth: Bruno Gimeno #version 3.5; #include "rad_def.inc" #include "colors.inc" #include "functions.inc" #include "textures.inc" #include "woods.inc" #include "woodmaps.inc" #include "logo.inc" #include "shapes.inc" global_settings { assumed_gamma 1.0 radiosity { Rad_Settings(Radiosity_OutdoorLight, off,off) } } // ---------------------------------------- camera { location <5.0, 35, -45.0> direction 1.5*z right x*image_width/image_height look_at <12.0, 9.0, 0.0> } sky_sphere { pigment { Gray30 } } light_source { <0, 0, 0> color rgb <1,1,1> translate <-700, 600, -10> } plane {y,0 pigment {White} } /* light_source { 0*x color rgb 1.0 area_light <4, 0, 0> <0, 0, 4> 5, 5 adaptive 3 jitter circular orient translate <-700, 600, -10> } isosurface { function { f_snoise3d(x*2.5,y*10,z*2.5) } contained_by { box { <-40,-10,-20>,<110,0,200> } } accuracy 0.0001 max_gradient 14.442 //evaluate 14.442,10.000,0.95 texture { pigment {White} } } */ //------------------------------------------------------------------------------ #macro PIECE(piece_lenght,random) union { #local RND_1 = seed (random) ; object {Round_Box(<-3,-.5,-0.95>,<3,.5,0.95>,.07,on) texture {T_Wood23 finish {metallic 0.3} rotate y*90 translate rotate <0,rand(RND_1)*5,rand(RND_1)*50> scale piece_lenght/3 } } object { Povray_Logo scale .35 translate <-2.25,0,-.925> texture {T_Wood12 rotate y*10} } object { text { ttf "timrom.ttf" "Pov-Ray" 1,0 } translate <-piece_lenght*.2916,-piece_lenght*.05,-piece_lenght*.159> scale <1,0.75,1> texture {T_Wood12 rotate y*10} } object { text { ttf "timrom.ttf" "Pov-Ray" 1,0 } translate <-piece_lenght*.2916,-piece_lenght*.05,-piece_lenght*.159> scale <1,0.75,1> rotate y*180 texture {T_Wood12 rotate y*10} } } #end //------------------------------------------------------------------------------ #macro PIECES2(piece_lenght,random) #local RND_3 = seed(random) ; #switch (rand(RND_3)) #range (0,0.2) // ficha acostada sobre ficha acostada - extremo union { object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end } object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end rotate -z*degrees(asin(0.5/(piece_lenght*.5))) translate x*piece_lenght*.5 #if (rand(RND_3)>.5) rotate y*20*rand(RND_3) #else rotate -y*20*rand(RND_3) #end translate x*piece_lenght*.5 translate y*.5 #if (rand(RND_3)>.5) translate z*rand(RND_3)*(piece_lenght/6) #else -z*rand(RND_3)*(piece_lenght/6) #end } translate -x*piece_lenght*.5 #if (rand(RND_3)>.5) rotate y*180 #else #end } #break #range (0.201,0.5) // ficha acostada sobre ficha acostada - canto union { object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end } object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end rotate y*90 rotate -x*degrees(asin(0.5/(piece_lenght*.5))) translate -z*piece_lenght*.5 #if (rand(RND_3)>.5) rotate y*20*rand(RND_3) #else rotate -y*20*rand(RND_3) #end translate -z*(piece_lenght/6.2) translate y*.5 #if (rand(RND_3)>.5) translate x*piece_lenght*0.4*rand(RND_3) #else translate -x*piece_lenght*0.4*rand(RND_3) #end } translate z*(piece_lenght/6)*2.5 #if (rand(RND_3)>.5) rotate y*180 #else #end } #break #range (0.501,0.6) // ficha de canto sobre ficha acostada - extremo union { object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end } object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end rotate x*90 rotate -z*degrees(asin(1/(piece_lenght))) translate x*piece_lenght*.5 #if (rand(RND_3)>.5) rotate y*20*rand(RND_3) #else rotate -y*20*rand(RND_3) #end translate x*piece_lenght*.5 translate y*1 #if (rand(RND_3)>.5) translate z*rand(RND_3)*(piece_lenght/6) #else -z*rand(RND_3)*(piece_lenght/6) #end } translate z*(piece_lenght/6)*2.5 #if (rand(RND_3)>.5) rotate y*180 #else #end } #break #range (0.601,0.8) // ficha de canto sobre ficha acostada - canto union { object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end } object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end rotate x*90 rotate y*90 rotate -x*degrees(asin(1/(piece_lenght))) translate -z*piece_lenght*.5 #if (rand(RND_3)>.5) rotate y*20*rand(RND_3) #else rotate -y*20*rand(RND_3) #end translate -z*(piece_lenght/6) translate y*1 #if (rand(RND_3)>.5) translate x*rand(RND_3)*(piece_lenght/6) #else -x*rand(RND_3)*(piece_lenght/6) #end } translate z*(piece_lenght/6)*2.5 #if (rand(RND_3)>.5) rotate y*180 #else #end } #break #range (0.801,1) // ficha de canto sobre ficha de canto - extremo union { object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end rotate x*90 } object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end rotate x*90 rotate y*90 translate y*.5 translate z*piece_lenght*.5 rotate -x*degrees(asin(2/6)) #if (rand(RND_3)>.5) rotate y*20*rand(RND_3) #else rotate -y*20*rand(RND_3) #end translate -z*sqrt((pow(piece_lenght,2))+(pow(piece_lenght/3,2))) translate z*piece_lenght*.1 translate -y*.5 #if (rand(RND_3)>.5) translate x*rand(RND_3)*piece_lenght*.35 #else -x*rand(RND_3)*piece_lenght*.35 #end } #if (rand(RND_3)>.5) rotate y*180 #else #end translate y*.5 } #break /* #range (0.3,0.4) // ficha de canto sobre ficha de canto - canto #break #range (0.2,0.3) // ficha acostada sobre ficha de canto - extremo #break #range (0.3,0.4) // ficha acostada sobre ficha de canto - canto #break #range (0,1) // ficha tumbada sobre ficha tumbada - sin tocar el suelo union { object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end #if (rand(RND_3)>.5) rotate y*30*rand(RND_3) #else rotate y*-30*rand(RND_3) #end } object {PIECE(piece_lenght,random) #if (rand(RND_3)>.5) rotate z*180 #else #end #if (rand(RND_3)>.5) rotate y*45*rand(RND_3) #else rotate y*-45*rand(RND_3) #end #if (rand(RND_3)>.5) translate x*rand(RND_3)*piece_lenght*0.15 #else translate -x*rand(RND_3)*piece_lenght*0.15 #end translate y*1 } translate -x*piece_lenght*.5 #if (rand(RND_3)>.5) rotate y*180 #else #end } #break */ #end // switch #end //------------------------------------------------------------------------------ #macro PISO(piece_lenght,random) #local RND_1 = seed (random) ; #switch (rand(RND_1)) #range (0,1/5) union { object {PIECE(piece_lenght,random*(rand(RND_1)*20)) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-(piece_lenght*0.04166)*rand(RND_1) #end translate z*(piece_lenght/3)} object {PIECE(piece_lenght,random*(rand(RND_1)*20)) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-(piece_lenght*0.04166)*rand(RND_1) #end } object {PIECE(piece_lenght,random*(rand(RND_1)*20)) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-(piece_lenght*0.04166)*rand(RND_1) #end translate z*-(piece_lenght/3) } #if (rand(RND_1)>.5) rotate y*3*rand(RND_1) #else rotate y*-3*rand(RND_1) #end } #break #range ((1/5)+0.001,2/5) union { object {PIECE(piece_lenght,random*(rand(RND_1)*20)) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) rotate y*3*rand(RND_1) #else rotate y*-3*rand(RND_1) #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-1*rand(RND_1) #end #if (rand(RND_1)>.5) translate z*(piece_lenght*0.04166)*rand(RND_1) #else translate z*-(piece_lenght*0.04166)*rand(RND_1) #end translate z*(piece_lenght/3) } object {PIECE(piece_lenght,random*(rand(RND_1)*20)) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) rotate y*3*rand(RND_1) #else rotate y*-3*rand(RND_1) #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-(piece_lenght*0.04166)*rand(RND_1) #end #if (rand(RND_1)>.5) translate z*(piece_lenght*0.04166)*rand(RND_1) #else translate z*-(piece_lenght*0.04166)*rand(RND_1) #end translate z*-(piece_lenght/3)} } #break #range ((2/5)+0.001,3/5) object {PIECE(piece_lenght,random*(rand(RND_1)*20)) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) rotate y*3*rand(RND_1) #else rotate y*-3*rand(RND_1) #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-(piece_lenght*0.04166)*rand(RND_1) #end #if (rand(RND_1)>.5) translate z*(piece_lenght*0.04166)*rand(RND_1) #else translate z*-(piece_lenght*0.04166)*rand(RND_1) #end } #break #range ((3/5)+0.001,4/5) union { object {PIECE(piece_lenght,random*(rand(RND_1)*20))translate z*(piece_lenght/3) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-(piece_lenght*0.04166)*rand(RND_1) #end } object {PIECE(piece_lenght,random*(rand(RND_1)*20)) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-(piece_lenght*0.04166)*rand(RND_1) #end } #if (rand(RND_1)>.5) rotate y*3*rand(RND_1) #else rotate y*-3*rand(RND_1) #end #if (rand(RND_1)>.5) translate z*(piece_lenght*0.04166)*rand(RND_1) #else translate z*-(piece_lenght*0.04166)*rand(RND_1) #end } #break #range ((4/5)+0.001,5/5) union { object {PIECE(piece_lenght,random*(rand(RND_1)*20)) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-(piece_lenght*0.04166)*rand(RND_1) #end } object {PIECE(piece_lenght,random*(rand(RND_1)*20)) #if (rand(RND_1)>.5) rotate z*180 #else #end #if (rand(RND_1)>.5) translate x*(piece_lenght*0.04166)*rand(RND_1) #else translate x*-(piece_lenght*0.04166)*rand(RND_1) #end translate z*-(piece_lenght/3)} #if (rand(RND_1)>.5) rotate y*3*rand(RND_1) #else rotate y*-3*rand(RND_1) #end #if (rand(RND_1)>.5) translate z*(piece_lenght*0.04166)*rand(RND_1) #else translate z*-(piece_lenght*0.04166)*rand(RND_1) #end } #break #end #end #macro torre(piece_lenght,num_pisos,random) #local num_pisos_rem = num_pisos ; #declare RND_1 = seed (random) ; union { #while (num_pisos_rem>0) object { PISO(piece_lenght,random*num_pisos_rem) translate y*-(piece_lenght/12) translate y*num_pisos_rem*(piece_lenght/6) #if (2*div(num_pisos_rem,2)=num_pisos_rem) rotate y*90 #else #end } #local num_pisos_rem = num_pisos_rem-1 ; #end } #end //------------------------------------------------------------------------------ #macro arranged_pieces (piece_lenght_ficha,anchura_suelo,profundidad_suelo,random_seed) #local RND_1 = seed (random_seed); #local RND_2 = seed (random_seed*random_seed+1) ; union { #local anchura_suelo_remanente = anchura_suelo ; #while (anchura_suelo_remanente>0) #local profundidad_suelo_remanente = profundidad_suelo ; #while (profundidad_suelo_remanente>0) object { #if (rand(RND_2)>.1) PIECE(piece_lenght_ficha,anchura_suelo_remanente-profundidad_suelo_remanente*random_seed) #else PIECES2(piece_lenght_ficha,anchura_suelo_remanente-profundidad_suelo_remanente*random_seed) #end #if (rand(RND_1)>.5) rotate y*rand(RND_1)*70 #else rotate -y*rand(RND_1)*70 #end translate y*.5 translate -x*piece_lenght_ficha*.5 translate -x*piece_lenght_ficha*anchura_suelo*1 translate x*piece_lenght_ficha*anchura_suelo_remanente*1.65 translate -z*piece_lenght_ficha*.5 translate -z*profundidad_suelo*piece_lenght_ficha*1 translate z*profundidad_suelo_remanente*piece_lenght_ficha*1.65 #if (2*div(profundidad_suelo_remanente,2)=profundidad_suelo_remanente) translate x*piece_lenght_ficha*0.75*rand(RND_2) #else #end #if (2*div(anchura_suelo_remanente,2)=anchura_suelo_remanente) translate z*piece_lenght_ficha*0.5 #else #end #if (rand(RND_1)>.4) #if (rand(RND_1)>.4) scale 0.0001 translate y*-1000 #else #end #else #end } #local profundidad_suelo_remanente = profundidad_suelo_remanente-1 ; #end #local anchura_suelo_remanente = anchura_suelo_remanente-1 ; #end } #end //------------------------------------------------------------------------------ object {torre(6,80,42) rotate y*10 translate <-30,0,14> } object {torre(6,30,81) rotate y*60 translate <-12,0,82> } object {torre(6,50,66) rotate y*-40 translate <-2,0,-7> } object {torre(6,40,70) rotate y*10 translate <13,0,45> } object {torre(6,20,12) rotate y*-30 translate <17,0,10> } object {torre(6,40,38) rotate y*20 translate <55,0,50> } arranged_pieces ( 6,// piece_lenght_ficha 25,// width 50,// deep 73// random_seed )