// Felipe Marinho Tavares // R.A.: 265680 // Unicamp - MC937A/MO603A – Computação Gráfica - 2020-S2 - Jorge Stolfi // ====================================================================== // CORES E TEXTURAS background{ color rgb < 0.75, 0.80, 0.85 > } #declare brown_soft_149_111_82 = color rgb < 149/255, 111/255, 82/255 >; #declare tx_woodish = texture{ pigment{ brown_soft_149_111_82 } finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_redish = texture{ pigment{ color rgb < 255/255, 0/255, 0/255 > } finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_gray70 = texture{ pigment{ color rgb <179/255, 179/255, 179/255> } } #declare tx_gray85 = texture{ pigment{ color rgb <217/255, 217/255, 217/255> } } #declare tx_gray90 = texture{ pigment{ color rgb <230/255, 230/255, 230/255> } } // ====================================================================== // DESCRI��O DA CENA #macro finger() union{ box{<0, -0.18, -0.25>, <4.5, 0.18, 0.25> texture {tx_gray70}} } #end #macro hand(finger1_theta, finger2_theta, finger3_theta) union{ box{<0, -1.5, -1>, <4, 1.5, 1> texture {tx_gray85}} box{<2, -2.5, -1>, <6, 2.5, 1> texture {tx_gray90}} object{ finger() //finger1 rotate -90*z //default rotate finger1_theta*x translate < 2 + 0.18, -2.5, 0> //default } object{ finger() //finger2 rotate finger2_theta*y translate < 6, -2.5 + 0.18, 0> //default } object{ finger() //finger3 rotate finger3_theta*y translate < 6, 2.5 - 0.18, 0> //default } } #end #macro lower_arm(hand_xtheta, hand_ytheta, finger1_theta, finger2_theta, finger3_theta) union{ box{<0, -0.55, -0.55>, <15, 0.55, 0.55> texture{tx_gray85}} object{ hand(finger1_theta, finger2_theta, finger3_theta) rotate hand_xtheta*x rotate hand_ytheta*y translate < 15, 0, 0 > } } #end #macro upper_arm(larm_ytheta, hand_xtheta, hand_ytheta, finger1_theta, finger2_theta, finger3_theta) union{ box{<0, -2, -1.95>, <12, 2, 1.95> texture{tx_gray85}} object{ lower_arm(hand_xtheta, hand_ytheta, finger1_theta, finger2_theta, finger3_theta) rotate larm_ytheta*y translate <12, 0, 0> } } #end #macro body(//right arm params ruarm_xtheta, ruarm_ytheta, ruarm_ztheta, rlarm_ytheta, rhand_xtheta, rhand_ytheta, rfinger1_theta, rfinger2_theta, rfinger3_theta, //left arm params luarm_xtheta, luarm_ytheta, luarm_ztheta, llarm_ytheta, lhand_xtheta, lhand_ytheta, lfinger1_theta, lfinger2_theta, lfinger3_theta) union{ // body cylinder{<0, 0, 0>, <0, 0, 10>, 5 texture{tx_gray85} } sphere{<0, 0, 10>, 5 texture { tx_gray85 } } sphere{<1.4, 0, 12>, 4 texture { tx_gray90 } } // right arm object{ upper_arm(rlarm_ytheta, rhand_xtheta, rhand_ytheta, rfinger1_theta, rfinger2_theta, rfinger3_theta) scale <0.45, 0.45, 0.45> rotate -90*y //default rotate 90*x //default rotate ruarm_xtheta*x rotate ruarm_ytheta*y rotate ruarm_ztheta*z translate <0, -5, 10> } // left arm object{ upper_arm(llarm_ytheta, lhand_xtheta, lhand_ytheta, lfinger1_theta, lfinger2_theta, lfinger3_theta) scale <0.45, 0.45, 0.45> rotate -90*y //default rotate 90*x //default rotate luarm_xtheta*x rotate luarm_ytheta*y rotate luarm_ztheta*z translate <0, -5, 10> scale <1, -1, 1> } } #end #declare ROBOT_PARAMS = 19; #macro robot(body_ztheta, //right arm params ruarm_xtheta, ruarm_ytheta, ruarm_ztheta, rlarm_ytheta, rhand_xtheta, rhand_ytheta, rfinger1_theta, rfinger2_theta, rfinger3_theta, //left arm params luarm_xtheta, luarm_ytheta, luarm_ztheta, llarm_ytheta, lhand_xtheta, lhand_ytheta, lfinger1_theta, lfinger2_theta, lfinger3_theta) //#debug concat("!! theta = ", str(ruarm_ytheta, 1,2),"\n") union{ object{ body(ruarm_xtheta, ruarm_ytheta, ruarm_ztheta, rlarm_ytheta, rhand_xtheta, rhand_ytheta, rfinger1_theta, rfinger2_theta, rfinger3_theta, luarm_xtheta, luarm_ytheta, luarm_ztheta, llarm_ytheta, lhand_xtheta, lhand_ytheta, lfinger1_theta, lfinger2_theta, lfinger3_theta) rotate body_ztheta*z } } #end #macro robo_vet(params_arr) robot(params_arr[0] //right arm params params_arr[1], params_arr[2], params_arr[3], params_arr[4], params_arr[5], params_arr[6], params_arr[7], params_arr[8], params_arr[9], //left arm params params_arr[10], params_arr[11], params_arr[12], params_arr[13], params_arr[14], params_arr[15], params_arr[16], params_arr[17], params_arr[18]) #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_mov(tt) // used for the class robogarçom2 #local pp0 = robo_key_11(); #local pp1 = robo_key_12(); #local pp = array[ROBOT_PARAMS]; #local iter = 0; #while(iter < ROBOT_PARAMS) #local pp[iter] = interpola1(tt, 0, 1, pp0[iter], pp1[iter]); #local iter = iter + 1; #end robo_vet(pp) #end #macro robo_interpola(tt, P0, P1) // used for the class robogarçom3 #local pp = array[ROBOT_PARAMS]; #local iter = 0; #while(iter < ROBOT_PARAMS) #local pp[iter] = interpola1(tt, 0, 1, P0[iter], P1[iter]); #local iter = iter + 1; #end robo_vet(pp) #end #macro quadro(tf) // used for the class robogarçom3 #local T0 = 0.00; #local P0 = robo_key_21() #local T1 = 0.25; #local P1 = robo_key_22() #local T2 = 0.50; #local P2 = robo_key_23() #local T3 = 0.75; #local P3 = robo_key_24() #local T4 = 1.00; #local P4 = P0 #local P4[0] = P4[0] - 360; // due to reset on angle value //#local P4[2] = P4[2] - 360; // due to reset on angle value #if ((T0 <= tf) & (tf <= T1)) #local tt = (tf - T0)/(T1 - T0); #local qd = robo_interpola(tt, P0, P1); #elseif ((T1 <= tf) & (tf <= T2)) #local tt = (tf - T1)/(T2 - T1); #local qd = robo_interpola(tt, P1, P2); #elseif ((T2 <= tf) & (tf <= T3)) #local tt = (tf - T2)/(T3 - T2); #local qd = robo_interpola(tt, P2, P3); #elseif ((T3 <= tf) & (tf <= T4)) #local tt = (tf - T3)/(T4 - T3); #local qd = robo_interpola(tt, P3, P4); #end qd #end // Implementation of pose keys #macro robo_key_11() // used for the class robogarçom2 #local arr = array[ROBOT_PARAMS]; //body params #local arr[0] = 0; //right arm params #local arr[1] = 50; #local arr[2] = -25; #local arr[3] = 80; //upperarm #local arr[4] = 60; //lowerarm #local arr[5] = 0; #local arr[6] = 0; //hand #local arr[7] = 88; #local arr[8] = 80; #local arr[9] = 80; //fingers //left arm params #local arr[10] = -5; #local arr[11] = 5; #local arr[12] = 70; //upperarm #local arr[13] = 90; //lowerarm #local arr[14] = 0; #local arr[15] = 0; //hand #local arr[16] = 88; #local arr[17] = 80; #local arr[18] = 80; //fingers arr #end #macro robo_key_12() // used for the class robogarçom2 #local arr = array[ROBOT_PARAMS]; //body params #local arr[0] = -30; //right arm params #local arr[1] = 50; #local arr[2] = 20; #local arr[3] = 10; //upperarm #local arr[4] = 110; //lowerarm #local arr[5] = 0; #local arr[6] = 0; //hand #local arr[7] = 88; #local arr[8] = 80; #local arr[9] = 80; //fingers //left arm params #local arr[10] = -5; #local arr[11] = 5; #local arr[12] = 70; //upperarm #local arr[13] = 90; //lowerarm #local arr[14] = 0; #local arr[15] = 0; //hand #local arr[16] = 88; #local arr[17] = 80; #local arr[18] = 80; //fingers arr #end #macro robo_key_21() // used for the class robogarçom3 #local arr = array[ROBOT_PARAMS]; //body params #local arr[0] = 315; //right arm params #local arr[1] = 85; #local arr[2] = 0; #local arr[3] = 0; //upperarm #local arr[4] = 115; //lowerarm #local arr[5] = 180; #local arr[6] = 30; //hand #local arr[7] = -80; #local arr[8] = -80; #local arr[9] = -80; //fingers //left arm params #local arr[10] = 85; #local arr[11] = -125; #local arr[12] = 0; //upperarm #local arr[13] = 90; //lowerarm #local arr[14] = 180; #local arr[15] = 0; //hand #local arr[16] = -45; #local arr[17] = -45; #local arr[18] = -45; //fingers arr #end #macro robo_key_22() // used for the class robogarçom3 #local arr = array[ROBOT_PARAMS]; //body params #local arr[0] = 225; //right arm params #local arr[1] = 85; #local arr[2] = -125; #local arr[3] = 0; //upperarm #local arr[4] = 90; //lowerarm #local arr[5] = 180; #local arr[6] = 0; //hand #local arr[7] = -45; #local arr[8] = -45; #local arr[9] = -45; //fingers //left arm params #local arr[10] = 85; #local arr[11] = 0; #local arr[12] = 0; //upperarm #local arr[13] = 115; //lowerarm #local arr[14] = 180; #local arr[15] = 30; //hand #local arr[16] = -80; #local arr[17] = -80; #local arr[18] = -80; //fingers arr #end #macro robo_key_23() // used for the class robogarçom3 #local arr = array[ROBOT_PARAMS]; //body params #local arr[0] = 135; //right arm params #local arr[1] = 85; #local arr[2] = 0; #local arr[3] = 0; //upperarm #local arr[4] = 115; //lowerarm #local arr[5] = 180; #local arr[6] = 30; //hand #local arr[7] = -80; #local arr[8] = -80; #local arr[9] = -80; //fingers //left arm params #local arr[10] = 85; #local arr[11] = -125; #local arr[12] = 0; //upperarm #local arr[13] = 90; //lowerarm #local arr[14] = 180; #local arr[15] = 0; //hand #local arr[16] = -45; #local arr[17] = -45; #local arr[18] = -45; //fingers arr #end #macro robo_key_24() // used for the class robogarçom3 #local arr = array[ROBOT_PARAMS]; //body params #local arr[0] = 45; //right arm params #local arr[1] = 85; #local arr[2] = -125; #local arr[3] = 0; //upperarm #local arr[4] = 90; //lowerarm #local arr[5] = 180; #local arr[6] = 0; //hand #local arr[7] = -45; #local arr[8] = -45; #local arr[9] = -45; //fingers //left arm params #local arr[10] = 85; #local arr[11] = 0; #local arr[12] = 0; //upperarm #local arr[13] = 115; //lowerarm #local arr[14] = 180; #local arr[15] = 30; //hand #local arr[16] = -80; #local arr[17] = -80; #local arr[18] = -80; //fingers arr #end // --- #include "eixos.inc" // Aqui est� a cena, finalmente: union{ object{ eixos(20.00) translate <0, 0, 0> } //object {robo_vet(robo_key_21()) translate <-25, 0, 0> } //object {robo_vet(robo_key_22()) translate <-25, 20, 0> } //object {robo_vet(robo_key_23()) translate <-25, 40, 0> } //object {robo_vet(robo_key_24()) translate <-25, 60, 0> } object {quadro(clock)} } #include "camlight.inc" #declare centro_cena = < 0.00, 0.00, 6.00 >; #declare raio_cena = 30.0; #declare dir_camera = < 25.00, 6.00, 12.00 >; #declare dist_camera = 5*raio_cena; #declare intens_luz = 1.20; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)