// Last edited on 2011-05-06 12:05:34 by stolfi #include "tintas.inc" #include "boneco_macros.inc" // CENA // Depende da variável clock // clock = 0.0000 --> primeiro quadro da animação // clock = 1.0000 --> último quadro background{ color rgb < 0.75, 0.80, 0.85 > } #macro boneco_animado_passeio(N,faseC) // Caminhada de N passos: // {faseC=0} início da caminhada, // {faseC=1} fim da caminhada. // O passeio começa com o peh direito na frente. // em x=0, e o peh esquerdo atrás, ambos no plano z=0. // Durante o passeio o boneco anda na direcao +x. #local numP = int(faseC*N); // Numero do passo (0,1,...N-2). #local faseP = mod(faseC*N, 1); // Parte fracionaria (fase do passo). #local xiniP = numP*(2*boneco_animado_meio_passo); // Pos. X inic. do passo. object{ boneco_andando(faseP) translate xiniP*x } #end #macro boneco_andando(fase) // Boneco andando // {fase} = 0 no início do passo, 1 no fim do passo // Passo inicia quando a perna esquerda terminou de encostar no chao. // A perna direita faz o que a esquerda faz, com defasagem de 1/2 período: #local faseD = mod(fase + 0.5, 1.0); // mod(a,b) = resto da div de a por b. #local AE = boneco_animado_angulo_quadril_E(fase); #local AD = boneco_animado_angulo_quadril_E(faseD); #local AJE = boneco_animado_angulo_joelho_E(fase); #local AJD = boneco_animado_angulo_joelho_E(faseD); #local ATE = boneco_animado_angulo_tornozelo_E(fase); #local ATD = boneco_animado_angulo_tornozelo_E(faseD); #local PCE = boneco_animado_calcanhar(fase,+3); #local PCD = boneco_animado_calcanhar(faseD,-3); union{ object{ boneco(AE,AD, AJE,AJD, ATE,ATD) texture{ tinta_vermelha } } sphere{ PCE, 0.25 texture{ tinta_amarela } } sphere{ PCD, 0.25 texture{ tinta_amarela } } #if ((fase >= 0.000) & (fase <= 0.500)) // Peh DIREITO no chao, peh esquerdo acima do chao: translate < -PCD.x, 0, -PCD.z > #end #if ((fase > 0.500) & (fase <= 1.000)) // Peh ESQUERDO no chao, peh direito acima do chao: translate < -PCE.x + boneco_animado_meio_passo, 0, -PCE.z > #end } #end #macro boneco_animado_angulo_quadril_E(fase) // Define o angulo do quadril esquerdo para a dada {fase}: #if ((fase >= 0.000) & (fase <= 0.500)) #local AE = interpola(0.000, +20, 0.500, -27, fase); #end #if ((fase >= 0.500) & (fase <= 1.000)) #local AE = interpola(0.500, -27, 1.000, +20, fase); #end AE #end #macro boneco_animado_angulo_joelho_E(fase) // Define os angulo do joelho esquerdo: #if ((fase >= 0.000) & (fase <= 0.250)) #local AJE = interpola(0.000, +10, 0.250, +50, fase); #end #if ((fase >= 0.250) & (fase <= 0.500)) #local AJE = interpola(0.250, +50, 0.500, +3, fase); #end #if ((fase >= 0.500) & (fase <= 0.750)) #local AJE = interpola(0.500, +3, 0.750, +5, fase); #end #if ((fase >= 0.750) & (fase <= 1.000)) #local AJE = interpola(0.750, +5, 1.000, +10, fase); #end AJE #end #macro boneco_animado_angulo_tornozelo_E(fase) // Calcula o angulo do tornozelo esq. para manter o peh horizontal: #local AE = boneco_animado_angulo_quadril_E(fase); #local AJE = boneco_animado_angulo_joelho_E(fase); #local ATE = - AE - AJE; // Angulo do tornozelo esquerdo. ATE #end #macro boneco_animado_calcanhar(fase,Y_quadril) // Posicao do calcanhar para uma dada fase do passo, // relativa à origem do boneco, // supondo que o quadril está em {Y_quadril}. #local AE = boneco_animado_angulo_quadril_E(fase); #local AJE = boneco_animado_angulo_joelho_E(fase); // Posicao do quadril esquerdo: #local P = <0, Y_quadril, 0>; // Posicao do joelho esquerdo: #local PJE = P + < -5*sin(radians(AE)), 0, -5*cos(radians(AE)) >; // Posicao do tornozelo esquerdo: #local PTE = PJE + < -5*sin(radians(AE+AJE)), 0, -5*cos(radians(AE+AJE)) >; // Posicao do calcanhar: #local PCE = PTE - 0.5*z; PCE #end #macro interpola(xa, ya, xb, yb, xx) #local ss = (xx - xa)/(xb - xa); // 0 quando x = xa, 1 quadno x = xb #local tt = 1 - ss; // 1 quadno x = xa, 0 quando x = xb (tt*ya + ss*yb) #end #declare boneco_animado_meio_passo = // Deslocamento em X durante 1/2 passo boneco_animado_calcanhar(0.500,+3).x - boneco_animado_calcanhar(0.000,+3).x; #debug "\n" #debug "meio_passo = " #debug str(boneco_animado_meio_passo, 6, 2) // "%6.2f" #debug "\n" object{ eixos(20) } // boneco_andando(clock) #local faseC1 = clock; #local faseC2 = clock; object{ boneco_animado_passeio(3,faseC1) translate -20*y texture{ tinta_vidro } interior{ ior 1.5 } } object{ boneco_animado_passeio(4,faseC2) rotate 180*z translate -40*y texture{ tinta_amarela } } #local T0 = 0.0000; // Início do primeiro passeio (ida) #local T1 = 0.4000; // Início da primeira virada #local T2 = 0.5000; // Início do segundo passeio (volta) #local T3 = 0.9000; // Início da segunda virada #local T4 = 1.0000; // Fim do filme. #local N3 = 2; #if ((clock >= T0) & (clock <= T1)) // Boneco andando para a frente: #local faseC3 = (clock - T0)/(T1 - T0); #local angulo3 = 0; #local dx3 = 0; #end #if ((clock >= T1) & (clock <= T2)) // Boneco girando 180 graus: #local faseC3 = 0; #local angulo3 = 180*(clock - T1)/(T2 - T1); #local dx3 = N3*(2*boneco_animado_meio_passo); #end #if ((clock >= T2) & (clock <= T3)) // Boneco andando de volta: #local faseC3 = (clock - T2)/(T3 - T2); #local angulo3 = 180; #local dx3 = N3*(2*boneco_animado_meio_passo); #end #if ((clock >= T3) & (clock <= T4)) // Boneco rodando mais 180 graus: #local faseC3 = 0; #local angulo3 = 180 + 180*(clock - T3)/(T4 - T3); #local dx3 = 0; #end object{ boneco_animado_passeio(N3,faseC3) translate +3*y // Coloca o calcanhar direito na origem quando faseC3=0. rotate angulo3*z translate dx3*x } plane{ z,0 texture{ tinta_xadrez } } // CAMERA #declare cam_ctr = < 20, 0, 4 >; #declare cam_rad = 60; #declare cam_dir = <5,4,3>;