// Last edited on 2023-12-27 03:12:23 by stolfi background{ color rgb < 0.5, 0.5, 0.5 > } #declare branco = texture{ pigment{ color rgb < 1, 1, 1 > } finish{ diffuse 0.9 ambient 0.1 } } #declare preto = texture{ pigment{ color rgb < 0.300, 0.800, 0.000 > } finish{ diffuse 0.9 ambient 0.1 } } #declare NP=20; #declare corpo = box{ <-5,-5,-5>,<5,5,5> texture{branco} } #declare cilindro = cylinder{ <0,0,0>,<0,0,5>,1 texture{preto} } #declare cilindro2 = cylinder{ <0,0,0>,<0,0,10>,1 texture{preto} } #declare pe = sphere{ <0,0,0>,1.5 texture{branco} } #declare cabeca= sphere{ <0,0,0>,3 texture{branco} } #macro pata(a1) object{ union{ object{cilindro translate<0,0,-5>} object{pe translate<0,0,-5>} } rotate a1*y} #end #macro coxa(a1,a2) object{ union{ object{cilindro translate<0,0,-5>} object{pata(a2) translate<0,0,-5>} } rotate a1*y } #end #macro perna(a1,a2,a3,a4) object{ union{ object{cilindro translate<0,0,-5>} object{coxa(a3,a4) translate<0,0,-5>} } rotate a1*y rotate a2*z } #end #macro cranio(a1) object{ union{ object{cilindro2 } object{cabeca translate<0,0,10>} } rotate a1*y} #end #macro pescoco(a1,a2) object{ union{ object{cilindro } object{cranio(a2) translate<0,0,5>} } rotate a1*y } #end #macro nuca(a1,a2,a3,a4) object{ union{ object{cilindro } object{pescoco(a3,a4) translate<0,0,5>} } rotate a1*y rotate a2*z } #end #macro preguica(P1,P2,P3,P4,C) // vetores Pn para as pernas com quatro elementos cada representando os angulos definidos no macro perna(), idem para o vetor C representando a cabeça union{ object{corpo} object{perna(P1[0],P1[1],P1[2],P1[3]) translate<-5,-5,-5>} object{perna(P2[0],P2[1],P2[2],P2[3]) translate<-5,5,-5>} object{perna(P3[0],P3[1],P3[2],P3[3]) translate<5,-5,-5>} object{perna(P4[0],P4[1],P4[2],P4[3]) translate<5,5,-5>} object{nuca(C[0],C[1],C[2],C[3]) translate<0,0,5>} } #end #macro pos0(tt, P1,P2,P3,P4,C) // Prof #declare P1=array[4] {0,0,0,0}; // Prof #declare P2=array[4] {0,0,0,0}; // Prof #declare P3=array[4] {0,0,0,0}; // Prof #declare P4=array[4] {0,0,0,0}; // Prof #declare C=array[4] {0,0,0,0} // Prof #end #macro pos1(tt, P1,P2,P3,P4,C) #declare P1=array[4] {90+45*tt/0.125,0,-90*tt/0.125,-45*tt/0.125}; #declare P2=array[4] {90+45*tt/0.125,0,-90*tt/0.125,-45*tt/0.125}; #declare P3=array[4] {90+45*tt/0.125,180,-90*tt/0.125,-45*tt/0.125}; #declare P4=array[4] {90+45*tt/0.125,180,-90*tt/0.125,-45*tt/0.125}; #declare C=array[4] {90-90*tt/0.125,90,90,45*tt/0.125} #end #macro pos2(tt, P1,P2,P3,P4,C) #declare P1=array[4] {135,0,-90+45*(tt-0.125)/0.125,45-90*(tt-0.125)/0.125}; #declare P2=array[4] {135,0,-90+45*(tt-0.125)/0.125,45-90*(tt-0.125)/0.125}; #declare P3=array[4] {135,180,-90+45*(tt-0.125)/0.125,45-90*(tt-0.125)/0.125}; #declare P4=array[4] {135,180,-90+45*(tt-0.125)/0.125,45-90*(tt-0.125)/0.125}; #declare C=array[4] {0,90,90,45-45*(tt-0.125)/0.125} #end #macro pos3(tt, P1,P2,P3,P4,C) #declare P1=array[4] {135-45*(tt-0.25)/0.125,0,-45,-45}; #declare P2=array[4] {135-45*(tt-0.25)/0.125,0,-45,-45}; #declare P3=array[4] {135-45*(tt-0.25)/0.125,180,-45,-45}; #declare P4=array[4] {135-45*(tt-0.25)/0.125,180,-45,-45}; #declare C=array[4] {0,90,90-45*(tt-0.25)/0.125,45*(tt-0.25)/0.125} #end #macro pos4(tt, P1,P2,P3,P4,C) #declare P1=array[4] {90-90*(tt-0.375)/0.125,0,-45+45*(tt-0.375)/0.125,-45+45*(tt-0.375)/0.125}; #declare P2=array[4] {90-90*(tt-0.375)/0.125,0,-45+45*(tt-0.375)/0.125,-45+45*(tt-0.375)/0.125}; #declare P3=array[4] {90-90*(tt-0.375)/0.125,180,-45+45*(tt-0.375)/0.125,-45+45*(tt-0.375)/0.125}; #declare P4=array[4] {90-90*(tt-0.375)/0.125,180,-45+45*(tt-0.375)/0.125,-45+45*(tt-0.375)/0.125}; #declare C=array[4] {0,90,45-45*(tt-0.375)/0.125,45-45*(tt-0.375)/0.125} #end #macro pos5(tt, P1,P2,P3,P4,C) #declare P1=array[4] {0,0,0,0}; #declare P2=array[4] {0,0,0,0}; #declare P3=array[4] {0,180,0,0}; #declare P4=array[4] {0,180,0,0}; #declare C=array[4] {0,90,0,0} #end #macro empacota(A0,A1,A2,A3,A4) #local P=array[NP]; #local P[0]=A0[0]; #local P[1]=A0[1]; #local P[2]=A0[2]; #local P[3]=A0[3]; #local P[4]=A1[0]; #local P[5]=A1[1]; #local P[6]=A1[2]; #local P[7]=A1[3]; #local P[8]=A2[0]; #local P[9]=A2[1]; #local P[10]=A2[2]; #local P[11]=A2[3]; #local P[12]=A3[0]; #local P[13]=A3[1]; #local P[14]=A3[2]; #local P[15]=A3[3]; #local P[16]=A4[0]; #local P[17]=A4[1]; #local P[18]=A4[2]; #local P[19]=A4[3]; P #end #macro acha_quadro(tt,NQ,TQ) #local cont=0; #local i=0; #while((i < NQ) & (tt>=cont)) // Prof #local i=i+1; #local cont=TQ[i]; #end #local i = i - 1; // Prof i #end #macro interpola_quadros(tt,ta,Pa,tb,Pb,A0,A1,A2,A3,A4) #local s=(tt-ta)/(tb-ta); #declare A0=array[4] {(1-s)*Pa[0]+s*Pb[0],(1-s)*Pa[1]+s*Pb[1],(1-s)*Pa[2]+s*Pb[2],(1-s)*Pa[3]+s*Pb[3]}; #declare A1=array[4] {(1-s)*Pa[4]+s*Pb[4],(1-s)*Pa[5]+s*Pb[5],(1-s)*Pa[6]+s*Pb[6],(1-s)*Pa[7]+s*Pb[7]}; #declare A2=array[4] {(1-s)*Pa[8]+s*Pb[8],(1-s)*Pa[9]+s*Pb[9],(1-s)*Pa[10]+s*Pb[10],(1-s)*Pa[11]+s*Pb[11]}; #declare A3=array[4] {(1-s)*Pa[12]+s*Pb[12],(1-s)*Pa[13]+s*Pb[13],(1-s)*Pa[14]+s*Pb[14],(1-s)*Pa[15]+s*Pb[15]}; #declare A4=array[4] {(1-s)*Pa[16]+s*Pb[16],(1-s)*Pa[17]+s*Pb[17],(1-s)*Pa[18]+s*Pb[18],(1-s)*Pa[19]+s*Pb[19]}; // Prof {A1}-->{A4} #end #include "galho.inc" #macro cena(tt) #local NQ=6; #local TQ=array[NQ+1]; #local PQ=array[NQ+1]; #local A0 = array[4]{ 0,0,0,0 } #local A1 = array[4]{ 0,0,0,0 } #local A2 = array[4]{ 0,0,0,0 } #local A3 = array[4]{ 0,0,0,0 } #local A4 = array[4]{ 0,0,0,0 } #local TQ[0]=0.00; // #local PQ[0]=empacota(/* inserir angulos do quadro 0*/ ) // pos0(tt, A0,A1,A2,A3,A4) #local PQ[0] = empacota(A0,A1,A2,A3,A4) #local TQ[1]=0.16; // #local PQ[1]=empacota(/* inserir angulos do quadro 1*/ ) pos1(tt, A0,A1,A2,A3,A4) #local PQ[1] = empacota(A0,A1,A2,A3,A4) #local TQ[2]=0.32; // #local PQ[2]=empacota(/* inserir angulos do quadro 2*/ ) pos2(tt, A0,A1,A2,A3,A4) #local PQ[2] = empacota(A0,A1,A2,A3,A4) #local TQ[3]=0.48; // #local PQ[3]=empacota(/* inserir angulos do quadro 3*/ ) pos3(tt, A0,A1,A2,A3,A4) #local PQ[3] = empacota(A0,A1,A2,A3,A4) #local TQ[4]=0.64; // #local PQ[4]=empacota(/* inserir angulos do quadro 4*/ ) pos4(tt, A0,A1,A2,A3,A4) #local PQ[4] = empacota(A0,A1,A2,A3,A4) #local TQ[5]=0.80; // #local PQ[5]=empacota(/* inserir angulos do quadro 5*/ ) pos5(tt, A0,A1,A2,A3,A4) #local PQ[5] = empacota(A0,A1,A2,A3,A4) #local TQ[6]=1.00; #local PQ[6] = PQ[0] // Prof #local k=acha_quadro(tt,NQ,TQ); #debug concat("!! tt = ", str(tt,0,3), " k = ", str(k,0,0), "\n") interpola_quadros(tt,TQ[k],PQ[k],TQ[k+1],PQ[k+1],A0,A1,A2,A3,A4) #local rob = object{preguica(A0,A1,A2,A3,A4)}; #local Lg = 4.0; // Deslocamento por ciclo -- Prof union{ object{ rob } object{ galho( < 0, -Lg/2, -10>, < 0, +Lg/2, -10 >, 1.5, 0 ) } // Prof } #end #include "eixos.inc" // object{ eixos(10) } cena(clock) #include "camlight.inc" #declare centro_cena = < 0 ,0, 3>; #declare raio_cena = 35; #declare dir_camera = < 2, 2, 2>; #declare dist_camera = 5*raio_cena; #declare intens_luz = 1.20; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)