// ============================================================================ // MC930A - Computacao Grafica ============================================= // Eduardo Uemura Okada RA 001606 ============================================= // Laboratorio XX ============================================= // ============================================================================ // ============================================================================ // Declaracao de constantes =================================================== // ============================================================================ // Modos de texturas #declare MODO_SOLIDO = 0; #declare MODO_CRISTAL = 1; #declare MODO_ESPELHO = 2; #declare MODO_VIDRO = 3; // Fator de distancia para a camera #declare V_MAX = 20; // Vistas default para camera #declare V_ISOMETRICA_ESQUERDA = < -V_MAX , V_MAX , -V_MAX >; #declare V_ISOMETRICA_DIREITA = < V_MAX , V_MAX , -V_MAX >; #declare V_LATERAL_ESQUERDA = < -V_MAX , V_MAX/10 , -V_MAX >; #declare V_LATERAL_DIREITA = < V_MAX , V_MAX/10 , -V_MAX >; #declare V_SUPERIOR_DIANTEIRA = < 0 , V_MAX*2 , -V_MAX/10 >; #declare V_SUPERIOR_POSTERIOR = < 0 , V_MAX*2 , V_MAX/10 >; #declare V_INFERIOR_DIANTEIRA = < 0 , -V_MAX*2 , -V_MAX/10 >; #declare V_INFERIOR_POSTERIOR = < 0 , -V_MAX*2 , V_MAX/10 >; #declare V_FRONTAL = <0,V_MAX/10,-V_MAX>; #declare V_CUSTOM = <0.5,1,-1>; #declare V_CENTRO = <0,0,0>; // Normais para os planos #declare P_EIXO_X = <0,1,0>; #declare P_EIXO_Y = <1,0,0>; #declare P_EIXO_Z = <0,0,1>; // Clock do lab #declare clock0 = clock; #declare clock1 = mod ( clock+0.5,1 ); // ============================================================================ // Declaracao de macros utilitarias e texturas ================================ // ============================================================================ #macro TexturaSolida ( Cor ) texture { pigment { color rgb Cor } finish { diffuse 0.5 specular 0.5 roughness 0.005 ambient 0.1 } } #end #macro TexturaCristal ( Cor ) texture { finish { ambient 0.1 diffuse 0.1 reflection 0.25 specular 1 roughness 0.001 } pigment { color Cor filter 1 } } interior { ior 1.5 } #end #macro TexturaEspelho ( Cor ) texture { finish { ambient 0.05 diffuse 0.05 reflection Cor specular 0.20 roughness 0.05 } pigment { rgb Cor } } #end #macro TexturaVidro ( Cor ) texture { pigment { color Cor filter 1.05 } finish { phong 0.9 phong_size 40 reflection 0.2 } } interior { ior 1.53 } #end #macro SelecionaCor ( Cor, Modo ) #switch ( Modo ) #case ( MODO_SOLIDO ) TexturaSolida (Cor) #break #case ( MODO_CRISTAL ) TexturaCristal (Cor) #break #case ( MODO_ESPELHO ) TexturaEspelho (Cor) #break #case ( MODO_VIDRO ) TexturaVidro (Cor) #break #end #end #macro Camera ( Visao, Alvo ) camera { location Visao sky y look_at Alvo } #end #macro FonteLuz ( Posicao, Cor, Intensidade ) light_source { Posicao color rgb Intensidade * Cor } #end #macro Plano ( Tipo, Posicao, Cor1, Cor2 ) plane { Tipo, Posicao pigment { checker color rgb Cor1 color rgb Cor2 } } #end #macro Ceu ( CorBaixa, CorAlta ) sky_sphere { pigment { gradient y color_map { [ 0.5 color CorAlta ] [ 1.0 color CorBaixa ] } scale 2 translate -1 } } #end #macro CeuAzulNublado() sky_sphere { pigment { gradient y color_map { [0.000 0.002 color rgb <0.0, 0.2, 1.0> color rgb <0.0, 0.2, 1.0>] [0.002 0.200 color rgb <0.0, 0.1, 0.8> color rgb <0.3, 0.2, 0.2>] } scale 2 translate -1 } pigment { bozo turbulence 0.65 octaves 6 omega 0.7 lambda 2 color_map { [0.0 0.1 color rgb <0.85, 0.85, 0.85> color rgb <0.75, 0.75, 0.75>] [0.1 0.5 color rgb <0.75, 0.75, 0.75> color rgbt <1, 1, 1, 1>] [0.5 1.0 color rgbt <1, 1, 1, 1> color rgbt <1, 1, 1, 1>] } scale <0.2, 0.5, 0.2> } rotate -135*x } #end #macro NevoaSinistra(Distancia, Altura, Cor) fog { distance Distancia color rgbf Cor fog_type 2 fog_offset Altura fog_alt 1.0 } #end // ============================================================================ // Declaracao de macros e objetos basicos ===================================== // ============================================================================ // Todos os objetos gerados ao redor de <0,0,0> #macro Paralelepipedo ( Tam, Cor, Modo, Rotacao, Posicao ) box { -Tam/2 Tam/2 SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao } #end #macro Cone ( Base, Topo, Altura, Cor, Modo, Rotacao, Posicao ) cone { < 0, -Altura/2, 0>, Base < 0, Altura/2, 0>, Topo SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao } #end #macro Cilindro ( Altura, Raio, Cor, Modo, Rotacao, Posicao ) cylinder { < 0, -Altura/2, 0 >, < 0, Altura/2, 0 >, Raio SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao } #end #macro Torus ( Menor, Maior, Cor, Modo, Rotacao, Posicao ) torus { Maior, Menor SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao } #end #macro Esfera ( Raio, Cor, Modo, Rotacao, Posicao ) sphere { <0,0,0>, Raio SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao } #end #macro Texto ( Dado, Fonte, Grossura, Espaco, Cor, Modo, Rotacao, Posicao ) text { ttf Fonte Dado Grossura,Espaco SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao } #end // ============================================================================ // Montagem de pecas compostas ================================================ // ============================================================================ #macro SemiEsfera ( Raio, Cor, Modo, Rotacao, Posicao ) difference { Esfera ( Raio, Cor, Modo, <0,0,0>, <0,-Raio/2,0> ) Paralelepipedo ( , Cor, Modo, <0,0,0>, < 0,-Raio/2-Raio-1,0 >) SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao } #end #macro Bastonete ( Altura, Raio, Cor, Modo, Rotacao, Posicao ) union { Cilindro ( Altura-2*Raio+0.001, Raio, Cor, Modo, <0,0,0>, <0,0,0> ) SemiEsfera ( Raio, Cor, Modo, <0,0,0>, <0,(Altura-Raio)/2,0> ) SemiEsfera ( Raio, Cor, Modo, <0,0,180>, <0,-(Altura-Raio)/2,0> ) SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao } #end #macro OrbitaEsferas ( Raio, Orbita, Passos, Cor, Modo, Rotacao, Posicao ) #declare angulo = 0; union { #while ( angulo < 2*pi ) Esfera ( Raio, Cor, Modo, <0,0,0>, ) #declare angulo = angulo + 2*pi/Passos; #end SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao } #end #macro Taca ( Tamx, Tamy, Tamz, Cor, Modo, Rotacao, Posicao ) lathe { quadratic_spline 20, <0,0>, <2,0>, <2,0.5>, <1,1>, <0.5,1.5>, <0.35,3.5>, <1,4>, <2,4.5>, <2.5,5>, <2.7,5.5>, <2.6,6.5>, <2.5,7.5>, <2.4,7.5>, <2.5,6.5>, <2.6,5.5>, <2.4,5>, <1.9,4.5>, <0.9,4>, <.35,3.8>, <0,3.7> SelecionaCor ( Cor, Modo ) translate <0,-3.75,0> scale < Tamx/5.4, Tamy/7.5, Tamz/5.4 > rotate Rotacao translate Posicao } #end #declare CorLuz = <0.95,0.95,0.95>; #declare CorCabo = <0.8,0.8,0.8>; #declare CorContato = <0.1,0.1,0.1>; #macro Lampada ( Altura, Raio, Intensidade, Cor, Modo, Rotacao, Posicao ) union { // Bulbo lathe { cubic_spline 17, <0,0>,<1,0.2>,<1.8,1>,<1.9,2>,<1.5,3>,<1,4>,<0.8,5>,<0,5>, <0,4.1>,<0.7,4.1>,<0.9,4>,<1.4,3>,<1.8,2>,<1.7,1>,<0.9,0.2>,<0,0.1>,<0,0> SelecionaCor ( Cor, Modo ) } // Cabo lathe { cubic_spline 14, <0,4.9>,<0.9,4.9>,<1,5>,<1,5.1>,<0.9,5.2>,<0.9,5.3>,<1,5.4>, <1,5.5>,<0.9,5.6>,<0.9,5.7>,<1,5.8>,<1,5.9>,<0.9,6>,<0,6> SelecionaCor ( CorCabo, MODO_ESPELHO ) } // Contato exterior lathe { cubic_spline 7, <0,5.9>,<0.5,5.9>,<0.5,6.05>,<0.4,6>,<0.3,6.05>,<0.2,6.1>,<0,6.1> SelecionaCor ( CorContato, MODO_ESPELHO ) } // Fonte de luz FonteLuz ( <0,1,0>, CorLuz, Intensidade ) translate <0,-3.05,0> scale rotate Rotacao translate Posicao } #end // ============================================================================ // Montagem de pecas finais e da cena ========================================= // ============================================================================ // Cada braco tem 4 juntas // Ang sao os angulos iniciais, que sao somados com angulos aleatoreos // gerados por random #macro Braco ( Ang1, Ang2, Ang3, Ang4 ) #declare CorJunta = <0.5,0.5,0.5>; #declare CorPerna1 = <0.1,0.1,0.1>; #declare CorPerna2 = <0.9,0.3,0.3>; #declare CorPerna3 = <0.1,0.1,0.1>; #declare CorPerna4 = <0.9,0.3,0.3>; #declare LiberdadeY = 45; #declare LiberdadeZ = 90; /* #declare Ang1 = Ang1+<0,LiberdadeY*(rand(Semente)-0.5)*2,LiberdadeZ*rand(Semente)>; #declare Ang2 = Ang2+<0,0,LiberdadeZ*(rand(Semente)-0.5)>; #declare Ang3 = Ang3+<0,0,-LiberdadeZ*rand(Semente)>; #declare Ang4 = Ang4+<0,0,-LiberdadeZ*rand(Semente)>; */ union { // Ligado ao corpo Esfera ( 1, CorJunta, MODO_SOLIDO, 0, 0 ) Cilindro ( 10, 0.70, CorPerna1, MODO_ESPELHO, <0,0,90>, <5,0,0> ) union { // ParteA Esfera ( 0.75, CorJunta, MODO_SOLIDO, 0, <0,0,0> ) Cilindro ( 7, 0.40, CorPerna2, MODO_ESPELHO, <0,0,90>, <3.5,0,0> ) union { // ParteB Esfera ( 0.50, CorJunta, MODO_SOLIDO, 0, <0,0,0> ) Cilindro ( 5, 0.20, CorPerna3, MODO_ESPELHO, <0,0,90>, <2.5,0,0> ) union { // ParteC Esfera ( 0.25, CorJunta, MODO_SOLIDO, 0, <0,0,0> ) Cilindro ( 4, 0.10, CorPerna4, MODO_ESPELHO, <0,0,90>, <2,0,0> ) rotate Ang4 translate <5,0,0> } rotate Ang3 translate <7,0,0> } rotate Ang2 translate <10,0,0> } rotate Ang1 } #end #macro Corpo ( TamX, TamY, TamZ, Cor, Modo, Rotacao, Posicao ) object { Esfera ( 1, Cor, Modo, 0, 0 ) scale rotate Rotacao translate Posicao } #end #macro Cabeca ( TamX, TamY, TamZ, Cor, Modo, Rotacao, Posicao ) union { object { Esfera ( 1, Cor, Modo, 0, 0 ) scale <0.1,1,0.1> rotate <0,0,-15> translate <-0.5,0.9,0> } object { Esfera ( 1, Cor, Modo, 0, 0 ) scale <0.1,1,0.1> rotate <0,0,15> translate <0.5,0.9,0> } Esfera ( 1, Cor, Modo, 0, 0 ) scale rotate Rotacao translate Posicao } #end #macro Abdome ( Cor, Modo, Rotacao, Posicao ) Corpo ( 5, 6, 3, Cor, Modo, Rotacao, Posicao ) #end #macro Aranha() union { Cabeca ( 2,2,2,<0.1,0.1,0.1>,MODO_ESPELHO,0,<0,8,0>) Corpo ( 3, 8, 3, <0.1,0.1,0.1>, MODO_ESPELHO, 0, 0 ) Abdome ( <0.9,0.3,0.3>, MODO_SOLIDO, 0, <0,-13,0> ) // Inclusao das patas #declare contador = 0; #declare lado = +1; #declare altura = 1; #while ( contador < 8 ) #if ( contador=0 | contador=2 | contador=3 | contador=7 ) #declare clockp = clock0; #else #declare clockp = clock1; #end #if ( lado > 0 ) #if ( clockp < 0.5 ) object { Braco ( <0,60,sin(clockp*2*pi+pi/2)*10>,<0,-90,0>,<0,-15,0>,<0,-15,0> ) translate } #else object { Braco ( <0,60-sin(clockp*pi*2)*20,sin(clockp*2*pi+pi/2)*10>, <0,-90+sin(clockp*pi*2)*15,0>, <0,-15+sin(clockp*pi*2)*15,0>, <0,-15+sin(clockp*pi*2)*10,0> ) translate } #end #declare lado = -1; #else #if ( clockp < 0.5 ) object { Braco ( <0,-60,-sin(clockp*2*pi+pi/2)*10>,<0,90,0>,<0,15,0>,<0,15,0> ) scale -1 translate } #else object { Braco ( <0,-60+sin(clockp*pi*2)*20,-sin(clockp*2*pi+pi/2)*10>, <0,90-sin(clockp*pi*2)*15,0>, <0,15-sin(clockp*pi*2)*15,0>, <0,15-sin(clockp*pi*2)*10,0> ) scale -1 translate } #end #declare lado = +1; #end #declare contador = contador+1; #end rotate <-90,0,180> } #end // ============================================================================ // Camera e Iluminacao ======================================================== // ============================================================================ Camera ( V_ISOMETRICA_ESQUERDA, V_CENTRO ) FonteLuz ( <10.0,10.0,-10.0>, <1,1,1>, 2 ) FonteLuz ( < -4.0, 4.0,-4.0>, <1,1,1>, 1 ) // ============================================================================ // Composicao da Cena ========================================================= // ============================================================================ background { color rgb <0.7,0.7,0.7> } #declare Semente = seed(16067); Aranha() object { Paralelepipedo ( <1000,1,1000>,<1,1,1>,MODO_SOLIDO,0,<0,-10,0> ) pigment { checker color rgb <0.6,0.6,0.6> color rgb <0.5,0.5,0.5> } translate <0,0,clock*10> } // Interfaces das macros: // ---------------------- // Camera ( Visao, Alvo ) // FonteLuz ( Posicao, Cor, Intensidade ) // Plano ( Tipo, Posicao, Cor1, Cor2 ) // Ceu ( CorBaixa, CorAlta ) // Paralelepipedo ( Tam, Cor, Modo, Rotacao, Posicao ) // Cone ( Base, Topo, Altura, Cor, Modo, Rotacao, Posicao ) // Cilindro ( Altura, Raio, Cor, Modo, Rotacao, Posicao ) // Torus ( Menor, Maior, Cor, Modo, Rotacao, Posicao ) // Esfera ( Raio, Cor, Modo, Rotacao, Posicao ) // Texto ( Dado, Fonte, Grossura, Espaco, Cor, Modo, Rotacao, Posicao ) // SemiEsfera ( Raio, Cor, Modo, Rotacao, Posicao ) // Bastonete ( Altura, Raio, Cor, Modo, Rotacao, Posicao ) // OrbitaEsferas ( Raio, Orbita, Passos, Cor, Modo, Rotacao, Posicao ) // Taca ( Tamx, Tamy, Tamz, Cor, Modo, Rotacao, Posicao )