// Exemplo de arquivo de descricao de cena para POV-ray
// Last edited on 2003-07-31 12:50:37 by stolfi

// ======================================================================
// CÂMERA 

camera {
    sky z
    location 0.6 * < -8.00, 12.00, 5.00 > // Posição do observador.
    look_at  < 8.00, -8.00, 1.00 > // Para onde a câmera está apontando.

//    location < 2.00, 1.00, 8.00 > // Posição do observador.
//    look_at  < 2.00, 1.00, 0.00 > // Para onde a câmera está apontando.
} 

// ======================================================================
// FONTES DE LUZ

light_source {
    < -2.00, 0.00, 5.00 >               // Posição da lâmpada.
    color rgb < 1.00, 1.00, 1.00 > // Intensidade e cor da luz.
} 

light_source {
    < -2.00, 0.00, 0.10 >               // Posição da lâmpada.
    color rgb < 1.00, 1.00, 1.00 > // Intensidade e cor da luz.
} 

// ======================================================================
// DESCRIÇÃO DA CENA 

background { color rgb < 0.98, 1.00, 0.75 > }

#declare Semente = seed ( 12345 );

#declare clock0 = clock;
#declare clock1 = mod(clock + 0.50, 1);

#declare plano_xy = // z = 0
    plane {
        < 0, 0, 1 >,
        0
    }

#declare aux = 1;

#declare p3 =
   union {

      sphere {
         < 0.00, 0.00, 0.00 >, 0.10 
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      } 

      cylinder {
         < 0.00, 0.10, 0.00 >, < 0.00, 0.4, 0.00>, 0.10 
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      }

   }

#declare p2 =
   union {

      sphere {
         < 0.00, 0.00, 0.00 >, 0.10 
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      } 

      cylinder {
         < 0.00, 0.10, 0.00 >, < 0.00, 0.5, 0.00>, 0.05 
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      }

      #declare delt = 0;
      object { 
         p3
         rotate < -delt, delt, 0>
         translate < 0.00, 0.50, 0.00>
      }

   }

#declare p1 =
   union {

      sphere {
         < 0.00, 0.00, 0.00 >, 0.10 
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      } 

      cylinder {
         < 0.00, 0.10, 0.00 >, < 0.00, 0.5, 0.00>, 0.05 
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      }

      #declare gama = 60;
      object { 
         p2
         rotate gama * x
         translate < 0.00, 0.50, 0.00>
      }

   }


#declare perna =
   union {

      sphere {
         < 0.00, 0.00, 0.00 >, 0.10 
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      } 

      cylinder {
         < 0.00, 0.10, 0.00 >, < 0.00, 0.60, 0.00>, 0.05 
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      }

      #declare beta0 = 45 * cos(2*pi*clock0);
      #declare beta1 = 45 * cos(2*pi*clock1);

      object { 
         p1
         #if (mod(aux,2)=0)
            rotate beta0 * y
         #else
            rotate beta1 * y
         #end
         translate < 0.00, 0.60, 0.00>
      }

   }

#declare corpo = 
   union {

      #declare L = 4; // comprimento corpo
      #declare PP = 3; // pares de pernas

      // cabeca    
      sphere {
         < -0.40, 0.85, 0.4 >, 0.4 
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      } 

      // corpo
      box {
         < 0.00, 0.00, 0.00>,
         <    L, 1.90, 0.80>
         pigment { color rgb <rand(Semente), rand(Semente), rand(Semente)> }
      }

      // pernas
      #while (aux <= PP)

         #declare alfa = 10 * abs(cos(2*pi*clock0));

         object {
            perna
            scale < -1, -1, 1 >
            rotate -alfa * x
            translate < aux * ( L / ( PP + 1 ) ), 0.00, 0.80>
         }

         object {
            perna
            rotate alfa * x
            translate < aux * ( L / ( PP + 1 ) ), 1.90, 0.80>
         }

         #declare aux = aux + 1;
      #end

   }

// Aqui está a cena, finalmente:
union {
//   object { plano_xy pigment { checker rgb < 0.00, 0.00, 0.30 >, < 0.00, 0.00, 0.50 > } }

   object {
      corpo
      rotate 180 * x
      translate < 0.00, 0.00, 2.50 >
   }
}