// Fabio de Souza Azevedo - RA 952215 // 2021-11-10,11 // // TP08 - Tentaculo // Exemplo de arquivo de descricao de cena para POV-ray // Last edited on 2022-01-06 15:42:46 by stolfi //#version 3.7; #include "rand.inc" // ====================================================================== // CORES E TEXTURAS background { color rgb < 0.75, 0.80, 0.85 > } #declare tx_plastico = texture { pigment { color rgb < 0.10, 0.80, 1.00 > } finish { diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_fosca = texture { pigment { color rgb < 1.00, 0.80, 0.10 > } finish { diffuse 0.9 ambient 0.1 } } #declare tx_espelho = texture { pigment { color rgb < 1.00, 0.85, 0.30 > } finish { diffuse 0.2 reflection 0.7*< 1.00, 0.85, 0.30 > ambient 0.1 } } #declare tx_vidro = texture { pigment { color rgb < 0.85, 0.95, 1.00 > filter 0.70 } finish { diffuse 0.03 reflection 0.25 ambient 0.02 specular 0.25 roughness 0.005 } } #declare tx_verde_escuro = texture { pigment { color rgb <0, 0.5, 0> } //finish { diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_verde_claro = texture { pigment { color rgb <0, 1.0, 0> } //finish { diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_azul_escuro = texture { pigment { color rgb<0, 0, 0.5> } //finish { diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_azul_escuro_espelhado = texture { pigment { color rgb<0, 0, 0.5> } finish { diffuse 0.2 reflection 0.7*<0, 0, 0.5> ambient 0.1 } } #declare tx_verm_escuro = texture { pigment { color rgb<0.5, 0, 0> } //finish { diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_verm_transp = texture { pigment { color rgbt <1, 0, 0, 0.5> } //finish { diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_xadrez = texture { pigment { checker color rgb < 0.10, 0.32, 0.60 >, color rgb < 1.00, 0.97, 0.90 > } finish { diffuse 0.9 ambient 0.1 } scale 2.0 } // ====================================================================== // DESCRICAO DA CENA #macro interpola1(tt, tt0,tt1, vv0,vv1) // Interpolacao afim. // Dados dois pontos (tt0,vv0) e (tt1,vv1) do grafico de uma funcao afim (ou // seja, de um polinomio de grau 1 A*tt+B), devolve o valor da funcao para o // argumento generico {tt}. // // Alternativa: devolver diretamente esta expressao // ( (vv0)+(tt-(tt0)) * ((vv1)-(vv0))/((tt1)-(tt0)) ) // #local rr = (tt - tt0)/(tt1 - tt0); #local vv = (1-rr)*vv0 + rr*vv1; vv; #end #macro interpola3(tt, tt0,tt3, vv0,vv1,vv2,vv3) // Calcula um polinomio de grau 3 (cubico) que comeca no ponto (tt0,vv0) e // termina no ponto (tt3,vv3) para o argumento {tt}. // As derivadas no inicio e no fim do intervalo sao determinadas pelos valores // {vv1} e {vv2}, respectivamente. #local vv01 = interpola1(tt, tt0,tt3, vv0,vv1) #local vv12 = interpola1(tt, tt0,tt3, vv1,vv2) #local vv23 = interpola1(tt, tt0,tt3, vv2,vv3) #local vv012 = interpola1(tt, tt0,tt3, vv01,vv12) #local vv123 = interpola1(tt, tt0,tt3, vv12,vv23) #local vv0123 = interpola1(tt, tt0,tt3, vv012,vv123) vv0123 #end #macro segtaculo(m, p0,r0, p1,r1, p2,r2, p3,r3) // Desenha um segmento do tentaculo // {m} = numero de esferas no segmento // {p0} = ponto inicial do segmento // {r0} = raio da esfera no ponto inicial // {p3} = ponto final do segmento // {r3} = raio da esfera no ponto final // // {p1},{r1} = primeiros ponto e raio intermediarios // {p2},{r2} = segundos ponto e raio intermediarios #local i = 0; union { #while (i < m) #local centro = interpola3(i, 0,m, p0,p1,p2,p3); #local raio = interpola3(i, 0,m, r0,r1,r2,r3); sphere { centro, raio } #local i = i + 1; #end } #end #macro tentaculo(m,n,pp,rr) // {m} = numero de esferas por segmento do tentaculo // {n} = numero de segmentos do tentaculo // {pp} = matriz (n x 4) de pontos que definem a curva de Bezier do tentaculo // {rr} = matriz (n x 4) de raios, um para cada ponto da matriz {pp} #local i = 0; union { #while (i < n) segtaculo(m, pp[i][0],rr[i][0], pp[i][1],rr[i][1], pp[i][2],rr[i][2], pp[i][3],rr[i][3]) #local i = i + 1; #end } #end #macro tentaculo_teste(m) // {m} = numero de esferas por segmento do tentaculo #local N_segs = 4; #local mtz_pontos = array[N_segs][4]; #local mtz_raios = array[N_segs][4]; // Intervalos de valores que os pontos podem assumir no plano XY #local max_x = 20.0; #local max_y = 20.0; // Primeiro, cria matrizes com pontos e raios aleatorios #local sx = seed(937); #local sy = seed(2021); #local sr = seed(952215); #local vtc_a_caixa = <0.0, 0.0, 0.0>; #local vtc_b_caixa = <+max_x, +max_y, 0.5*max_x>; #local i = 0; #while (i < N_segs) #local j = 0; #while (j < 4) // rand gera um numero aleatorio entre 0 e 1 #local ale_x = rand(sx); #local ale_y = rand(sy); #local ale_r = rand(sr); #local ponto = ; //#local mtz_pontos[i][j] = ponto; #local mtz_pontos[i][j] = VRand_In_Box(vtc_a_caixa, vtc_b_caixa, sr); // VRand_In_Box deu resultados melhores. Ela devolve vetores aleatorios // dentro da caixa especificada pelos 2 vertices. #local mtz_raios[i][j] = ale_r + 0.2; #local j = j + 1; #end #local i = i + 1; #end // Depois, faz os ajustes para garantir as continuidades de Bezier #local i = 0; #while (i < N_segs) #local j = 0; #while (j < 4) #if (j=3 & i < (N_segs-1)) #local ponto_pre_emenda = mtz_pontos[i][j-1]; #local ponto_pos_emenda = mtz_pontos[i+1][1]; #local ponto = 0.5*(ponto_pre_emenda + ponto_pos_emenda); #local mtz_pontos[i][j] = ponto; #local mtz_pontos[i+1][0] = ponto; #local raio_pre_emenda = mtz_raios[i][j-1]; #local raio_pos_emenda = mtz_raios[i+1][1]; #local raio = 0.5*(raio_pre_emenda + raio_pos_emenda); #local mtz_raios[i][j] = raio; #local mtz_raios[i+1][0] = raio; #end #local j = j + 1; #end #local i = i + 1; #end object { tentaculo(m, N_segs, mtz_pontos, mtz_raios) texture { tx_fosca } } #end #include "eixos.inc" // Aqui está a cena, finalmente: // object { eixos(10.0) } // Chao box { <-25, -25, +00>, <+25, +25, -0.5> translate <0,0,-2> texture { tx_xadrez } } #declare M_esferas = 120; object { tentaculo_teste(M_esferas) } #include "camlight.inc" #declare centro_cena = < 8.00, 8.00, 4.00 >; #declare raio_cena = 12; #declare dir_camera = <7.0, 7.0, 7.0 >; #declare dist_camera = 5.0*raio_cena; #declare intens_luz = 1.20; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)