// Exemplo de arquivo de descricao de cena para POV-ray
// Last edited on 2017-05-07 20:10:09 by stolfilocal

// ======================================================================
// CORES E TEXTURAS

background{ color rgb < 0.65, 0.60, 0.35 > }

#declare tx_blue = 
  texture{
    pigment{ color rgb < 0.00, 0.00, 0.30 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }      
  
#declare tx_silver = 
  texture{
    pigment{ color rgb < 0.80, 0.80, 0.80 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }    
  
#declare tx_black = 
  texture{
    pigment{ color rgb < 0.10, 0.10, 0.10 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }
// ======================================================================
// DESCRIÇÃO DA CENA 

// Partes da cena:

#declare n = 5;
#declare m = 3;  
#declare roleta = seed(25);  

#include "eixos.inc"   

#macro robo(braco_graux, braco_grauy, braco_grauz,
            ante_grauy, 
            mao_graux, mao_grauy, mao_grauz, 
            polegar_grauz, garrap_grauz, dedo1_grauy, garra1_grauz, dedo2_grauy, garra2_grauz
            braco2_graux, braco2_grauy, braco2_grauz,
            ante2_grauy, 
            mao2_graux, mao2_grauy, mao2_grauz, 
            polegar2_grauz, garrap2_grauz, dedo12_grauy, garra12_grauz, dedo22_grauy, garra22_grauz)   
    union{  
        //body
        cylinder{
            <0.00, 0.00, 0.00>
            <0.00, 0.00, 4.00>
            1.00             
            texture{ tx_blue }
        }   
        //head
        cylinder{
            <0.00, 0.00, 0.00>
            <0.00, 0.00, 4.55>
            0.60             
            texture{ tx_blue }
        }
        //axle
        cylinder{
            <0.00, -1.20, 0.40>
            <0.00, 1.20, 0.40>
            0.10             
            texture{ tx_silver }
        }  
        //wheel 1
        cylinder{
            <0.00, -1.20, 0.40>
            <0.00, -1.40, 0.40>
            0.60             
            texture{ tx_blue }
        }       
        //wheel 2
        cylinder{
            <0.00, 1.20, 0.40>
            <0.00, 1.40, 0.40>
            0.60             
            texture{ tx_blue }
        }    
        object{
            braco(ante_grauy, 
                  mao_graux, mao_grauy, mao_grauz, 
                  polegar_grauz, garrap_grauz, dedo1_grauy, garra1_grauz, dedo2_grauy, garra2_grauz)
            rotate<braco_graux, braco_grauy, braco_grauz> translate<0.00, -1.25, 3.50>
        }
        object{
            braco(ante2_grauy, 
                  mao2_graux, mao2_grauy, mao2_grauz, 
                  polegar2_grauz, garrap2_grauz, dedo12_grauy, garra12_grauz, dedo22_grauy, garra22_grauz)
            rotate<braco2_graux, braco2_grauy, braco2_grauz> translate<0.00, -1.25, 3.50> scale<1.00, -1.00, 1.00>
        }  
    }
#end  

#macro braco(ante_grauy, 
             mao_graux, mao_grauy, mao_grauz, 
             polegar_grauz, garrap_grauz, dedo1_grauy, garra1_grauz, dedo2_grauy, garra2_grauz) 
    union{
        sphere{ 
            <0.00, 0.00, 0.00>, 0.30  
            texture{ tx_black }
        }  
        cylinder{
            <0.00, 0.00, 0.00>
            <0.00, 0.00, 1.50>
            0.10
            texture{ tx_silver }
        }
        object{
            antebraco(mao_graux, mao_grauy, mao_grauz, 
                      polegar_grauz, garrap_grauz, dedo1_grauy, garra1_grauz, dedo2_grauy, garra2_grauz) 
            rotate<0.00, ante_grauy, 0.00> translate<0.00, 0.00, 1.50>
        }
    }
#end

#macro antebraco(mao_graux, mao_grauy, mao_grauz, 
                 polegar_grauz, garrap_grauz, dedo1_grauy, garra1_grauz, dedo2_grauy, garra2_grauz)
    union{
        cylinder{
            <0.00, 0.00, 0.00>
            <0.00, 0.00, 1.50>
            0.10
            texture{ tx_silver }
        }
        object {
            mao(polegar_grauz, garrap_grauz, dedo1_grauy, garra1_grauz, dedo2_grauy, garra2_grauz)
            rotate<mao_graux, mao_grauy, mao_grauz> translate<0.00, 0.00, 1.50> 
        }
    }
#end 

#macro mao(polegar_grauz, garrap_grauz, dedo1_grauy, garra1_grauz, dedo2_grauy, garra2_grauz) 
    union{
        sphere{ 
            <0.00, 0.00, 0.00>, 0.22  
            texture{ tx_black }
        }
        object{ dedo(garrap_grauz) rotate<0.00, 0.00, polegar_grauz> translate<0.00, 0.18, 0.00> }
        object{ dedo(garra1_grauz) rotate<90.00, dedo1_grauy, 0.00> translate<0.00, 0.16, 0.16> } 
        object{ dedo(garra2_grauz) rotate<90.00, dedo2_grauy> translate<0.00, -0.16, 0.16> } 
    }
