//TP05 - Coelho dançando //Aluno: Sergio José Venancio Júnior //RA: 009884 // ====================================================================== // VETORES DE ANGULOS - angulos que determinam a movimentacao das articulacoes do coelho ao longo dos quadros-chave da animação //tamanho dos vetores #declare length = 9; #declare arrAntebraco1 = array[length] {0,-45,0,45,0,-45,0,45,0}; //intervalo util [-90,90] #declare arrAntebraco2 = array[length] {0,45,0,-45,0,45,0,-45,0}; //intervalo util [-90,90] #declare arrBraco1 = array[length] {0,0,0,90,0,0,0,90,0}; //intervalo util [0,120] #declare arrBraco2 = array[length] {0,90,0,0,0,90,0,0,0}; //intervalo util [0,120] #declare arrAntecoxa1 = array[length] {0,90,0,90,0,0,0,0,0}; //intervalo util[-15,120] #declare arrAntecoxa2 = array[length] {0,0,0,0,0,90,0,90,0}; //intervalo util[-15,120] #declare arrCoxa1 = array[length] {0,-90,0,0,0,0,0,0,0}; //intervalo util[-120,0] #declare arrCoxa2 = array[length] {0,0,0,0,0,-90,0,0,0}; //intervalo util[-120,0] #declare arrPe1 = array[length] {0,-30,0,-30,0,0,0,0,0}; //intervalo util[-30,30] #declare arrPe2 = array[length] {0,0,0,0,0,-30,0,-30,0}; //intervalo util[-30,30] //vetor de tempo #declare tempo = array[length] {0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.825, 1}; // ====================================================================== // CORES E TEXTURAS background{ color rgb < 0.75, 0.80, 0.85 > } #declare tx_pelagem = texture{ pigment{ color rgb < 1, 1, 1 > } finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_bota = texture{ pigment{ color rgb < 0.4, 0.2, 0 > } finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_olho = texture{ pigment{ color rgb < 0.8, 0, 0 > filter 0.70 } finish{ diffuse 0.03 reflection 0.25 ambient 0.02 specular 0.25 roughness 0.005 } } #declare tx_grama = texture{ pigment{ color rgb < 0.10, 0.32, 0.05 > } finish{ diffuse 0.9 ambient 0.1 } } // ====================================================================== // MODELAGEM DA CENA - Modelo Hierarquico Articulado #declare chao = box{ <-100,-100,-1>, <+100,+100,0> } //CRIACAO DAS "FOLHAS" do modelo hierarquico #macro criaOrelha() union{ //elipsoide que representa orelha sphere { <0,0,0>, 1 scale<3,1,6> texture{tx_pelagem} } } #end #macro criaCabeca() union { //cabeca sphere { <0,0,0>, 4 texture{tx_pelagem} } //focinho sphere { <0,2.5,-1>, 3 texture{tx_pelagem} } //olhos sphere { <1,3,2>, 1 texture{tx_olho} } sphere { <-1,3,2>, 1 texture{tx_olho} } //orelhas object{ criaOrelha() translate <3,-1,8> } object{ criaOrelha() translate <-3,-1,8> } } #end //cria corpo e cabeca do coelho #macro criaCorpoCabeca() union { //corpo sphere{ < 0,0,0 >, 6 texture{ tx_pelagem} } //se une a cabeca object{ criaCabeca() translate<0,0,9> } } #end //cria braco #macro criaBraco() union { cylinder{ < 0,0,0 >, < 0,0,-3.25>, 1.5 texture{ tx_pelagem} } sphere { < 0,0,-3.25 > 1.5 texture{ tx_pelagem } } } #end //cria pe #macro criaPe() union { //final do cano da bota cylinder{ < 0,0,0 >, < 0,0,-2>, 3 texture{ tx_bota} } //o sapato eh um elipsoide cortado ao meio difference { sphere { < 0,2,-2 > 3 scale<1,2,1> texture{ tx_bota } } box { <-10,-10,-2>, <10,10,-6> texture{ tx_bota } } } } #end //CRIACAO DOS "RAMOS" do modelo hierarquico #macro criaAntebraco(angBraco) union { //esfera de articulacao sphere{ < 0,0,0 > 1.5 texture{ tx_pelagem } } cylinder{ < 0, 0, 0 >, < 0, 0, -3 >, 1.5 texture{ tx_pelagem} } //esfera de articulacao sphere { < 0,0,-3 > 1.5 texture{ tx_pelagem } } //se une ao braco, configurando o angulo entre eles object{ criaBraco() rotate translate <0,0,-3> } } #end #macro criaCoxa(angPe) union { cylinder{ < 0, 0, 0 >, < 0, 0, -2 >, 2 texture{ tx_pelagem} } //na coxa iniciamos o desenho da bota cylinder{ < 0, 0, -2 >, < 0, 0, -4 >, 3 texture{ tx_bota} } //esfera de articulacao sphere { < 0,0,-4 > 3 texture{ tx_bota } } //se une ao pe, configurando o angulo entre eles object{ criaPe() rotate translate <0,0,-5> } } #end #macro criaAntecoxa(angCoxa, angPe) union { //esfera de articulacao sphere{ < 0,0,0 > 2 texture{ tx_pelagem } } cylinder{ < 0, 0, 0 >, < 0, 0, -4 >, 2 texture{ tx_pelagem} } //esfera de articulacao sphere { < 0,0,-4 > 2 texture{ tx_pelagem } } //se une a coxa, configurando o angulo entre eles object{ criaCoxa(angPe) rotate translate <0,0,-4> } } #end //funcao final para criar coelho articulado #macro criaCoelho(angAntebraco1, angAntebraco2, angBraco1, angBraco2, angAntecoxa1, angAntecoxa2, angCoxa1, angCoxa2, angPe1, angPe2) union { //une a cabe e corpo "folhas"... object{ criaCorpoCabeca() translate <0,0,15> } //aos dois antebracos "ramos", que se unirao cada um a um braco,... object{ criaAntebraco(angBraco1) rotate translate <6,0,18> } object{ criaAntebraco(angBraco2) rotate translate <-6,0,18>} //e as duas antecoxas, que se unirao cada uma a uma coxa e um pe object{ criaAntecoxa(angCoxa1, angPe1) rotate translate <3,0,10>} object{ criaAntecoxa(angCoxa2, angPe2) rotate translate <-3,0,10>} } #end // ================================================================= // ANIMACAO DA CENA //calculo do angulo de acordo com a fase #macro interpola (t0,ang0,t1,ang1,fase) #local ss = (fase-t0)/(t1-t0); #local rr = 1 - ss; (rr*ang0 + ss*ang1) #end //encontra o quadro-chave imediatamente anterior a fase #macro quadro_anterior(fase) #local i = 0; #while (i < (length-1)) //estando a fase entre as posicoes i e i+1 do vetor tempo, retorna o indice i #if ((tempo[i] <= fase) & ((i = length-1) | (tempo[i+1] >= fase))) #local resp = i; #end #local i=i+1; #end resp #end //macro chamada a cada tick do relógio #macro coelho_dancando(fase) #local i = quadro_anterior(fase); #local angAntebraco1 = interpola (tempo[i],arrAntebraco1[i],tempo[i+1],arrAntebraco1[i+1],fase); #local angAntebraco2 = interpola (tempo[i],arrAntebraco2[i],tempo[i+1],arrAntebraco2[i+1],fase); #local angBraco1 = interpola (tempo[i],arrBraco1[i],tempo[i+1],arrBraco1[i+1],fase); #local angBraco2 = interpola (tempo[i],arrBraco2[i],tempo[i+1],arrBraco2[i+1],fase); #local angAntecoxa1 = interpola (tempo[i],arrAntecoxa1[i],tempo[i+1],arrAntecoxa1[i+1],fase); #local angAntecoxa2 = interpola (tempo[i],arrAntecoxa2[i],tempo[i+1],arrAntecoxa2[i+1],fase); #local angCoxa1 = interpola (tempo[i],arrCoxa1[i],tempo[i+1],arrCoxa1[i+1],fase); #local angCoxa2 = interpola (tempo[i],arrCoxa2[i],tempo[i+1],arrCoxa2[i+1],fase); #local angPe1 = interpola (tempo[i],arrPe1[i],tempo[i+1],arrPe1[i+1],fase); #local angPe2 = interpola (tempo[i],arrPe2[i],tempo[i+1],arrPe2[i+1],fase); object{ criaCoelho(angAntebraco1, angAntebraco2, angBraco1, angBraco2, angAntecoxa1, angAntecoxa2, angCoxa1, angCoxa2, angPe1, angPe2) translate<0,0,3>} #end // ================================================================= // MONTAGEM DA CENA #include "eixos.inc" union{ object{ eixos(3.00) } object{ chao texture{ tx_grama } } object{ coelho_dancando(clock) } } // ================================================================= // POSICIONAMENTO DA CAMERA #include "camlight.inc" #declare centro_cena = < 0, 0, 20 >; #declare raio_cena = 60; #declare dir_camera = < 5, 14, 5 >; #declare dist_camera = 60; #declare intens_luz = 1.00; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)