// ======================================================================
// LABORATÓRIO 06 - COMPUTAÇÃO GRÁFICA
// O LONGO BRAÇO DA LEI
// RAFAEL LAMARE SILVEIRA 009669
// DESCRIÇÃO: ESTUDO DE ARTICUÇÕES. DEDOS ARTICULADOS ÀS MÃOS;
// MÃO ARTICULADA AO ANTEBRACO; ANTREBRAÇO ARTICULADO AO BRAÇO,
// CUJO BÍCEPS VARIA DE VOLUME QUANDO CONTRAI-SE O ANTEBRAÇO;
// ANTEBRAÇO ARTICULADO AO OMBRO QUE O FAZ GIRAR.
// ======================================================================

#include "colors.inc"

#declare semente = seed(4345);

// Exemplo de arquivo de descricao de cena para POV-ray
// Last edited on 2003-09-04 15:25:26 by stolfi

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

camera {
  location  < 50.00, 50.00, 50.00 >  // Posição do observador.
  right     -1.0*x                // Largura RELATIVA da imagem.
  up        0.75*y                 // Altura RELATIVA da imagem.      
  sky       -z                      // Qual direção é "para cima"?
  look_at   <  10, 0, -5 >  // Para onde a câmera está apontando.
} 
// Nota: os parâmetros "right" e "up" devem ter a mesma proporção
// que os parâmetros ${WIDTH} e ${HEIGHT} no Makefile.

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

light_source {
  10 * < +50.0, +30.0, +50.0 >              // Posição da lâmpada.
  color rgb 1.2 * < 1.00, 1.00, 1.00 >   // Intensidade e corda luz.
} 

light_source {
  10 * < +50.0, -10.0, +10.0 >             // Posição da lâmpada.
  color rgb 0.8 * < 1.00, 1.00, 1.00 >   // Intensidade e corda luz.
} 

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

background{ color rgb < 0.75, 0.80, 0.85 > }



//===========================================================================
// VARIÁVEIS DE CONTROLE

// Variáveis das articulações
#declare beta1 = 45;  // antebraco
#declare tau1 = 0;  // dedos
#declare phi1 = 10;  // giro do braco
#declare phi2 = -10;   // giro do braço em z

// Divindindo a cena em intervalos
#if (clock < 0.25)	// desdobra os antebraços
  #declare beta1 = beta1 - (clock/0.25)*45;
#else
  #if (clock < 0.5)	// fecha os braços
    #declare phi1 = phi1 - ((clock-0.25)/0.25)*20;
  #else
    #if (clock < 0.65)	//fecha os dedos
      #declare tau1 = tau1 + ((clock-0.50)/0.25)*45;
    #else		//levanta os braços
      #declare phi2 = phi2 + ((clock-0.65)/0.35)*40;
      #declare tau1 = tau1 + 45;
    #end
    #declare phi1 = phi1 - 20;  
  #end

  // Mais um movimento para o antebraço:
  // quando vai erguer o objeto.
  #if (clock < 0.65)
    #declare beta1 = beta1 - 45;
  #else 
    #declare beta1 = beta1 - 45 + ((clock-0.65)/0.35)*30;
  #end

#end

#declare biceps = 2.5 + (beta1/45)*1.5;


// ======================================================================
// OBJETOS


#declare dedos = 
  union {
  #declare i = 1;
  #while (i < 5)
  object {
    cylinder {
      <0,0,0>, <5.5,0,0>, 0.5
      rotate <0, tau1 + i*20, 20*i - 40>
      pigment { Green }
    }
  }
  #declare i = i + 1;
  #end
  }

#declare mao = 
  union {
    cylinder {
      <0,0,0>, <0,0,1>, 2
      pigment { Yellow }
    }
    object {
      dedos
      translate <1.0,0,0>
    }
  }


#declare anteBraco =
  union {
    cone {
      <0,0,0>, 2.0, <12,0,0>, 1.5
      pigment { Red }
    }
    sphere {
      <1,0,0>, 2.0
      pigment { Red }
    }
    sphere {
      <12,0,0>, 1.5
      pigment { Yellow }
    }
    object {
      mao 
      //rotate <0,alfa,0>
      translate <12,0,0>
    }
  }

#declare braco = 
  object {
  union {
     sphere {
       <0,0,0>, 2.8
       pigment { Yellow }
     }
     union {
       cone {
         <0,0,0>, 1.5, <7,0,0>, biceps
         pigment { Brown }
       }
       cone {
         <7,0,0>, biceps, <14,0,0>, 1.5
         pigment { Brown }
       }
     }
     object {
       anteBraco
       rotate <0,beta1,0>
       translate <14,0,0>
     }
  }
  rotate <0,phi2,phi1>
  }


#declare dois_bracos =
  union {
    object {
      braco
    }
    object {
      braco 
      translate <0,15,0>
      scale <0,-1,0>
    }
  }

#declare corpo =
  union {
    cone {
      <0,0,0>, 10, <0,0,40>, 15
      pigment { Brown }
    }
    sphere {
      <0,0,-18>, 8
      pigment { Yellow }
    }
    object {
      dois_bracos
      translate <7,6,6>
    }
  }

#declare objeto =
  object {
  cylinder {
    <31,0,-10>, <31,0,10>, 2
    pigment { Blue }
  }
  rotate <0,phi2,0>
  }
    

union {
  object {
    corpo
    translate <0,0,-5>
  }
  objeto
}