#end           

#macro dedo(garra_grauz)   
    union{       
        box{
            <0.00, 0.00, -0.11>,
            <0.15, 0.40, 0.11>
            texture{ tx_silver }
        }
        object{ dedogarra() rotate<0.00, 0.00, garra_grauz> translate <0.00, 0.40, 0.00> }
    }
#end 

#macro dedogarra()   
    union{       
        box{
            <0.00, 0.00, -0.11>,
            <0.15, 0.40, 0.11>
            texture{ tx_silver }
        }
    }
#end

#macro interpola1(tt, tt0, tt1, vv0, vv1)     
    #local rr = (tt - tt0)/(tt1 - tt0);
    #local vv = (1 - rr)*vv0 + rr*vv1;
    vv;
#end    

#macro robo_vet(vet)
    robo(vet[0], vet[1], vet[2],
         vet[3], 
         vet[4], vet[5], vet[6], 
         vet[7], vet[8], vet[9], vet[10], vet[11], vet[12]
         vet[13], vet[14], vet[15],
         vet[16], 
         vet[17], vet[18], vet[19], 
         vet[20], vet[21], vet[22], vet[23], vet[24], vet[25])
#end

#macro robo_mov(tt) 
    #local pp0 = array[26];
    #local pp1 = array[26];
    #local pp = array[26]; 
    //posicao 0
    //braco 1
    #local pp0[0] = 0.00;
    #local pp0[1] = -40.00;
    #local pp0[2] = 90.00;  
    //ante e mao 1
    #local pp0[3] = 40.00;
    #local pp0[4] = 0.00;
    #local pp0[5] = -90.00;
    #local pp0[6] = 0.00;
    //dedos 1
    #local pp0[7] = -20.00;
    #local pp0[8] = -20.00;
    #local pp0[9] = 0.00;
    #local pp0[10] = 0.00;
    #local pp0[11] = 0.00;
    #local pp0[12] = -10.00;  
    //braco 2
    #local pp0[13] = 10.00;
    #local pp0[14] = -130.00;
    #local pp0[15] = 0.00;  
    //ante e mao 2
    #local pp0[16] = -90.00;
    #local pp0[17] = -10.00;
    #local pp0[18] = -20.00;
    #local pp0[19] = 0.00;
    //dedos 2
    #local pp0[20] = 0.00;
    #local pp0[21] = -45.00;
    #local pp0[22] = -45.00;
    #local pp0[23] = -45.00;
    #local pp0[24] = -45.00;
    #local pp0[25] = -45.00;
    
    //posicao 1
    //braco 1
    #local pp1[0] = 0.00;
    #local pp1[1] = 170.00;
    #local pp1[2] = 0.00;  
    //ante e mao 1
    #local pp1[3] = -90.00;
    #local pp1[4] = 0.00;
    #local pp1[5] = 0.00;
    #local pp1[6] = 90.00;
    //dedos 1
    #local pp1[7] = 0.00;
    #local pp1[8] = 0.00;
    #local pp1[9] = 0.00;
    #local pp1[10] = -90.00;
    #local pp1[11] = 0.00;
    #local pp1[12] = -90.00;  
    //braco 2
    #local pp1[13] = 10.00;
    #local pp1[14] = -130.00;
    #local pp1[15] = 0.00;  
    //ante e mao 2
    #local pp1[16] = -90.00;
    #local pp1[17] = -10.00;
    #local pp1[18] = -20.00;
    #local pp1[19] = 0.00;
    //dedos 2
    #local pp1[20] = 0.00;
    #local pp1[21] = -45.00;
    #local pp1[22] = -45.00;
    #local pp1[23] = -45.00;
    #local pp1[24] = -45.00;
    #local pp1[25] = -45.00;
    
    //posicao generica
    #local i = 0;
    #while (i < 26)   
        #local pp[i] = interpola1(tt, 0, 1, pp0[i], pp1[i])
        #local i = i + 1; 
    #end  
    
    object { robo_vet(pp) }
    
#end        

// Aqui está a cena, finalmente:

union{
  object{ eixos(3.00) }     
  //object { assento(false) translate <7.00, 0.00, 0.00> }   
  //auditorio(m,n)       
  //object {auditorio(m,n) translate<0.00, -(n+1.00), 0.00>}      
  //object { palco pigment{ color<0.50, 0.20, 0.00>} } 
  //polegar() 
  //maogarra()   
  object {robo_mov(0) translate <0.00, -5.00, 0.00>} 
  robo_mov(0.7)  
  object {robo_mov(1) translate <0.00, 5.00, 0.00>} 
}

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 3.00 >;
#declare raio_cena = 9.0;
#declare dir_camera = < 10.00, -7.00, 1.00 >;
#declare dist_camera = 12*raio_cena;
#declare intens_luz = 1.20;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)