// CORES E TEXTURAS
background{ color rgb < 0.75, 0.80, 0.85 > }
#declare tx_plastico =
texture{
pigment{ color rgb < 0.10, 0.80, 1.00 > }
finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
}
#declare tx_xadrez =
texture{
pigment{ checker color rgb < 0.10, 0.32, 0.60 >, color rgb < 1.00, 0.97, 0.90 > }
finish{ diffuse 0.9 ambient 0.1 }
scale 2.0
}
#declare tx_preto =
texture{
pigment{ color rgb < 0.00, 0.00, 0.00 > }
}
// DESCRIÇÃO DA CENA
#declare fino = 0.100;
#declare grosso = 1.000;
#declare NQ = 6; //Nº de quadros
//Perna Esquerda Secundaria
#declare pes = array[NQ];
#declare pes[0] = 30;
#declare pes[1] = 45;
#declare pes[2] = 0;
#declare pes[3] = 0;
#declare pes[4] = 45;
#declare pes[5] = 0;
//Perna Esquerda Primaria
#declare pep = array[NQ];
#declare pep[0] = -30;
#declare pep[1] = -60;
#declare pep[2] = -90;
#declare pep[3] = -30;
#declare pep[4] = -30;
#declare pep[5] = 0;
//Perna Direita Secundaria
#declare pds = array[NQ];
#declare pds[0] = -30;
#declare pds[1] = -45;
#declare pds[2] = 0;
#declare pds[3] = -45;
#declare pds[4] = 0;
#declare pds[5] = 0;
//Perna Direita Primaria
#declare pdp = array[NQ];
#declare pdp[0] = 30;
#declare pdp[1] = 60;
#declare pdp[2] = 90;
#declare pdp[3] = 30;
#declare pdp[4] = 30;
#declare pdp[5] = 0;
//Braco Esquerdo Secundario
#declare bes = array[NQ];
#declare bes[0] = 45;
#declare bes[1] = -45;
#declare bes[2] = 0;
#declare bes[3] = 45;
#declare bes[4] = -45;
#declare bes[5] = 0;
//Braco Esquerdo Primario
#declare bep = array[NQ];
#declare bep[0] = 45;
#declare bep[1] = 45;
#declare bep[2] = 0;
#declare bep[3] = -45;
#declare bep[4] = 45;
#declare bep[5] = -45;
//Braco Direito Secundario
#declare bds = array[NQ];
#declare bds[0] = 45;
#declare bds[1] = -45;
#declare bds[2] = 0;
#declare bds[3] = -45;
#declare bds[4] = 45;
#declare bds[5] = 0;
//Braco Direito Primario
#declare bdp = array[NQ];
#declare bdp[0] = 45;
#declare bdp[1] = 45;
#declare bdp[2] = 0;
#declare bdp[3] = 45;
#declare bdp[4] = -45;
#declare bdp[5] = -45;
//Divisao tempo/fase
#declare tempo = array[NQ];
#declare tempo[0] = 0.0;
#declare tempo[1] = 0.2;
#declare tempo[2] = 0.4;
#declare tempo[3] = 0.6;
#declare tempo[4] = 0.8;
#declare tempo[5] = 1.0;
// Partes da cena:
#declare chao =
box{ <-20,-20,-1>, <+20,+20,0> }
#macro coxa(a, b, c)
union{
cylinder{
<0.00 , 0.00, 0.00>,
<0.00 , 0.00, -1.00>,
fino
texture{ tx_plastico }
rotate
}
object{ perna(b, c) translate <0, 0, -1> rotate texture{ tx_plastico }}
}
#end
#macro perna(b, c)
union{
cylinder{
<0.00 , 0.00, 0.00>,
<0.00 , 0.00, -1.00>,
fino
texture{ tx_plastico }
rotate
}
object{ pe(c) texture{ tx_plastico } translate <0, 0, -1> rotate }
}
#end
#macro pe(c)
cylinder{
<0.00 , 0.00, 0.00>,
<0.00 , 0.00, -0.50>,
fino
texture{ tx_plastico }
rotate
}
#end
#macro braco(b, c)
union{
cylinder{
<0.00 , 0.00, 0.00>,
<0.00 , 1.00, 0.00>,
fino
texture{ tx_plastico }
rotate
}
object{ mao(c) texture{ tx_plastico } translate <0, 1, 0> rotate }
}
#end
#macro mao(c)
cylinder{
<0.00 , 0.00, 0.00>,
<0.00 , 1.00, 0.00>,
fino
texture{ tx_plastico }
rotate
}
#end
#declare corpo =
union{
cylinder{
<0.00 , 0.00, 0.00>,
<0.00 , 0.00, 3.00>,
grosso
texture{ tx_plastico }
}
sphere{
<0.00, 0.00, 4.00>,
1.00
texture{ tx_plastico }
}
}
#macro gato(Y, A, B, C, D, E, F, G, H, I, J)
union{
object{ coxa(A, B, C) translate<0, 0.5, 0>}
object{ coxa(D, E, F) translate<0, -0.5, 0>}
object{ braco(G, H) translate<0, 1, 2>}
object{ braco(I, J) scale<+1, -1, +1> translate<0, -1, 2>}
object{ corpo }
translate <0, Y, 0>
}
#end
#macro gato_dancando(fase)
#declare quadro = quadro_anterior(fase);
#local pe_esq = interpola(tempo[quadro], pes[quadro], tempo[quadro+1], pes[quadro+1], fase);
#local coxa_esq = interpola(tempo[quadro], pep[quadro], tempo[quadro+1], pep[quadro+1], fase);
#local pe_dir = interpola(tempo[quadro], pds[quadro], tempo[quadro+1], pds[quadro+1], fase);
#local coxa_dir = interpola(tempo[quadro], pdp[quadro], tempo[quadro+1], pdp[quadro+1], fase);
#local mao_esq = interpola(tempo[quadro], bes[quadro], tempo[quadro+1], bes[quadro+1], fase);
#local braco_esq = interpola(tempo[quadro], bep[quadro], tempo[quadro+1], bep[quadro+1], fase);
#local mao_dir = interpola(tempo[quadro], bds[quadro], tempo[quadro+1], bds[quadro+1], fase);
#local braco_dir = interpola(tempo[quadro], bdp[quadro], tempo[quadro+1], bdp[quadro+1], fase);
object{ gato (0, coxa_dir, pe_dir, 0, coxa_esq, pe_esq, 0, braco_dir, mao_dir, braco_esq, mao_esq)}
// object{ gato (0, 30, -30, 0, -30, 30, 0, 45, 45, 45, 45)}
#end
#macro interpola(f0, v0, f1, v1, f)
#local ss = (f - f0)/(f1 - f0);
#local rr = 1 - ss;
(rr * v0 + ss * v1)
#end
#macro quadro_anterior(fase)
#local i=0;
#while (i < NQ - 1)
#if ((tempo[i] <= fase) & (tempo[i+1] >= fase))
#local resp = i;
#end
#local i = i+1;
#end
resp
#end
#include "eixos.inc"
// Aqui está a cena, finalmente:
union{
object{ eixos(3.00) }
object{ chao translate < 0,0,-5 > texture{ tx_xadrez } }
gato_dancando(clock)
//object{ gato (3, 30, -30, 45, 30, -30, 45, 30, -30, 30, -30)}
//object{ gato (-3, 45, -45, 90, 45, -45, 90, -30, 30, -30, 30)}
}
#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 2.00 >;
#declare raio_cena = 8.0;
#declare dir_camera = < 14.00, 0.00, 4.00 >;
#declare dist_camera = 16.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)