// Spider, by Jonathan Rafael Ghiglia jrg_pov@hotmail.com May/June 2001 // Megapov -> Povray adaptation, diverse modifications // (textures, face, fangs) and animation by Oliver Knill, Oct 2001 #default {finish {ambient 0}} global_settings { max_trace_level 15 } camera { location <0,5,-20> right <1,0,0> up <0,1,0> look_at <0,-5,20>} light_source { <50, 40, -50> rgb <1, .98, .95>*2.5 } background { rgb<1,1,1> } #macro lat_blob (lat_array,rad_array,tr_array,res,max_ran,thres,RS) #declare num = dimension_size (lat_array,1); #declare step = 360/res; #declare jj=0; blob { threshold thres #while (jj<360) #declare i=0; #while (i,,rag rotate (max_rot*rand(RS)-max_rot*rand(RS)+30)*z translate rotate (a+ran*(360/n_step*rand(RS)-360/n_step*rand(RS)))*y translate ran*(l_path/_steps*rand(RS)-l_path/_steps*rand(RS))*y } #declare a=a+360/n_step; #end #declare h=h+l_path/_steps; #end } #end #macro segmento (l_s,r1,r2,sl1,sl2,stps,max_r,RS) lathe { cubic_spline stps+3 <-r1*sl1,0> <0,0> #declare liv=-l_s/stps; #declare n=1; #while (n #declare n=n+1; #declare liv=n*(-l_s/stps); #end <0,-l_s> <-r2*sl2,-l_s> sturm } #end #macro haired_leg (l,rzz,sl_s,stps,max_r,myangle1,myangle2,myangle3,lung,rag,_steps,n_step,max_ran_l,max_rot,ran,RS,tzz,t_f) #declare l1=l[0]; #declare l2=l[1]; #declare l3=l[2]; union { object { segmento (l1,rzz[0],rzz[1],sl_s[0],sl_s[1],stps,max_r,RS) rotate 90*x rotate myangle1*x texture {tzz translate (l1+l2+l3)*rand(RS)}} object {fiber (lung,rag,l1*.95,rzz[0],rzz[1],_steps,n_step,max_ran_l,max_rot,ran,RS) translate 0.025*l1*y rotate -90*x rotate myangle1*x texture {t_f translate (l1+l2+l3)*rand(RS)}} sphere {0,rzz[1] translate -l1*z rotate myangle1*x texture {tzz translate (l1+l2+l3)*rand(RS)}} object { segmento (l2,rzz[2],rzz[3],sl_s[2],sl_s[3],stps,max_r,RS) rotate 90*x rotate myangle2*x translate -l1*z rotate myangle1*x texture {tzz translate (l1+l2+l3)*rand(RS)}} object {fiber (lung,rag,l2*.95,rzz[2],rzz[3],_steps,n_step,max_ran_l,max_rot,ran,RS) translate 0.025*l2*y rotate -90*x rotate myangle2*x translate -l1*z rotate myangle1*x texture {t_f translate (l1+l2+l3)*rand(RS)}} sphere {0,rzz[3] translate -l2*z rotate myangle2*x translate -l1*z rotate myangle1*x texture {tzz translate (l1+l2+l3)*rand(RS)}} object { segmento (l3,rzz[4],rzz[5],sl_s[4],sl_s[5],stps,max_r,RS) rotate 90*x rotate myangle3*x translate -l2*z rotate myangle2*x translate -l1*z rotate myangle1*x texture {tzz translate (l1+l2+l3)*rand(RS)}} object {fiber (lung,rag,l3*3/4*.95,rzz[4],rzz[5],_steps,n_step,max_ran_l,max_rot,ran,RS) translate 0.025*l3*3/4*y rotate -90*x rotate myangle3*x translate -l2*z rotate myangle2*x translate -l1*z rotate myangle1*x texture {t_f translate (l1+l2+l3)*rand(RS)}} } #end #declare t_metal = texture { wrinkles scale 0.1 texture_map { [0 pigment { rgb <.0,.0,0.0>} finish {ambient 0 diffuse 0.2 reflection 0.6*<.9,.93,1> metallic specular 2 roughness 0.007 } normal {dents 0.35 scale 0.15}] [1 pigment {rgb <.05,.05,.215>} finish {ambient 0 diffuse 0.3 reflection 0.3*<.85,.85,.915> metallic specular 1 roughness 0.02 } normal {dents 0.5 scale 0.05}]} scale 4} #declare r_metal = texture { wrinkles scale 0.1 texture_map { [0 pigment { rgb <1.0,1.0,0.0>} finish {ambient 0 diffuse 0.2 reflection 0.6*<.9,.93,1> metallic specular 2 roughness 0.007 } normal {dents 0.35 scale 0.05}] [1 pigment {rgb <1,0.0,0.0>} finish {ambient 0 diffuse 0.3 reflection 0.3*<.85,.85,.915> metallic specular 1 roughness 0.02 } normal {dents 0.5 scale 0.01}]} scale 4} #declare g_metal = texture { wrinkles scale 0.1 texture_map { [0 pigment { rgb <0.0,1.0,1.0>} finish {ambient 0 diffuse 0.2 reflection 0.6*<.9,.93,1> metallic specular 2 roughness 0.007 } normal {dents 0.35 scale 0.05}] [1 pigment {rgb <0,0.1,0.0>} finish {ambient 0 diffuse 0.3 reflection 0.3*<.85,.85,.915> metallic specular 1 roughness 0.02 } normal {dents 0.5 scale 0.01}]} scale 4} #declare w_metal = texture { wrinkles scale 0.1 texture_map { [0 pigment { rgb <1.0,1.0,1.0>} finish {ambient 0 diffuse 0.2 reflection 0.6*<.9,.93,1> metallic specular 2 roughness 0.007 } normal {dents 0.35 scale 0.05}] [1 pigment {rgb <1,0.0,0.0>} finish {ambient 0 diffuse 0.3 reflection 0.3*<.85,.85,.915> metallic specular 1 roughness 0.02 } normal {dents 0.5 scale 0.01}]} scale 4} //-----abdomen //-----lathe-blob coordinates #declare ad_a = array[10] #declare ad_a[0]=*0.5; #declare ad_a[1]=*0.5; #declare ad_a[2]=*0.5; #declare ad_a[3]=*0.5; #declare ad_a[4]=*0.5; #declare ad_a[5]=*0.5; #declare ad_a[6]=*0.5; #declare ad_a[7]=*0.5; #declare ad_a[8]=*0.5; #declare ad_a[9]=*0.5; //-------shearing amounts #declare tr_ad = array[10] #declare tr_ad[0]=0.3; #declare tr_ad[1]=0.2; #declare tr_ad[2]=0.1; #declare tr_ad[3]=0.0; #declare tr_ad[4]=0; #declare tr_ad[5]=0.0; #declare tr_ad[6]=0.0; #declare tr_ad[7]=0.21; #declare tr_ad[8]=0.31; #declare tr_ad[9]=0.4; //---------blob components radii #declare ra_ad = array[10] #declare ra_ad[0] = 0.5; #declare ra_ad[1] = 0.5; #declare ra_ad[2] = 0.5; #declare ra_ad[3] = 0.5; #declare ra_ad[4] = 0.5; #declare ra_ad[5] = 0.5; #declare ra_ad[6] = 0.5; #declare ra_ad[7] = 0.5; #declare ra_ad[8] = 0.45; #declare ra_ad[9] = 0.42; #declare belly= object { lat_blob (ad_a,ra_ad,tr_ad,10,0.05,0.5,seed(1)) rotate -90*z scale <1,0.53,.65>*3.2 texture {g_metal} translate <4.6,2.5,0> } //------legs // for the animation, we reseed the random number generator // depending on time #declare RS1=seed(floor(234134*clock)); #macro RR(a) 2*a*rand(RS1)-a #end //-----lathe coordinates #declare a_rzz= array[6] #declare a_rzz[0]= .35; #declare a_rzz[1]=.25;//.18; #declare a_rzz[2]=.25;//.18; #declare a_rzz[3]=.18;//.09; #declare a_rzz[4]= .18;//.09; #declare a_rzz[5]=.1;//.05; //-------slope values for start/end lathe splines #declare a_szz=array[6] #declare a_szz[0]=5; #declare a_szz[1]=8; #declare a_szz[2]=8; #declare a_szz[3]=10; #declare a_szz[4]=10; #declare a_szz[5]=10; //-------legs relative positions #declare myangle=array[8][4] #declare myangle[0][0]= 60; #declare myangle[0][1]=-74; #declare myangle[0][2]=-77; #declare myangle[0][3]=-50; #declare myangle[1][0]= 68; #declare myangle[1][1]=-80; #declare myangle[1][2]=-60; #declare myangle[1][3]=-35; #declare myangle[2][0]= 58; #declare myangle[2][1]=-75; #declare myangle[2][2]=-53; #declare myangle[2][3]= 45; #declare myangle[3][0]= 60; #declare myangle[3][1]=-65; #declare myangle[3][2]=-60; #declare myangle[3][3]= 65; #declare myangle[4][0]= 70; #declare myangle[4][1]=-75; #declare myangle[4][2]=-60; #declare myangle[4][3]= 70; #declare myangle[5][0]= 68; #declare myangle[5][1]=-86; #declare myangle[5][2]=-80; #declare myangle[5][3]= 40; #declare myangle[6][0]= 67; #declare myangle[6][1]=-72; #declare myangle[6][2]=-65; #declare myangle[6][3]=-35; #declare myangle[7][0]= 63; #declare myangle[7][1]=-80; #declare myangle[7][2]=-58; #declare myangle[7][3]=-70; // for the animation, we modify the leg angles // randomly #declare i=0; #while (i<8) #declare j=0; #while (j<4) #declare myangle[i][j]=myangle[i][j]+RR(10); #declare j=j+1; #end #declare i=i+1; #end #declare dist=0.6; // distance between two legs #declare c_d=0.7; // distance between legs and the centre of abdomen #declare legs= union { #declare zz=1; #while (zz<=8) #declare a_l=array[3] #declare a_l[0]=4; #declare a_l[1]=4; #declare a_l[2]=4; object { haired_leg ( a_l, a_rzz, // rzz, a_szz, 10, 0.01, myangle[zz-1][0], // myangle1, myangle[zz-1][1], // myangle2, myangle[zz-1][2], // myangle3, 0.13, // lung, length of hair 0.020, // rag, radius of hair component (cylinder) 20, // steps, hair steps per leg segment 10, // n_step, hairs per hair step 0.02, // max_ran_l, random length 5, // max_rot, random rotation 0.6, // ran, randomness seed(zz*1000), // RS, t_metal, // texture of leg w_metal // texture of hair ) #if (zz<5) rotate myangle[zz-1][3]*y translate <3/2*dist-(zz-1)*dist,0,-c_d> #else rotate (180+myangle[zz-1][3])*y translate <3/2*dist-(zz-5)*dist,0,c_d> #end} #declare zz=zz+1; #end translate 1.5*y} //---------head and chest //---------lathe-blob coordinates #declare ce_a = array[10] #declare ce_a[0]=*0.5; #declare ce_a[1]=*0.5; #declare ce_a[2]=*0.5; #declare ce_a[3]=*0.5; #declare ce_a[4]=*0.5; #declare ce_a[5]=*0.5; #declare ce_a[6]=*0.5; #declare ce_a[7]=*0.5; #declare ce_a[8]=*0.5; #declare ce_a[9]=*0.5; //--------shearing amounts #declare tr_ce = array[10] #declare tr_ce[0]=0.1; #declare tr_ce[1]=0.1; #declare tr_ce[2]=0.1; #declare tr_ce[3]=0.0; #declare tr_ce[4]=-0.05; #declare tr_ce[5]=-0.2; #declare tr_ce[6]=0.0; #declare tr_ce[7]=0.; #declare tr_ce[8]=0.; #declare tr_ce[9]=0.; //----------blob components radii #declare ra_ce = array[10] #declare ra_ce[0] = 0.5; #declare ra_ce[1] = 0.5; #declare ra_ce[2] = 0.5; #declare ra_ce[3] = 0.5; #declare ra_ce[4] = 0.5; #declare ra_ce[5] = 0.35; #declare ra_ce[6] = 0.5; #declare ra_ce[7] = 0.5; #declare ra_ce[8] = 0.5; #declare ra_ce[9] = 0.5; #declare body= difference{ union { object{ lat_blob (ce_a,ra_ce,tr_ce,10,0.05,0.5,seed(1)) rotate -90*z scale 2*<1,0.8,0.75> translate <0.1,2.3,0> texture {t_metal} } object{ sphere { <-1.8,2.0,0.0>,0.5 } texture {r_metal} } } object{ sphere { 0,0.4 } scale <1,0.4+0.4*clock,1> translate <-2.1,2.0,0.0> rotate z*5 texture {r_metal} } } #declare eyes= union { sphere {0,1 scale 0.19 translate <-1.5,-0.5,-0.25>} sphere {0,1 scale 0.19 translate <-1.5,-0.5,0.25>} sphere {0,1 scale 0.19 translate <-1.1,-0.25,-0.4>} sphere {0,1 scale 0.19 translate <-1.1,-0.25,0.4>} sphere {0,1 scale 0.19 translate <-0.7,0.05,0.3>} sphere {0,1 scale 0.19 translate <-0.7,0.05,-0.3>} texture {r_metal} translate <-0.3,3.1,0> } // macros to replace megopov feature #macro sphere_sweep(PP,QQ,rr,ss,KK) #declare kk=0; #while (kk<=KK) sphere{PP+(kk/KK)*(QQ-PP),rr+(kk/KK)*(ss-rr)} #declare kk=kk+1; #end #end #macro sphere_four_sweep(P,Q,R,S,p,q,r,s,KK) union{ sphere_sweep(P,Q,p,q,KK) sphere_sweep(Q,R,q,r,KK) sphere_sweep(R,S,r,s,KK) } #end #declare fangs= #union { object { sphere_four_sweep(<0,0,0>,<-1,0.7,0>,<-1.5,-0.5,-0.1*clock>,<-2.1,-1.2,-0.3*clock>,0.4,0.25,0.1,0.0,50) texture {t_metal} rotate -10*y scale 0.7 translate <-1.8,2,-.3> } object{ sphere_four_sweep(<0,0,0>,<-1,0.7,0>,<-1.5,-0.5,+0.1*clock>, <-2.1,-1.2,0.3*clock>,0.4,0.25,0.1,0.0,50) texture {t_metal} rotate 10*y scale 0.7 translate <-1.8,2,.3> } } #declare spider= union{ object {belly} object {body} object {legs} object {eyes} object {fangs} } //object {spider rotate -y*50 rotate -x*70} // view from above //object {spider rotate -y*90 rotate x*0 translate <0,3.1,-16>} // near mouth object {spider rotate -y*(50+(40*clock)) rotate x*(70-70*clock) translate clock*<0,3.1,-18>} // animate