// Exemplo de arquivo de descricao de cena para POV-ray // Last edited on 2022-01-06 05:26:41 by stolfi // ====================================================================== // CORES E TEXTURAS background{ color rgb < 0.75, 0.80, 0.85 > } #declare tx_plastico_verde = texture{ pigment{ color rgb < 0.10, 1.00, 0.70 > } finish{ diffuse 1.0 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_plastico_vermelho = texture{ pigment{ color rgb < 1.00, 0.00, 0.00 > } finish{ diffuse 1.0 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_plastico_azul = texture{ pigment{ color rgb < 0.00, 0.00, 1.00 > } finish{ diffuse 1.0 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_fosca_amarela = texture{ pigment{ color rgb < 1.00, 0.80, 0.10 > } finish{ diffuse 0.9 ambient 0.1 } } #declare tx_vidro_verde = texture{ pigment{ color rgb < 0.00, 1.00, 0.00 > filter 0.70 } finish{ diffuse 0.03 reflection 0.25 ambient 0.02 specular 0.25 roughness 0.005 } } #declare tx_fosca_vermelha = texture{ pigment{ color rgb <1.00, 0.20, 0.20> } finish{ diffuse 0.9 ambient 0.1 } } #declare tx_xadrez = texture{ pigment{ checker color rgb < 0.15, 0.20, 0.65 >, color rgb < 0.10, 0.97, 0.90 > } finish{ diffuse 0.9 ambient 0.1 } scale 2.0 } // ====================================================================== // MACROS #macro pegador(abertura) #local comprimento = 8; #local largura = 4; #local espessura = 2; #local raio_esfera = 3; union{ sphere { <0, 0, 0>, raio_esfera // , radius texture{tx_fosca_amarela} } box { <0, -largura/2, 0>, // near lower left corner, far upper right corner texture{ tx_fosca_vermelha } // translate <0, 0, 0> // } box { <0, -largura/2, 0>, // near lower left corner, far upper right corner texture{ tx_fosca_vermelha } rotate <0, abertura, 0> // translate <0, 0, 0> // } } #end #macro antebraco(abertura_punho, abertura_pegador) #local comprimento = 15; #local raio = 2; union{ cylinder { <0, 0, 0>, , raio // center of one end, center of other end, radius texture{ tx_plastico_vermelho } } object{ pegador(abertura_pegador) rotate <0, abertura_punho, 0> translate // } } #end #macro braco(abertur_cotovelo, abertura_punho, abertura_pegador) #local comprimento = 15; #local raio = 2; #local raio_esfera = 3; union{ sphere { <0, 0, 0>, raio texture { tx_fosca_amarela } } cylinder { <0, 0, 0>, , raio // center of one end, center of other end, radius texture{ tx_plastico_vermelho } } sphere { <0, 0, 0>, raio // , radius translate // texture { tx_fosca_amarela } } object{ antebraco(abertura_punho, abertura_pegador) rotate <0, abertur_cotovelo, 0> translate // } } #end #macro cabeca() #local raio_cabeca = 10; #local raio_olhos = 2; #local raio_boca = 3; #local separacao_angular_olhos = 45; difference{ sphere { <0, 0, 0>, raio_cabeca // , radius texture { tx_plastico_verde } } union{ sphere { , raio_olhos // , radius texture { tx_plastico_vermelho } rotate <0, 0, separacao_angular_olhos/2> } sphere { <0, raio_cabeca, 0>, raio_olhos // , radius texture { tx_plastico_vermelho } rotate <0, 0, -separacao_angular_olhos/2> } difference{ sphere { <0, 0, 0>, raio_boca // , radius texture { tx_plastico_azul } } box { <-raio_boca, -raio_boca, 0>, // near lower left corner, far upper right corner texture { tx_plastico_azul } } translate // rotate<0, 20, 45> } } } #end #macro pescoco() #local raio_pescoco = 4; #local comprimento_pescoco = 20; #local raio_cabeca = 10; union{ sphere { <0, 0, 0>, raio_pescoco // , radius texture { tx_fosca_amarela } } cylinder { <0, 0, 0>, <0, 0, comprimento_pescoco>, raio_pescoco // center of one end, center of other end, radius texture { tx_plastico_vermelho } } object{ cabeca() translate <0, 0, comprimento_pescoco> // } } #end #macro pe() #local comprimento = 9; #local largura = 4; #local espessura = 2; box { <0, -largura/2, -espessura/2>, // near lower left corner, far upper right corner texture{ tx_plastico_vermelho } } #end #macro canela(pitch_pe, yaw_pe) #local comprimento = 10; #local raio = 2; #local raio_esfera = 3; union{ sphere { <0, 0, 0>, raio texture { tx_fosca_amarela } } cylinder { <0, 0, 0>, <0, 0, -comprimento>, raio texture { tx_plastico_vermelho } } sphere { <0, 0, -comprimento>, raio texture { tx_fosca_amarela } } object{ pe() rotate <0, pitch_pe, 0> rotate <0, 0, yaw_pe> translate <0, 0, -comprimento> } } #end #macro perna(abertura_joelho, pitch_pe, yaw_pe) #local comprimento = 10; #local raio = 2; #local raio_esfera = 3; union{ sphere { <0, 0, 0>, raio // , radius texture { tx_fosca_amarela } } cylinder { <0, 0, 0>, <0, 0, -comprimento>, raio // center of one end, center of other end, radius texture { tx_plastico_vermelho } } sphere { <0, 0, -comprimento>, raio // , radius texture { tx_fosca_amarela } } object{ canela(pitch_pe, yaw_pe) rotate <0, abertura_joelho, 0> translate <0, 0, -comprimento> // } } #end #macro robo( angulos_pescoco, abertur_cotovelo_a, abertura_punho_a, abertura_pegador_a, angulos_ombro_a, abertur_cotovelo_b, abertura_punho_b, abertura_pegador_b, angulos_ombro_b, angulos_quadril_a, abertura_joelho_a, pitch_pe_a, yaw_pe_a, angulos_quadril_b, abertura_joelho_b, pitch_pe_b, yaw_pe_b ) #local comprimento_corpo = 30; #local raio_corpo = 10; union{ cylinder { <0, 0, 0>, <0, 0, comprimento_corpo>, raio_corpo texture{ tx_plastico_verde } } object{ pescoco() rotate rotate <0, angulos_pescoco.y, 0> rotate <0, 0, angulos_pescoco.z> translate <0, 0, comprimento_corpo> } // braco_a object{ braco(abertur_cotovelo_a, abertura_punho_a, abertura_pegador_a) rotate rotate <0, angulos_ombro_a.y, 0> rotate <0, 0, angulos_ombro_a.z> translate <0, raio_corpo, 0.75*comprimento_corpo> } //braco_b object{ braco(abertur_cotovelo_b, abertura_punho_b, abertura_pegador_b) rotate rotate <0, angulos_ombro_b.y, 0> rotate <0, 0, angulos_ombro_b.z> translate <0, -raio_corpo, 0.75*comprimento_corpo> } //perna_a object{ perna(abertura_joelho_a, pitch_pe_a, yaw_pe_a) rotate rotate <0, angulos_quadril_a.y, 0> rotate <0, 0, angulos_quadril_a.z> translate <0, raio_corpo/2, 0> } //perna_b object{ perna(abertura_joelho_b, pitch_pe_b, yaw_pe_b) rotate rotate <0, angulos_quadril_b.y, 0> rotate <0, 0, angulos_quadril_b.z> translate <0, -raio_corpo/2, 0> } } #end #macro chao(first_x, first_y, first_z, second_x, second_y, second_z) box{ , } #end #macro calcula_logo_antes(ponto_atual, ponto_anterior, numero_de_parametros) #local resultado = array[numero_de_parametros] #local contador = 0; #while (contador < numero_de_parametros) #local resultado[contador] = ponto_atual[contador] - div(abs(ponto_atual[contador] - ponto_anterior[contador]), 3); // #local resultado[contador] = ponto_atual[contador] - 10; #local contador = contador + 1; #end resultado #end #macro calcula_logo_depois(ponto_atual, ponto_depois, numero_de_parametros) #local resultado = array[numero_de_parametros] #local contador = 0; #while (contador < numero_de_parametros) #local resultado[contador] = ponto_atual[contador] + div(abs(ponto_atual[contador] - ponto_depois[contador]), 3); // #local resultado[contador] = ponto_atual[contador] + 10; #local contador = contador + 1; #end resultado #end // #local articulacoes_chave_0 = calcula_quadro_chave(tempo_0, tempo_3, tempo_4, tempo_0, tempo_1, articulacoes_frame_0_antes, articulacoes_frame_0_depois, numero_de_parametros); // #local articulacoes_chave_1 = calcula_quadro_chave(tempo_1, tempo_0, tempo_1, tempo_1, tempo_2, articulacoes_frame_1_antes, articulacoes_frame_1_depois, numero_de_parametros); // #local articulacoes_chave_2 = calcula_quadro_chave(tempo_2, tempo_1, tempo_2, tempo_2, tempo_3, articulacoes_frame_2_antes, articulacoes_frame_2_depois, numero_de_parametros); // #local articulacoes_chave_3 = calcula_quadro_chave(tempo_3, tempo_2, tempo_3, tempo_3, tempo_4, articulacoes_frame_3_antes, articulacoes_frame_3_depois, numero_de_parametros); // #local articulacoes_chave_4 = calcula_quadro_chave(tempo_4, tempo_3, tempo_4, tempo_0, tempo_1, articulacoes_frame_4_antes, articulacoes_frame_4_depois, numero_de_parametros); #macro calcula_quadro_chave(tempo_atual, tempo_anterior_a, tempo_anterior_b, tempo_posterior_a, tempo_posterior_b, ponto_antes, ponto_depois, numero_de_parametros) #local resultado = array[numero_de_parametros] #local tempo_anterior = tempo_atual - (tempo_anterior_b - tempo_anterior_a) / 3; #local tempo_posterior = tempo_atual + (tempo_posterior_b - tempo_posterior_a) / 3; #local contador = 0; #while (contador < numero_de_parametros) #local valor_antes = ponto_antes[contador]; #local valor_depois = ponto_depois[contador]; #local resultado[contador] = interpola_afim(tempo_atual, tempo_anterior, tempo_posterior, valor_antes, valor_depois); #if (contador = 0) #debug concat( "TEMPO ATUAL ", str(tempo_atual, 0, 4), "\n", "RESULTADO ", str(resultado[contador], 0, 4), "\n" ) #end #local contador = contador + 1; #end resultado #end #macro robo_mov(tempo) #local numero_de_parametros = 27; #local tempo_0 = 0.00; #local tempo_1 = 0.2; #local tempo_2 = 0.50; #local tempo_3 = 0.7; #local tempo_4 = 1.00; #local articulacoes_frame_0 = array[numero_de_parametros] #local articulacoes_frame_1 = array[numero_de_parametros] #local articulacoes_frame_2 = array[numero_de_parametros] #local articulacoes_frame_3 = array[numero_de_parametros] #local articulacoes_frame_0[0] = 20; // Rx pescoco #local articulacoes_frame_0[1] = -20; // Ry pescoco #local articulacoes_frame_0[2] = -45; // Rz pescoco #local articulacoes_frame_0[3] = -90; // Abertura cotovelo A #local articulacoes_frame_0[4] = 0; // Abertura punho A #local articulacoes_frame_0[5] = 45; // Abertura pegador A #local articulacoes_frame_0[6] = 180; // Rx ombro A #local articulacoes_frame_0[7] = 0; // Ry ombro A #local articulacoes_frame_0[8] = 90; // Rz ombro A #local articulacoes_frame_0[9] = 90; // Abertura cotovelo B #local articulacoes_frame_0[10] = 15; // Abertura punho B #local articulacoes_frame_0[11] = 60; // Abertura pegador B #local articulacoes_frame_0[12] = 180; // Rx ombro B #local articulacoes_frame_0[13] = 0; // Ry ombro B #local articulacoes_frame_0[14] = -90; // Rz ombro B #local articulacoes_frame_0[15] = 0; // Rx quadril A #local articulacoes_frame_0[16] = 0; // Ry quadril A #local articulacoes_frame_0[17] = -90; // Rz quadril A #local articulacoes_frame_0[18] = 0; // Abertura joelho A #local articulacoes_frame_0[19] = 0; // Ry pe A #local articulacoes_frame_0[20] = 90; // Rz pe A #local articulacoes_frame_0[21] = 0; // Rx quadril B #local articulacoes_frame_0[22] = 0; // Ry quadril B #local articulacoes_frame_0[23] = 90; // Rz quadril B #local articulacoes_frame_0[24] = 90; // Abertura joelho B #local articulacoes_frame_0[25] = 0; // Ry pe B #local articulacoes_frame_0[26] = 0; // Rz pe B #local articulacoes_frame_1[0] = 40; // Rx pescoco #local articulacoes_frame_1[1] = 0; // Ry pescoco #local articulacoes_frame_1[2] = -45; // Rz pescoco #local articulacoes_frame_1[3] = 0; // Abertura cotovelo A #local articulacoes_frame_1[4] = 0; // Abertura punho A #local articulacoes_frame_1[5] = 45; // Abertura pegador A #local articulacoes_frame_1[6] = 0; // Rx ombro A #local articulacoes_frame_1[7] = 0; // Ry ombro A #local articulacoes_frame_1[8] = 90; // Rz ombro A #local articulacoes_frame_1[9] = 0; // Abertura cotovelo B #local articulacoes_frame_1[10] = 15; // Abertura punho B #local articulacoes_frame_1[11] = 60; // Abertura pegador B #local articulacoes_frame_1[12] = 0; // Rx ombro B #local articulacoes_frame_1[13] = 0; // Ry ombro B #local articulacoes_frame_1[14] = -90; // Rz ombro B #local articulacoes_frame_1[15] = 0; // Rx quadril A #local articulacoes_frame_1[16] = 0; // Ry quadril A #local articulacoes_frame_1[17] = -90; // Rz quadril A #local articulacoes_frame_1[18] = 0; // Abertura joelho A #local articulacoes_frame_1[19] = 0; // Ry pe A #local articulacoes_frame_1[20] = 90; // Rz pe A #local articulacoes_frame_1[21] = 0; // Rx quadril B #local articulacoes_frame_1[22] = 0; // Ry quadril B #local articulacoes_frame_1[23] = -90; // Rz quadril B #local articulacoes_frame_1[24] = 0; // Abertura joelho B #local articulacoes_frame_1[25] = 0; // Ry pe B #local articulacoes_frame_1[26] = 90; // Rz pe B #local articulacoes_frame_2[0] = -40; // Rx pescoco #local articulacoes_frame_2[1] = 0; // Ry pescoco #local articulacoes_frame_2[2] = -45; // Rz pescoco #local articulacoes_frame_2[3] = 90; // Abertura cotovelo A #local articulacoes_frame_2[4] = 0; // Abertura punho A #local articulacoes_frame_2[5] = 45; // Abertura pegador A #local articulacoes_frame_2[6] = 180; // Rx ombro A #local articulacoes_frame_2[7] = 0; // Ry ombro A #local articulacoes_frame_2[8] = 90; // Rz ombro A #local articulacoes_frame_2[9] = -90; // Abertura cotovelo B #local articulacoes_frame_2[10] = 15; // Abertura punho B #local articulacoes_frame_2[11] = 60; // Abertura pegador B #local articulacoes_frame_2[12] = 180; // Rx ombro B #local articulacoes_frame_2[13] = 0; // Ry ombro B #local articulacoes_frame_2[14] = -90; // Rz ombro B #local articulacoes_frame_2[15] = 0; // Rx quadril A #local articulacoes_frame_2[16] = 0; // Ry quadril A #local articulacoes_frame_2[17] = -90; // Rz quadril A #local articulacoes_frame_2[18] = 90; // Abertura joelho A #local articulacoes_frame_2[19] = 0; // Ry pe A #local articulacoes_frame_2[20] = 0; // Rz pe A #local articulacoes_frame_2[21] = 0; // Rx quadril B #local articulacoes_frame_2[22] = 0; // Ry quadril B #local articulacoes_frame_2[23] = 0; // Rz quadril B #local articulacoes_frame_2[24] = 0; // Abertura joelho B #local articulacoes_frame_2[25] = 0; // Ry pe B #local articulacoes_frame_2[26] = 0; // Rz pe B #local articulacoes_frame_3[0] = 40; // Rx pescoco #local articulacoes_frame_3[1] = 40; // Ry pescoco #local articulacoes_frame_3[2] = -45; // Rz pescoco #local articulacoes_frame_3[3] = 90; // Abertura cotovelo A #local articulacoes_frame_3[4] = 0; // Abertura punho A #local articulacoes_frame_3[5] = 45; // Abertura pegador A #local articulacoes_frame_3[6] = -90; // Rx ombro A #local articulacoes_frame_3[7] = 0; // Ry ombro A #local articulacoes_frame_3[8] = 90; // Rz ombro A #local articulacoes_frame_3[9] = 90; // Abertura cotovelo B #local articulacoes_frame_3[10] = 15; // Abertura punho B #local articulacoes_frame_3[11] = 60; // Abertura pegador B #local articulacoes_frame_3[12] = 90; // Rx ombro B #local articulacoes_frame_3[13] = 0; // Ry ombro B #local articulacoes_frame_3[14] = -90; // Rz ombro B #local articulacoes_frame_3[15] = 0; // Rx quadril A #local articulacoes_frame_3[16] = 0; // Ry quadril A #local articulacoes_frame_3[17] = -90; // Rz quadril A #local articulacoes_frame_3[18] = 90; // Abertura joelho A #local articulacoes_frame_3[19] = 0; // Ry pe A #local articulacoes_frame_3[20] = 0; // Rz pe A #local articulacoes_frame_3[21] = 0; // Rx quadril B #local articulacoes_frame_3[22] = 0; // Ry quadril B #local articulacoes_frame_3[23] = 90; // Rz quadril B #local articulacoes_frame_3[24] = 90; // Abertura joelho B #local articulacoes_frame_3[25] = 0; // Ry pe B #local articulacoes_frame_3[26] = 0; // Rz pe B #local articulacoes_frame_4 = articulacoes_frame_0 // Quadros antes e depois #local articulacoes_frame_0_depois = calcula_logo_depois(articulacoes_frame_0, articulacoes_frame_1, numero_de_parametros); #local articulacoes_frame_1_antes = calcula_logo_antes(articulacoes_frame_1, articulacoes_frame_0, numero_de_parametros); #local articulacoes_frame_1_depois = calcula_logo_depois(articulacoes_frame_1, articulacoes_frame_2, numero_de_parametros); #local articulacoes_frame_2_antes = calcula_logo_antes(articulacoes_frame_2, articulacoes_frame_1, numero_de_parametros); #local articulacoes_frame_2_depois = calcula_logo_depois(articulacoes_frame_2, articulacoes_frame_3, numero_de_parametros); #local articulacoes_frame_3_antes = calcula_logo_antes(articulacoes_frame_3, articulacoes_frame_2, numero_de_parametros); #local articulacoes_frame_3_depois = calcula_logo_depois(articulacoes_frame_3, articulacoes_frame_4, numero_de_parametros); #local articulacoes_frame_4_antes = calcula_logo_antes(articulacoes_frame_4, articulacoes_frame_3, numero_de_parametros); #local articulacoes_frame_0_antes = articulacoes_frame_4_antes #local articulacoes_frame_4_depois = articulacoes_frame_0_depois // Quadros chave dos nós: #local articulacoes_chave_0 = calcula_quadro_chave(tempo_0, tempo_3, tempo_4, tempo_0, tempo_1, articulacoes_frame_0_antes, articulacoes_frame_0_depois, numero_de_parametros); #local articulacoes_chave_1 = calcula_quadro_chave(tempo_1, tempo_0, tempo_1, tempo_1, tempo_2, articulacoes_frame_1_antes, articulacoes_frame_1_depois, numero_de_parametros); #local articulacoes_chave_2 = calcula_quadro_chave(tempo_2, tempo_1, tempo_2, tempo_2, tempo_3, articulacoes_frame_2_antes, articulacoes_frame_2_depois, numero_de_parametros); #local articulacoes_chave_3 = calcula_quadro_chave(tempo_3, tempo_2, tempo_3, tempo_3, tempo_4, articulacoes_frame_3_antes, articulacoes_frame_3_depois, numero_de_parametros); #local articulacoes_chave_4 = calcula_quadro_chave(tempo_4, tempo_3, tempo_4, tempo_0, tempo_1, articulacoes_frame_4_antes, articulacoes_frame_4_depois, numero_de_parametros); union{ object{ robo_mov_iter1( articulacoes_chave_0, articulacoes_chave_1, articulacoes_chave_2, articulacoes_chave_3, articulacoes_chave_4, tempo_0, tempo_1, tempo_2, tempo_3, tempo_4, numero_de_parametros ) translate <0, -45, 0> } object{ robo_mov_iter3( articulacoes_chave_0, articulacoes_frame_0_antes, articulacoes_frame_0_depois, articulacoes_chave_1, articulacoes_frame_1_antes, articulacoes_frame_1_depois, articulacoes_chave_2, articulacoes_frame_2_antes, articulacoes_frame_2_depois, articulacoes_chave_3, articulacoes_frame_3_antes, articulacoes_frame_3_depois, articulacoes_chave_4, articulacoes_frame_4_antes, articulacoes_frame_4_depois, tempo_0, tempo_1, tempo_2, tempo_3, tempo_4, numero_de_parametros ) translate <0, 45, 0> } } #end #macro robo_mov_iter1( frame_0, frame_1, frame_2, frame_3, frame_4, tempo_0, tempo_1, tempo_2, tempo_3, tempo_4, numero_de_parametros ) #local articulacoes_frame_T = array[numero_de_parametros] #local contador = 0; #while (contador < numero_de_parametros) #if (tempo <= tempo_1) #local articulacoes_frame_T[contador] = interpola_afim( tempo, tempo_0, tempo_1, frame_0[contador], frame_1[contador] ); #elseif (tempo > tempo_1 & tempo <= tempo_2) #local articulacoes_frame_T[contador] = interpola_afim( tempo, tempo_1, tempo_2, frame_1[contador], frame_2[contador] ); #elseif (tempo > tempo_2 & tempo <= tempo_3) #local articulacoes_frame_T[contador] = interpola_afim( tempo, tempo_2, tempo_3, frame_2[contador], frame_3[contador] ); #elseif (tempo > tempo_3 & tempo <= tempo_4) #local articulacoes_frame_T[contador] = interpola_afim( tempo, tempo_3, tempo_4, frame_3[contador], frame_4[contador] ); #end #local contador = contador + 1; #end object{ robo_vet( articulacoes_frame_T ) } #end #macro robo_mov_iter3( frame_chave_0, frame_0_antes, frame_0_depois, frame_chave_1, frame_1_antes, frame_1_depois, frame_chave_2, frame_2_antes, frame_2_depois, frame_chave_3, frame_3_antes, frame_3_depois, frame_chave_4, frame_4_antes, frame_4_depois, tempo_0, tempo_1, tempo_2, tempo_3, tempo_4, numero_de_parametros ) #local articulacoes_frame_T = array[numero_de_parametros] #local contador = 0; #while (contador < numero_de_parametros) #if ((tempo_0 <= tempo) & (tempo <= tempo_1)) #local articulacoes_frame_T[contador] = interpola_bezier( tempo, tempo_0, tempo_1, frame_chave_0[contador], frame_0_depois[contador], frame_1_antes[contador], frame_chave_1[contador] ); #elseif ((tempo_1 <= tempo) & (tempo <= tempo_2)) #local articulacoes_frame_T[contador] = interpola_bezier( tempo, tempo_1, tempo_2, frame_chave_1[contador], frame_1_depois[contador], frame_2_antes[contador], frame_chave_2[contador] ); #elseif ((tempo_2 <= tempo) & (tempo <= tempo_3)) #local articulacoes_frame_T[contador] = interpola_bezier( tempo, tempo_2, tempo_3, frame_chave_2[contador], frame_2_depois[contador], frame_3_antes[contador], frame_chave_3[contador] ); #elseif ((tempo_3 <= tempo) & (tempo <= tempo_4)) #local articulacoes_frame_T[contador] = interpola_bezier( tempo, tempo_3, tempo_4, frame_chave_3[contador], frame_3_depois[contador], frame_4_antes[contador], frame_chave_4[contador] ); #end #local contador = contador + 1; #end object{ robo_vet( articulacoes_frame_T ) } #end #macro robo_vet(posicoes) object{ robo( , posicoes[3], posicoes[4], posicoes[5], , posicoes[9], posicoes[10], posicoes[11], , , posicoes[18], posicoes[19], posicoes[20], , posicoes[24], posicoes[25], posicoes[26] ) } #end #macro interpola_afim(tempo_atual, tempo_anterior, tempo_posterior, valor_anterior, valor_posterior) #local coef_ang = (tempo_atual - tempo_anterior) / (tempo_posterior - tempo_anterior); #local novo_valor = (1 - coef_ang) * valor_anterior + coef_ang * valor_posterior; novo_valor #end #macro interpola_bezier(tempo_atual, tempo_0, tempo_3, valor_0, valor_1, valor_2, valor_3) #local valor_0_1 = interpola_afim(tempo_atual, tempo_0, tempo_3, valor_0, valor_1); #local valor_1_2 = interpola_afim(tempo_atual, tempo_0, tempo_3, valor_1, valor_2); #local valor_2_3 = interpola_afim(tempo_atual, tempo_0, tempo_3, valor_2, valor_3); #local valor_0_1_2 = interpola_afim(tempo_atual, tempo_0, tempo_3, valor_0_1, valor_1_2); #local valor_1_2_3 = interpola_afim(tempo_atual, tempo_0, tempo_3, valor_1_2, valor_2_3); #local valor_0_1_2_3 = interpola_afim(tempo_atual, tempo_0, tempo_3, valor_0_1_2, valor_1_2_3); valor_0_1_2_3 #end // Aqui est� a cena, finalmente: #include "eixos.inc" union{ object{ robo_mov(clock) } // #local extensao_do_chao = 500; // object{ chao(-extensao_do_chao, -extensao_do_chao, -2, extensao_do_chao, extensao_do_chao, 0) texture{ tx_xadrez }} } #include "camlight.inc" #declare centro_cena = < 0.00, 0.00, 20.00 >; #declare raio_cena = 120.0; #declare dir_camera = < 20.00, 0.00, 10.00 >; #declare dist_camera = 2*raio_cena; #declare intens_luz = 1.20; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)