// Last edited on 2003-12-10 23:56:17 by stolfi // ============================================================================ // MC930A - Computacao Grafica ============================================= // Eduardo Uemura Okada RA 001606 ============================================= // Laboratorio XX ============================================= // ============================================================================ // ============================================================================ // Declaracao de constantes =================================================== // ============================================================================ #declare bz_name = "Homer Simpson" #declare bz_scale = 0.36; #include "bz-things.inc" // Modos de texturas #declare MODO_SOLIDO = 0; #declare MODO_CRISTAL = 1; #declare MODO_ESPELHO = 2; #declare MODO_VIDRO = 3; // 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>; // ============================================================================ // 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 right -0.75*x up 1.00*y 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 // ============================================================================ // 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 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 #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 retalho de uma cor // bolinhas sphere{A11,etc} // cilindros {a11,a12,etc} #macro SuperficieBezier ( P11, P12, P13, P14, P21, P22, P23, P24, P31, P32, P33, P34, P41, P42, P43, P44, Tamanho, Cor, Modo, Translacao ) bicubic_patch { type 0 u_steps 4 v_steps 4 P11,P12,P13,P14,P21,P22,P23,P24,P31,P32,P33,P34,P41,P42,P43,P44 SelecionaCor ( Cor, Modo ) } union { #declare RaioEsfera = 0.0200; #declare CorEsfera = 0.7*Cor + 0.3*<1.0,0.5,0.5>; #declare ModoEsfera = MODO_SOLIDO; Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P11 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P12 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P13 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P14 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P21 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P22 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P23 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P24 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P31 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P32 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P33 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P34 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P41 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P42 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P43 ) Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P44 ) #declare RaioCilindro = 0.0100; #declare CorCilindro = 0.7*Cor + 0.3*<0.5,1.0,0.5>; #declare ModoCilindro = MODO_SOLIDO; cylinder { P11, P12, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P11, P21, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P12, P13, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P12, P22, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P13, P14, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P13, P23, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P14, P24, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P23, P24, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P21, P22, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P22, P23, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P21, P31, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P31, P41, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P22, P32, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P32, P42, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P23, P33, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P33, P43, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P24, P34, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P34, P44, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P31, P32, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P32, P33, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P33, P34, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P41, P42, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P42, P43, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } cylinder { P43, P44, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) } scale Tamanho translate Translacao } #end #macro QuadrantePosteriorDireito(Cor) #declare A11 = <0,1,-0.75>; #declare A12 = <0.2,0.95,-0.75>; #declare A13 = <0.4,0.90,-0.75>; #declare A14 = <0.6,0.8,-0.75>; #declare A21 = <0,0.6,0>; #declare A22 = <0.375,0.6,0>; #declare A23 = <0.75,0.6,-0.375>; #declare A24 = <0.75,0.6,-0.75>; #declare A31 = <0,0.3,0>; #declare A32 = <0.375,0.3,0>; #declare A33 = <0.75,0.3,-0.375>; #declare A34 = <0.75,0.3,-0.75>; #declare A41 = <0,0,0>; #declare A42 = <0.375,0,0>; #declare A43 = <0.75,0,-0.375>; #declare A44 = <0.75,0,-0.75>; SuperficieBezier ( A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44,1,Cor,MODO_ESPELHO,0 ) #end #macro LoboPosterior(Cor1,Cor2) QuadrantePosteriorDireito(Cor1) union { QuadrantePosteriorDireito(Cor2) scale <-1,1,1> } #end #macro NucaDireita(Cor) #declare A11 = <0,0,0>; #declare A12 = <0.375,0,0>; #declare A13 = <0.75,0,-0.375>; #declare A14 = <0.75,0,-0.75>; #declare A21 = <0,-0.5,0>; #declare A22 = <0.375,-0.5,0>; #declare A23 = <0.75,-0.5,-0.375>; #declare A24 = <0.75,-0.5,-0.75>; #declare A31 = <0,-1,-0.375>; #declare A32 = <0.375,-1,0>; #declare A33 = <0.75,-1,-0.375>; #declare A34 = <0.75,-1,-0.75>; #declare A41 = <0,-2,-0.75>; #declare A42 = <0.375,-2,-0.75>; #declare A43 = <0.75,-2,-0.75>; #declare A44 = <0.75,-2,-0.75001>; SuperficieBezier ( A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44,1,Cor,MODO_ESPELHO,0 ) #end #macro RostoDireitoAux(Cor) #declare A11 = <0,0,-0.75>; #declare A12 = <0.375,0,-0.75>; #declare A13 = <0.75,0,-0.375>; #declare A14 = <0.75,0,-0>; #declare A21 = <0,-0.4,-0.75>; #declare A22 = <0.375,-0.4,-0.75>; #declare A23 = <0.75,-0.3,-0.45>; #declare A24 = <0.75,-0.4,0>; #declare A31 = <0,-0.8,-1.5>; #declare A32 = <0.175,-0.8,-1.2>; #declare A33 = <0.75,-0.5,-0.3>; #declare A34 = <0.75,-0.5001,0>; #declare A41 = <0,-1,-0.75>; #declare A42 = <0.375,-1,-0.75>; #declare A43 = <0.75,-1,-0.375>; #declare A44 = <0.75,-1,0>; SuperficieBezier ( A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44,1,Cor,MODO_ESPELHO,0 ) #end #macro RostoDireito(Cor) union { RostoDireitoAux(Cor) translate <0,0,-0.75> } #end #macro BocaDireitaAux(Cor) #declare A11 = <0,-1,-0.75>; #declare A12 = <0.375,-1,-0.75>; #declare A13 = <0.75,-1,-0.375>; #declare A14 = <0.75,-1,0>; #declare A21 = <0,-1.4,-1.4>; #declare A22 = <0.375,-1.4,-1.2>; #declare A23 = <0.75,-1.4,-1>; #declare A24 = <0.75,-1.4,0>; #declare A31 = <0,-1.6,-1>; #declare A32 = <0.375,-1.6,-1>; #declare A33 = <0.75,-1.6,-0.75>; #declare A34 = <0.75,-1.6,0>; #declare A41 = <0,-2,-0.75>; #declare A42 = <0.375,-2,-0.75>; #declare A43 = <0.75,-2,-0.375>; #declare A44 = <0.75,-2,0>; SuperficieBezier ( A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44,1,Cor,MODO_ESPELHO,0 ) #end #macro BocaDireita(Cor) union { BocaDireitaAux(Cor) translate <0,0,-0.75> } #end #macro Cabeca() LoboPosterior(<1.0,0.7,0.2>, <0.7,1.0,0.2>) union { LoboPosterior(<1.0,0.7,0.4>, <0.7,1.0,0.4>) scale <1,1,-1> translate <0,0,-1.5> } NucaDireita(<1.0,0.5,0.2>) union { NucaDireita(<0.5,1.0,0.2>) scale <-1,1,1> } RostoDireito(<1.0,0.8,0.6>) union { RostoDireito(<0.8,1.0,0.6>) scale <-1,1,1> } BocaDireita(<0.40,0.45,0.50>) union { BocaDireita(<0.50,0.45,0.40>) scale <-1,1,1> } // Olhos union { Esfera ( 0.4, 1, MODO_SOLIDO, 0, 0 ) object { Esfera ( 0.03, 0, MODO_SOLIDO, 0, <0,0,-0.4> ) rotate <40,-40,0> } translate <0.4,-0.4,-1.4> } union { Esfera ( 0.4, 1, MODO_SOLIDO, 0, 0 ) object { Esfera ( 0.03, 0, MODO_SOLIDO, 0, <0,0,-0.4> ) rotate <30,-30,0> } translate <-0.4,-0.4,-1.4> } // Cabelos OrbitaEsferas ( 0.02, 0.4, 100, 0, MODO_SOLIDO, 0, <0,0.7,-0.70> ) OrbitaEsferas ( 0.02, 0.4, 100, 0, MODO_SOLIDO, 0, <0.1,0.7,-0.85> ) #end // ============================================================================ // Camera e Iluminacao ======================================================== // ============================================================================ // Camera ( V_ISOMETRICA_DIREITA, 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 } #declare scene = union { union { Cabeca() translate <0,0.5,1> rotate 150*y scale 3.0 } // object{ bz_axes } } object{ bz_checker_bg } object{ scene translate bz_rite_pos } object{ scene rotate -90*y translate bz_left_pos } // 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 ) // OrbitaEsferas ( Raio, Orbita, Passos, Cor, Modo, Rotacao, Posicao )