// 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  <0.0, 0.4, 2.0 >  // Posição do observador.
//  location  <0.0, 4.5, -1.0 >  // Posição do observador.
  location  <-1.5, +1.1, -1.2 >  // Posição do observador.
  right     -1*x                   // Largura RELATIVA da imagem.
  up        0.75*y                 // Altura RELATIVA da imagem.      
  sky       y                      // Qual direção é "para cima"?
//  look_at   <0.0, 0, 0 >  // Para onde a câmera está apontando.
  look_at   <-0.3, +0.65, 0 >  // 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 {
  < -2.0, +1.5, -2.5 >              // Posição da lâmpada.
  color rgb 2.0 * < 1.00, 1.00, 1.00 >   // Intensidade e corda luz.
} 

light_source {
   < -2.0, +1.5, +2.5 >             // Posição da lâmpada.
   color rgb 2.0 * < 1.00, 1.00, 1.00 >   // Intensidade e corda luz.
} 

light_source {
   < +2.0, +1.5, 0 >             // Posição da lâmpada.
   color rgb 2.0 * < 1.00, 1.00, 1.00 >   // Intensidade e corda luz.
} 

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

background{ color rgb < 0.20, 0.15, 0.05 > }

#declare tinta_braco = 
  texture {
    pigment { color rgb < 0.60, 0.60, 0.60 > }
    finish { diffuse 0.05 specular 0.20 roughness 0.05 
             ambient 0.05 reflection color rgb < 0.60, 0.60, 0.60 > }
  }

#declare tinta_robo = 
  texture {
    pigment { color rgb < 0.20, 0.20, 0.60 > }
  }

#declare tinta_delinquente = 
  texture {
    pigment { color rgb < 0.10, 0.40, 0.15 > }
  }

#declare tinta_rosto_delinquente = 
  texture {
    pigment { color rgb < 0.10, 0.10, 0.10 > }
  }

#declare tinta_rosto_robo = 
  texture {
    pigment { color rgb < 0.30, 0.30, 0.05 > }
  }

#declare cor_caixa_rotacao = 
  texture {
    pigment { color rgb < 0.05, 0.05, 0.10 > }
  }

// Momentos do movimento:
#declare t0 = 0;
#declare t1 = 0.5;
#declare t2 = 1.0;

#if (clock >= t1)
// Ângulos iniciais e finais do movimento planejado.
#declare angGarraIni = 40;
#declare angGarraFim = 40;

#declare angRotGarraIni = 90;
#declare angRotGarraFim = 90;

#declare angCotoveloIni = -85;
#declare angCotoveloFim = -85;

#declare angVerOmbroIni = 0;
#declare angVerOmbroFim = -70;

#declare angHorOmbroIni = -50;
#declare angHorOmbroFim = -50;

#declare angDelIni = 0;
#declare angDelFim = -70;

// Ângulo de abertura da garra, de 0 a 90º. 0 é a garra fechada.
#declare angGarra = angGarraIni + (clock - t1)/(t2-t1) * (angGarraFim - angGarraIni);
// Ângulo de rotação entre 2º e 3º braços. Entre -90º e +90º
#declare angRotGarra = angRotGarraIni + (clock - t1)/(t2-t1) * (angRotGarraFim - angRotGarraIni);
// Ângulo de articulação entre 1º e 2º braços. O Eixo é vertical e a rotação na
// horizontal quando o 1º braço não está rotacionado em relação ao robô.
#declare angCotovelo = angCotoveloIni + (clock - t1)/(t2-t1) * (angCotoveloFim - angCotoveloIni);
// Ângulo de articulação entre o troco e o 1º braço. O eixo é horizontal e o
// movimento é vertical.
#declare angVerOmbro = angVerOmbroIni + (clock - t1)/(t2-t1) * (angVerOmbroFim - angVerOmbroIni);
// Ângulo de articulação entre o troco e o 1º braço. O eixo é vertical e o
// movimento é horizontal.
#declare angHorOmbro = angHorOmbroIni + (clock - t1)/(t2-t1) * (angHorOmbroFim - angHorOmbroIni);
// Ângulo do delinquente em relação ao eixo x.
#declare angDel = angDelIni + (clock - t1)/(t2-t1) * (angDelFim - angDelIni);

#else #if (clock >= t0) 

// Ângulos iniciais e finais do movimento planejado.
#declare angGarraIni = 5;
#declare angGarraFim = 40;

#declare angRotGarraIni = 0;
#declare angRotGarraFim = 90;

#declare angCotoveloIni = -20;
#declare angCotoveloFim = -85;

