// Exemplo de arquivo de descricao de cena para POV-ray // Last edited on 2022-01-06 08:29:06 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 segtaculo( num_esferas, ponto_0, raio_0, ponto_1, raio_1, ponto_2, raio_2, ponto_3, raio_3 ) #local pedaco_0 = 0; #local pedaco_1 = num_esferas/4; #local pedaco_2 = 2 * num_esferas/4; #local pedaco_3 = 3 * num_esferas/4; #local pedaco_4 = num_esferas; union{ #local contador = 0; #while (contador < num_esferas) #if ((contador >= pedaco_0) & (contador <= pedaco_1)) #local pedaco_a = pedaco_0; #local pedaco_b = pedaco_1; #elseif ((contador > pedaco_1) & (contador <= pedaco_2)) #local pedaco_a = pedaco_1; #local pedaco_b = pedaco_2; #elseif ((contador > pedaco_2) & (contador <= pedaco_3)) #local pedaco_a = pedaco_2; #local pedaco_b = pedaco_3; #elseif ((contador > pedaco_3) & (contador <= pedaco_4)) #local pedaco_a = pedaco_3; #local pedaco_b = pedaco_4; #end #local raio_atual = interpola_bezier( contador, pedaco_a, pedaco_b, raio_0, raio_1, raio_2, raio_3 ); #local ponto_atual = interpola_bezier( contador, pedaco_a, pedaco_b, ponto_0, ponto_1, ponto_2, ponto_3 ); sphere { ponto_atual, raio_atual texture { tx_fosca_amarela } } #local contador = contador + 1; #end } #end #macro tentaculo(num_esferas_por_segmento, numero_de_segmentos, pontos, raios) union{ #local contador = 0; #while (contador < numero_de_segmentos) object{ segtaculo( (num_esferas_por_segmento), pontos[contador][0], raios[contador][0], pontos[contador][1], raios[contador][1], pontos[contador][2], raios[contador][2], pontos[contador][3], raios[contador][3] ) } #local contador = contador + 1; #end } #end #macro tentaculo_teste(numero_de_esferas_por_segmento) #local numero_de_segmentos = 4; #local pontos_dados_por_segmento = 4; #local pontos_dados = array[numero_de_segmentos][pontos_dados_por_segmento] #local raios_dados = array[numero_de_segmentos][pontos_dados_por_segmento] #local pontos_dados[0][0] = <0, 0, 0>; #local raios_dados[0][0] = 7; #local pontos_dados[0][1] = <0, 15, 10>; #local raios_dados[0][1] = 12; #local pontos_dados[0][2] = <0, 30, 10>; #local raios_dados[0][2] = 5; // #local pontos_dados[1][0] = <0, 60, 10>; // #local raios_dados[1][0] = 4; #local pontos_dados[1][1] = <0, 75, 20>; #local raios_dados[1][1] = 4; #local pontos_dados[1][2] = <0, 90, 18>; #local raios_dados[1][2] = 6; // #local pontos_dados[2][0] = <0, 120, -5>; // #local raios_dados[2][0] = 12; #local pontos_dados[2][1] = <0, 135, -10>; #local raios_dados[2][1] = 15; #local pontos_dados[2][2] = <0, 150, -5>; #local raios_dados[2][2] = 12; // #local pontos_dados[3][0] = <0, 180, 0>; // #local raios_dados[3][0] = 10; #local pontos_dados[3][1] = <0, 195, 10>; #local raios_dados[3][1] = 8; #local pontos_dados[3][2] = <0, 210, 5>; #local raios_dados[3][2] = 5; #local pontos_dados[3][3] = <0, 225, 10>; #local raios_dados[3][3] = 2; #local contador = 1; #while (contador < numero_de_segmentos) #local posicao_media = ponto_medio( pontos_dados[contador - 1][2], pontos_dados[contador][1] ); #local pontos_dados[contador - 1][3] = posicao_media; #local pontos_dados[contador][0] = posicao_media; #local raio_medio = ponto_medio( raios_dados[contador - 1][2], raios_dados[contador][1] ); #local raios_dados[contador - 1][3] = raio_medio; #local raios_dados[contador][0] = raio_medio; #local contador = contador + 1; #end object{ tentaculo( numero_de_esferas_por_segmento, numero_de_segmentos, pontos_dados, raios_dados ) } #end #macro ponto_medio(ponto_a, ponto_b) #local novo_ponto = (ponto_a + ponto_b) / 2; novo_ponto #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{ eixos(50) } // Teste com a ultima macro object{ tentaculo_teste(150) translate <-20, -120, 0>} // Abaixo, teste com a macro "tentaculo" // #local num_esferas_por_segmento = 50; // #local numero_de_segmentos = 4; // #local pontos_dados_por_segmento = 4; // #local pontos_dados = array[numero_de_segmentos][pontos_dados_por_segmento] // #local raios_dados = array[numero_de_segmentos][pontos_dados_por_segmento] // #local pontos_dados[0][0] = <0, 0, 0>; // #local pontos_dados[0][1] = <0, 15, 15>; // #local pontos_dados[0][2] = <0, 30, 10>; // #local pontos_dados[0][3] = <0, 45, 0>; // #local raios_dados[0][0] = 7; // #local raios_dados[0][1] = 12; // #local raios_dados[0][2] = 9; // #local raios_dados[0][3] = 4; // #local pontos_dados[1][0] = <0, 0, -20>; // #local pontos_dados[1][1] = <0, 15, -5>; // #local pontos_dados[1][2] = <0, 30, -10>; // #local pontos_dados[1][3] = <0, 45, -20>; // #local raios_dados[1][0] = 7; // #local raios_dados[1][1] = 12; // #local raios_dados[1][2] = 9; // #local raios_dados[1][3] = 4; // #local pontos_dados[2][0] = <0, 0, 20>; // #local pontos_dados[2][1] = <0, 15, 35>; // #local pontos_dados[2][2] = <0, 30, 30>; // #local pontos_dados[2][3] = <0, 45, 20>; // #local raios_dados[2][0] = 7; // #local raios_dados[2][1] = 12; // #local raios_dados[2][2] = 9; // #local raios_dados[2][3] = 4; // #local pontos_dados[3][0] = <0, 0, 40>; // #local pontos_dados[3][1] = <0, 15, 55>; // #local pontos_dados[3][2] = <0, 30, 50>; // #local pontos_dados[3][3] = <0, 45, 40>; // #local raios_dados[3][0] = 7; // #local raios_dados[3][1] = 12; // #local raios_dados[3][2] = 9; // #local raios_dados[3][3] = 4; // object{ tentaculo(num_esferas_por_segmento, numero_de_segmentos, pontos_dados, raios_dados) } // Abaixo teste com a macro segtaculo // #local ponto_0 = <0, 0, 0>; // #local raio_0 = 7; // #local ponto_1 = <0, 15, 15>; // #local raio_1 = 12; // #local ponto_2 = <0, 30, 10>; // #local raio_2 = 9; // #local ponto_3 = <0, 45, 0>; // #local raio_3 = 4; // object{ segtaculo(50, ponto_0, raio_0, ponto_1, raio_1, ponto_2, raio_2, ponto_3, raio_3) } } #include "camlight.inc" #declare centro_cena = < -10.00, -25.00, 0.00 >; #declare raio_cena = 130.0; #declare dir_camera = < 20.00, -25.00, 15.00 >; #declare dist_camera = 5*raio_cena; #declare intens_luz = 1.20; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)