// Exercicio 7 - MC930 // Last edited on 2003-05-29 20:52:39 by stolfi // Nilton Volpato - RA 003243 // O primeiro passo #include "colors.inc" #include "textures.inc" #include "stones.inc" #background { color rgb <1.00, 0.70, 0.50> } // Luzes, Câmeras, ... light_source { 10*< 0.00, 20.00, -30.00 > color rgb 1.1*< 1, 1, 1 > rotate <0,30,0> } light_source { 10*< 0.00, 20.00, -30.00 > color rgb 0.9*< 1, 1, 1 > rotate <0,160,0> } camera { location 1.1*<-40,5,-20> right <1,0,0> up <0,1,0> sky y look_at <0,2.5,0> } global_settings { assumed_gamma 1.0 } //---------------------------------------------- // Parâmetros da Animação // Número de Passos #declare numpassos = 3; #declare clock1 = numpassos*clock - floor(numpassos*clock); // Altura do Corpo //#declare deltah = 0.5*(0.5*cos( 6*clock1*pi ) - 0.5); #switch (clock1) #range (0, 4/13) #declare deltah = clock1/(4/13); #break #range (4/13, 7/13) #declare deltah = 1 - (clock1-4/13)/(7/13-4/13); #break #range (7/13, 10/13) #declare deltah = (clock1 - 7/13)/(10/13-7/13); #break #range (10/13, 13/13) #declare deltah = 1 - (clock1 - 10/13)/(1-10/13); #break #end #declare deltah = -0.5*deltah; // Ângulos das pernas // -------------------------------------------------------- // t1_dir // t2_dir // t3_dir #switch (clock1) #range (0, 4/13) #declare clk = clock1/(4/13); #declare t1_dir = 30 + 10*clk; #declare t2_dir = 90 - 50*clk; #declare t3_dir = 15 - 15*clk; #break #range (4/13, 7/13) #declare clk = (clock1-4/13)/(7/13-4/13); #declare t1_dir = 40 - 40*clk; #declare t2_dir = 40 - 40*clk; #declare t3_dir = 10*clk; #break #range (7/13, 10/13) #declare clk = (clock1-7/13)/(10/13-7/13); #declare t1_dir = -40*clk; #switch (clk) #range (0,1/2) #declare t2_dir = -10* ( clk/(1/2) ); #break #range (1/2,1) #declare t2_dir = -10 + 10* ( (clk-1/2)/(1/2) ); #break #end #declare t3_dir = 10 - 10*clk; #break #range (10/13, 13/13) #declare clk = (clock1-10/13)/(1-10/13); #declare t1_dir = -40 + 70*clk; #declare t2_dir = 90*clk; #declare t3_dir = 15*clk; #break #else #error "Nao deveria chegar aqui!" #end // t1_esq // t2_esq // t3_esq #switch (clock1) #range (0, 3/13) #declare clk = clock1/(3/13); #declare t1_esq = -40*clk; #switch (clk) #range (0,1/2) #declare t2_esq = -10* ( clk/(1/2) ); #break #range (1/2,1) #declare t2_esq = -10 + 10* ( (clk-1/2)/(1/2) ); #break #end #declare t3_esq = 10 - 10*clk; #break #range (3/13, 6/13) #declare clk = (clock1-3/13)/(6/13-3/13); #declare t1_esq = -40 + 70*clk; #declare t2_esq = 0 + 90*clk; #declare t3_esq = 15*clk; #break #range (6/13, 10/13) #declare clk = (clock1-6/13)/(10/13-6/13); #declare t1_esq = 40 + 10*clk; #declare t2_esq = 90 - 50*clk; #declare t3_esq = 15 - 15*clk; #break #range (10/13, 13/13) #declare clk = (clock1-10/13)/(13/13-10/13); #declare t1_esq = 40 - 40*clk; #declare t2_esq = 40 - 40*clk; #declare t3_esq = 10*clk; #break #else #error "Nao deveria chegar aqui!" #end // Ângulos dos braços // -------------------------------------------------------- // s1_dir // s2_dir // s3_dir #switch (clock1) #range (0, 4/13) #declare clk = clock1/(4/13); #declare s1_dir = 20*clk; #declare s2_dir = 30*clk; #declare s3_dir = -45; #break #range (4/13, 7/13) #declare clk = (clock1-4/13)/(7/13-4/13); #declare s1_dir = 20 - 20*clk; #declare s2_dir = 30 - 30*clk; #declare s3_dir = -45; #break #range (7/13, 10/13) #declare clk = (clock1-7/13)/(10/13-7/13); #declare s1_dir = -40*clk; #declare s2_dir = 30*clk; #declare s3_dir = -45; #break #range (10/13, 13/13) #declare clk = (clock1-10/13)/(13/13-10/13); #declare s1_dir = -40 + 40*clk; #declare s2_dir = 30 - 30*clk; #declare s3_dir = -45; #break #else #error "Nao deveria chegar aqui!" #end // s1_esq // s2_esq // s3_esq #switch (clock1) #range (0, 3/13) #declare clk = clock1/(3/13); #declare s1_esq = -40*clk; #declare s2_esq = 30*clk; #declare s3_esq = -45; #break #range (3/13, 6/13) #declare clk = (clock1-3/13)/(6/13-3/13); #declare s1_esq = -40 + 40*clk; #declare s2_esq = 30 - 30*clk; #declare s3_esq = -45; #break #range (6/13, 10/13) #declare clk = (clock1-6/13)/(10/13-6/13); #declare s1_esq = 20*clk; #declare s2_esq = 30*clk; #declare s3_esq = -45; #break #range (10/13, 13/13) #declare clk = (clock1-10/13)/(13/13-10/13); #declare s1_esq = 20 - 20*clk; #declare s2_esq = 30 - 30*clk; #declare s3_esq = -45; #break #else #error "Nao deveria chegar aqui!" #end //---------------------------------------------- //---------------------------------------------- // Cores e Texturas // textura metalica para o macaco robo #declare textura_pelo = texture { pigment { Brown } finish { Metallic_Finish } // Diminui um pouco a reflexao. O metal do robo nao esta muito polido. finish { reflection .15 } } #declare textura_olho = texture { pigment { color White } } //---------------------------------------------- // Partes do Macaco Mecânico #declare raio_cabeca = 9; #declare cabeca = sphere { 0, raio_cabeca texture { textura_pelo } } #declare raio_orelha = 3; #declare orelha_dir = difference { sphere { 0, raio_orelha scale <1,1,.2> } sphere { 0, raio_orelha/2 scale <2,2,.2> translate <0,0,-.2> //pigment { color Yellow } } texture { textura_pelo } } #declare raio_olho = 1; #declare olho = union { sphere { 0,raio_olho texture { textura_olho } } sphere { 0, raio_olho/3 translate <0,0,-raio_olho> texture { pigment { color Black } } } } #declare boca = sphere { 0, 1 scale <4, 1, 1> texture { pigment { color Red } } } #declare corpo = sphere { 0, 8/2.5 scale <1,2,1> texture { textura_pelo } } #declare ombro_dir = sphere { 0, 1 scale <1.6,1,1> texture { textura_pelo } } #declare braco_dir = sphere { 0, 1 scale <1,2.5,1> texture { textura_pelo } } #declare antebraco_dir = sphere { 0,1 scale <1,2.5,1> texture { textura_pelo } } #declare mao_dir = sphere { 0,1 scale <1,1,1.5> texture { textura_pelo } translate <0,0,-.5> } #declare coxa_dir = sphere { 0, 1 scale <1,2.5,1> texture { textura_pelo } } #declare perna_dir = sphere { 0, 1 scale <1,2.5,1> texture { textura_pelo } } #declare pe_dir = sphere { 0, 1 scale <1,1,2> texture { textura_pelo } } #declare rabo = blob { threshold .5 sphere { 0, 2, 1 scale <1,1,3> texture { textura_pelo } } sphere { 0, 2, 1 scale <1,1,3> texture { textura_pelo } rotate <120,0,0> translate <0,2.5,4> } sphere { 0, 2, 1 scale <1,1,3> texture { textura_pelo } rotate <-20,0,0> translate <0,6.5,7.5> } rotate <0,0,60> } //---------------------------------------------- // Modelo Hierárquico do Macaco // mao<->antebraço #macro m_a(theta_m_a) union { object { antebraco_dir translate <-4,-2,-1 > } object { mao_dir rotate translate <-4,-3.5,-1 > } } #end // braço<->mao-antebraco #macro b_ma(theta_b_ma, theta_m_a) union { object { braco_dir translate <-4,1.5,-1 > } object { m_a(theta_m_a) translate <0,0,1> rotate translate <0,0,-1> } } #end // Braço // Ombro<->braço-mão-antebraço #macro o_bma(theta_o_bma, theta_b_ma, theta_m_a) union { object { ombro_dir translate <-2.8,3.2,-1> } object { b_ma(theta_b_ma, theta_m_a) translate <0, -3, 1> rotate translate <0, 3, -1> } } #end // perna<->pe #macro p_p(theta_p_p) union { object { perna_dir translate <-2,-11,0> } object { pe_dir translate <0,0,-1.2> rotate translate <-2,-14,0> } } #end // coxa<->perna-pe #macro c_pp(theta_c_pp, theta_p_p) union { object { coxa_dir translate <-2,-7,0> } object{ p_p(theta_p_p) translate <0,9,0> rotate <-theta_c_pp,0,0> translate <0,-9,0> } } #end // Perna // Corpo<->coxa-perna-pe #macro c_cpp(theta_c_cpp, theta_c_pp, theta_p_p) object { c_pp(theta_c_pp,theta_p_p) translate <0,5,0> rotate translate <0,-5,0> } #end #declare macaco_mecanico = union{ difference { union { object { cabeca } object { orelha_dir translate <-7,7,-3> } object { orelha_dir translate <-7,7,-3> scale <-1,1,1> } // vira orelha esquerda object { olho translate <-3,5,-7> } object { olho translate <-3,5,-7> scale <-1,1,1> } } object { boca translate <0,0,-9> } scale <.3,.3,.3> translate <0,8.5,0> } object { corpo } // braço direito object { o_bma(s1_dir,s2_dir,s3_dir) } // braço esquerdo object { o_bma(s1_esq,s2_esq,s3_esq) scale <-1,1,1> } object { ombro_dir translate <-2.8,3.2,-1> scale <-1,1,1>} object { braco_dir translate <-4,2,-1> scale <-1,1,1> } // vira braco esquerdo // perna direita object { c_cpp(t1_dir,t2_dir,t3_dir) } // perna esquerda object { c_cpp(t1_esq,t2_esq,t3_esq) scale <-1,1,1> } object { rabo scale .7 rotate <0,10*cos(clock1*2*pi),0> translate <0,-1.5,4> } translate <0,5,0> } //---------------------------------------------- // Cena object { macaco_mecanico translate <0,0,17*(1-2*clock)> // rotate <0,75,0> translate <0,deltah,0> } plane { y, -10 texture { T_Grnt1 } }