#declare angVerOmbroIni = 0;
#declare angVerOmbroFim = 0;

#declare angHorOmbroIni = -20;
#declare angHorOmbroFim = -50;

#declare angDelIni = 0;
#declare angDelFim = 0;

// Ângulo de abertura da garra, de 0 a 90º. 0 é a garra fechada.
#declare angGarra = angGarraIni + (clock - t0)/(t1-t0)* (angGarraFim - angGarraIni);
// Ângulo de rotação entre 2º e 3º braços. Entre -90º e +90º
#declare angRotGarra = angRotGarraIni + (clock - t0)/(t1-t0) * (angRotGarraFim - angRotGarraIni);
// Ângulo de articulação entre 1º e 2º braços. O Eixo é vertical e a rotação na
// horizontal quando o 1º braço não está rotacionado em relação ao robô.
#declare angCotovelo = angCotoveloIni + (clock - t0)/(t1-t0) * (angCotoveloFim - angCotoveloIni);
// Ângulo de articulação entre o troco e o 1º braço. O eixo é horizontal e o
// movimento é vertical.
#declare angVerOmbro = angVerOmbroIni + (clock - t0)/(t1-t0) * (angVerOmbroFim - angVerOmbroIni);
// Ângulo de articulação entre o troco e o 1º braço. O eixo é vertical e o
// movimento é horizontal.
#declare angHorOmbro = angHorOmbroIni + (clock - t0)/(t1-t0) * (angHorOmbroFim - angHorOmbroIni);
// Ângulo do delinquente em relação ao eixo x.
#declare angDel = angDelIni + (clock - t0)/(t1-t0) * (angDelFim - angDelIni);

#end #end

#declare pinca = 
  object {
    difference {
      cylinder { <0,0,-0.05>, <0,0,+0.05>, 0.06 }
      cylinder { <0,0,-0.06>, <0,0,+0.06>, 0.05 }
      box { <-0.07, -0.07, -0.06>, <+0.07,0,+0.06> }
    }
    translate <+0.06,0,0>
    texture { tinta_braco }
  }

#declare garra =
  union {
    object { pinca rotate angGarra*z }
    object { pinca rotate 180*x rotate -angGarra*z }
  }

#declare braco3 = 
  union {
    cone { <0,0,0>, 0.04, <+0.20,0,0>, 0.025 texture { tinta_braco } }
    box { <0,-0.04,-0.005>, <+0.20,+0.04,+0.005> texture { cor_caixa_rotacao }}
    object { garra translate <+0.21,0,0> }
  }

#declare braco2 = 
  union {
    cylinder { <0,0,0>, <+0.20,0,0>, 0.04 texture { tinta_braco } }
    cylinder { <+0.19,0,0>, <+0.22,0,0> 0.03 texture { tinta_braco } }
    object { braco3 rotate angRotGarra*x translate <+0.21,0,0> }
  }

#declare braco1 = 
  union {
    sphere { <0,0,0>, 0.06 texture { tinta_braco } }
    cylinder { <0,0,0>, <+0.30,0,0>, 0.04 texture { tinta_braco } }
    sphere { <+0.30,0,0>, 0.06 texture { tinta_braco } }
    object { braco2 rotate angCotovelo*y translate <+0.30,0,0> }
  }

#declare altura_ombro = 0.45;
#declare robo = 
  union {
    box { <-0.20,0,-0.15>, <+0.20,+0.60,+0.15> texture { tinta_robo } }
    object { braco1 rotate angHorOmbro*y rotate angVerOmbro*x translate <+0.23,altura_ombro,0> }
    object { braco1 rotate angHorOmbro*y rotate angVerOmbro*x scale <-1,1,1> translate <-0.23,altura_ombro,0>}
    object { sphere { <0,+0.65, 0>, 0.12 texture { tinta_rosto_robo } } }
  }

#declare delinquente = union {
  object { cylinder { <0,0,+0.65>, <0,+0.6,+0.65>, 0.13 texture { tinta_delinquente } } }
  object { sphere { <0,+0.64,+0.65>, 0.10 texture { tinta_rosto_delinquente }} }
  translate <0,-altura_ombro,0> rotate angDel*x translate <0,altura_ombro,0> 
  }

#declare chao =
  plane {
    y,
    0
    texture {
      pigment { checker <0.15, 0.05, 0>, <0.15, 0.15, 0.15> }
      finish {ambient 0.01 diffuse 0.8}
      scale 2
    }
  }

// A cena
union {
  object { robo }
  object { delinquente }
  object { chao }
}