// Last edited on 2013-12-11 11:25:27 by stolfilocal // Processed by remove-cam-lights background{ color rgb < 0.0, 0.50, 0.72 > } #declare tx_polvo = texture { pigment { color rgb < 0.73, 0.32, 0.73 > } finish { diffuse 0.8 ambient 0.1 specular 0.30 roughness 0.05 } } #declare num_bolas = 20; #declare bola = sphere { < 0, 0, 0 > 1 texture { tx_polvo } } #macro interpolar(p0, p1, tt) ((1-tt)*p0+tt*p1) #end #macro bezier(p0, dp0, p3, dp3, tt) #local p01=interpolar(p0, p0+dp0, tt); #local p12=interpolar(p0+dp0, p3-dp3, tt); #local p23=interpolar(p3-dp3, p3, tt); #local p012=interpolar(p01, p12, tt); #local p123=interpolar(p12, p23, tt); interpolar(p012, p123, tt) #end #macro tentaculo(base, d_base, meio, d_meio, ponta, d_ponta, raio_base, raio_ponta) union { #local tt=0; #while (tt<=1) object { bola scale bezier(raio_base, 0, raio_ponta, 0, tt/2) translate bezier(base, d_base, meio, d_meio, tt) } #local tt=tt+1/(num_bolas-1); #end #local tt=0; #while (tt<=1) object { bola scale bezier(raio_base, 0, raio_ponta, 0, 0.5+tt/2) translate bezier(meio, d_meio, ponta, d_ponta, tt) } #local tt=tt+1/(num_bolas-1); #end } #end #declare param1=array[5]; #declare param1[0]=<0,2,1>; #declare param1[1]=<0,3,0>; #declare param1[2]=<0,1,+1>; #declare param1[3]=<0,5,0>; #declare param1[4]=<0,1,-1>; #declare param2=array[5]; #declare param2[0]=<0,1,1>; #declare param2[1]=<0,3,0>; #declare param2[2]=<0,1,-2>; #declare param2[3]=<0,5,0>; #declare param2[4]=<0,1,+1>; #declare param0=array[5]; #declare param0[0]=(param1[0]+param2[0])/2; #declare param0[1]=(param1[1]+param2[1])/2; #declare param0[2]=(param1[2]+param2[2])/2; #declare param0[3]=(param1[3]+param2[3])/2; #declare param0[4]=(param1[4]+param2[4])/2; #declare param3=param0; #macro bezier2(p0, p1, p2, p3, tt) #local p01=interpolar(p0, p1, tt); #local p12=interpolar(p1, p2, tt); #local p23=interpolar(p2, p3, tt); #local p012=interpolar(p01, p12, tt); #local p123=interpolar(p12, p23, tt); interpolar(p012, p123, tt); #end #declare nq = 8; //n.keyframes #declare nt = 8; //n.tentaculos #declare np = 5; //n.parametros por tentaculo #declare d = array[nq+1]; //tempo de cada keyframe #declare q = array[nq+1][nt][np]; //param. de cada tentaculo em cada keyframe #declare d[0] = 0; #declare d[1] = 0.1; #declare d[2] = 0.25; #declare d[3] = 0.3; #declare d[4] = 0.5; #declare d[5] = 0.7; #declare d[6] = 0.8; #declare d[7] = 0.9; #declare d[nq] = 1; #macro extrai_parametros(key,tent,param) #local i = 0; #while (i<5) #declare q[key][tent][i]= param[i]; #local i = i+1; #end #end #macro copia_tentaculos(key,t1,t2) #local i = 0; #while (i<5) #declare q[key][t2][i]= q[key][t1][i]; #local i = i+1; #end #end #macro copia_cena(key1,key2) #local nte = 0; #while (nte < 8) #local i = 0; #while (i<5) #declare q[key2][nte][i]= q[key1][nte][i]; #local i = i+1; #end #local nte = nte+1; #end #end extrai_parametros(0,0,param0) extrai_parametros(0,1,param1) extrai_parametros(0,2,param2) extrai_parametros(0,3,param3) copia_tentaculos(0,0,4) copia_tentaculos(0,1,5) copia_tentaculos(0,2,6) copia_tentaculos(0,3,7) extrai_parametros(1,0,param1) extrai_parametros(1,1,param2) extrai_parametros(1,2,param3) extrai_parametros(1,3,param0) copia_tentaculos(1,0,4) copia_tentaculos(1,1,5) copia_tentaculos(1,2,6) copia_tentaculos(1,3,7) extrai_parametros(2,0,param2) extrai_parametros(2,1,param3) extrai_parametros(2,2,param1) extrai_parametros(2,3,param0) copia_tentaculos(2,0,4) copia_tentaculos(2,1,5) copia_tentaculos(2,2,6) copia_tentaculos(2,3,7) extrai_parametros(3,0,param3) extrai_parametros(3,1,param0) extrai_parametros(3,2,param1) extrai_parametros(3,3,param2) copia_tentaculos(3,0,4) copia_tentaculos(3,1,5) copia_tentaculos(3,2,6) copia_tentaculos(3,3,7) copia_cena(0,4) copia_cena(1,5) copia_cena(2,6) copia_cena(3,7) copia_cena(0,8) #macro polvo_quadro(qi) union { object { tentaculo(< 0, 0, 0 >, < 0, 0, 0.1 >, < 0, 0, 0.2 >, < 0, 0, 0.5 >, < 0, 0, 1.2 >, < 0, 0, 0.1 >, 5/8, 7/8) } #local i = 0; #while (i < 8) object { tentaculo(<0,0,0>,qi[i][0],qi[i][1],qi[i][2],qi[i][3],qi[i][4],pi/8,pi/16) translate < 0, 1, 0 > rotate < 0, 0, i * 360/8 > } #local i = i + 1; #end } #end #macro polvo_animado(tempo) #if(tempo=d[0]) #local i = 0; #end #if(tempo>d[0] & tempo<=d[1]) #local i = 1; #end #if(tempo>d[1] & tempo<=d[2]) #local i = 2; #end #if(tempo>d[2] & tempo<=d[3]) #local i = 3; #end #if(tempo>d[3] & tempo<=d[4]) #local i = 4; #end #if(tempo>d[4] & tempo<=d[5]) #local i = 5; #end #if(tempo>d[5] & tempo<=d[6]) #local i = 6; #end #if(tempo>d[6]) #local i = 7; #end #local qtempo=array[nt][np]; #local j = 0; #while(j; union{ object { polvo_animado(clock) translate pos_polvo } } #include "camlight.inc" #declare centro_cena = pos_polvo; #declare raio_cena = 8; #declare dir_camera = < 0.5, -1, 0.3 >; #declare dist_camera = 100.0; #declare intens_luz = 1.00; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)