//***************************************************************************** // name mopspatch // Fichier : mopspatch.inc // Date : juin 2000 // M.O.P.S creation // //***************************************************************************** //************************** Objets Divers **************************************** #declare glup=object{union { sphere { 0 , 0.25 material { Gum }} sphere { <0,0,sqrt(3)/3> , 0.15 material { Bell } } sphere { <0,1/2,-sqrt(3)/6> , 0.15 material { Gum2 } } sphere { <0,-1/2,-sqrt(3)/6> , 0.15 material { Gum2 } } sphere { <0.325,0,0> , 0.075 material { Alu } } sphere { <-0.325,0,0> , 0.075 material { Alu } } cylinder { 0 ,<0,0,sqrt(3)/3> , 0.070 material { mops_red}} cylinder { 0 ,<0,1/2,-sqrt(3)/6> , 0.07 material { mops_red}} cylinder { 0 ,<0,-1/2,-sqrt(3)/6> , 0.070 material { mops_red}} } scale 1/0.325 } #declare glup3=object{union { cylinder { <0,0,0.3+sqrt(3)/3> ,<0,0,0.3+sqrt(3)> , 0.125 material { mops_red}} cylinder { <0,0,0.3+sqrt(3)/3> ,<-1,0,0.3> , 0.125 material { mops_red}} cylinder { <0,0,0.3+sqrt(3)/3> ,<1,0,0.3> , 0.125 material { mops_red}} sphere { <0,0.5+0.15,0.3+sqrt(3)/3> , 0.15 material { Alu } } sphere { <0,-(0.5+0.15),0.3+sqrt(3)/3> , 0.15 material { Alu } } sphere { <0,0,0.3+sqrt(3)> , 0.3 material { Bell } } sphere { <0,0,0.3+sqrt(3)/3> , 0.5 material { Gum }} sphere {<-1,0,0.3>,0.3 material { Gum2 } } sphere {<1,0,0.3>,0.3 material { Gum2 } } } } #declare glup2=object{union { sphere { 0 , 0.25 material { Gum }} sphere { <0,0,sqrt(3)/3> , 0.15 material { Blu_met } } sphere { <0,1/2,-sqrt(3)/6> , 0.15 material { Blu_met } } sphere { <0,-1/2,-sqrt(3)/6> , 0.15 material { Blu_met } } sphere { <0.325,0,0> , 0.075 material { Alu } } sphere { <-0.325,0,0> , 0.075 material { Alu } } cylinder { 0 ,<0,0,sqrt(3)/3> , 0.070 material { mops_red}} cylinder { 0 ,<0,1/2,-sqrt(3)/6> , 0.07 material { mops_red}} cylinder { 0 ,<0,-1/2,-sqrt(3)/6> , 0.070 material { mops_red}} } scale 1/0.325 } #declare axes=union{ sphere { 0, 0.15 material {ecran }} cylinder { 0, 1.2*x, 0.08 material { rouge_axe }} cone { 1.2*x,0.2,2*x,0 material { rouge_axe }} cylinder { 0, 1.2*y, 0.08 material { vert_axe }} cone { 1.2*y,0.2,2*y,0 material { vert_axe }} cylinder { 0, 1.2*z, 0.08 material { bleu_axe }} cone { 1.2*z,0.2,2*z,0 material { bleu_axe }} } #macro maillon(tex1,tex2) #local result= union{ difference { union { box {<-1, -1, -1>, <1, 1, 1> scale <1.0, 0.75, 0.08> } cylinder {<0,0,1>, <0,0,0>, 1 scale <0.08, 0.08, 1.5> rotate -90.0*x translate <-1.0, -0.75, 0.0> } cylinder {<0,0,1>, <0,0,0>, 1 scale <0.08, 0.08, 1.5> rotate -90.0*x translate <1.0, -0.75, 0.0> } } cylinder {<0,0,1>, <0,0,0>, 1 scale <0.055, 0.055, 2.0> rotate -90.0*x translate <1.0, -1.0, 0.0> } box {<-1, -1, -1>, <1, 1, 1> scale <0.25, 0.29, 0.1> translate -1.0*x } box {<-1, -1, -1>, <1, 1, 1> scale <0.25, 0.29, 0.1> translate <1.0, 0.57, 0.0> } box {<-1, -1, -1>, <1, 1, 1> scale <0.25, 0.29, 0.1> translate <1.0, -0.57, 0.0> } cylinder {<0,0,1>, <0,0,0>, 1 scale <0.055, 0.055, 2.0> rotate -90.0*x translate <-1.0, -1.0, 0.0> } material { tex1 } } union { cylinder {<0,0,1>, <0,0,0>, 1 scale <0.05, 0.05, 1.51> rotate -90.0*x translate <1.0, -0.755, 0.0> } sphere {<0,0,0>,1 scale 0.05 translate <1.0, 0.755, 0.0> } sphere {<0,0,0>,1 scale 0.05 translate <1.0, -0.755, 0.0> } material { tex2 }} } result #end #declare chainelm=union{ difference { torus{ 0.8,0.25 translate -0.45*x } box { <-0.45,-0.3,-1.2> <0.6,0.3,1.2>} } difference { torus{ 0.8,0.25 translate 0.45*x } box { <0.45,0.3,1.2> <-0.6,-0.3,-1.2>} } cylinder { -0.45*x, 0.45*x,0.25 translate 0.8*z } cylinder { -0.45*x, 0.45*x,0.25 translate -0.8*z } } #declare fleche= union { cylinder { -1*x ,0.175*x,0.05} cone { 0.175*x , 0.125, 1*x , 0 } } #macro roue(nb) #local jante = union { torus { 8.0, 0.1 rotate -x*90 translate 0.2*z } torus { 8.0, 0.1 rotate -x*90 translate -0.2*z } difference { cylinder { <0,0,1>, <0,0,0>, 1 scale <8.5, 8.5, 0.4> translate -0.2*z } cylinder { <0,0,1>, <0,0,0>, 1 scale <7.9, 7.9, 1.2> translate -0.6*z }} material { Alu } } #local moyeu = union { cylinder {<0,0,1>, <0,0,0>, 1 scale <1.0, 1.0, 1.1> translate -0.5*z } torus {1.0, 0.1 rotate -x*90 translate -0.5*z } torus {1.0, 0.1 rotate -x*90 translate 0.5*z } cylinder {<0,0,1>, <0,0,0>, 1 scale <1.1, 1.1, 1.0> translate -0.5*z } material { Alu }} #local pneu = union { torus {8.5, 0.5 rotate -x*90 translate -0.3*z } torus {8.5, 0.5 rotate -x*90 translate 0.3*z } difference { cylinder {<0,0,0.6>, <0,0,0>, 1 scale <9.0, 9.0, 1.0> translate -0.3*z } cylinder {<0,0,1>, <0,0,0>, 1 scale <8.0, 8.0, 1.2> translate -0.6*z }} material { Leather } } #local result=union { object { pneu } object { jante } object { moyeu } intersection { sphere { 0, 1 scale <1,1,0.8> } box { <-1, -1, -1> < 1, 1, 1> scale <0.4,1,1> } material {Steel} }} #local nbre=int(nb/2); #local ang=2*pi/nbre; #local k=0; #while (k, <8*cos(k*ang),8*sin(k*ang),0>,0.075 material {Steel}} cylinder { <0.8*cos(k*ang+ang/2),0.8*sin(k*ang+ang/2),-0.25>, <8*cos(k*ang+ang/2),8*sin(k*ang+ang/2),0>,0.075 material {Steel}} } #local k=k+1; #end #local result = object { result rotate 90*x scale 1/9 } result #end //******************************* macros ************************** // ayant expérimenté des résultats erronés dans certains cas de acos(-1) j'ai créé cette macro // deplus #macro myacos(valeur) #switch (valeur) #case (-1) #local result=pi; #break #case (1) #local result=0; #break #else #local result=acos(valeur); #end result #end #macro pair(valeur) #if (int(valeur/2)=valeur/2) #local result=true; #else #local result=false; #end result #end #macro sn(valeur) #local signe=1; #if (valeur<0) #local signe=-1; #end signe #end #macro put(A,B,norm,typ) // si typ=1 echelle uniforme sinon echelle suivant l'axe (x'x) //si typ=0 sinon echelle suivant l'axe (x'x) // si typ=2 pas de mise à l'echelle #local alp=0; #local bet=0; #local vu=B-A; #if (vlength(vu)!=0) #if ((vu.x=0)&(vu.z=0)) #local alp=sn(vu.y)*90; #local betp=0; #else #local alp=sn(vu.y)*degrees(myacos(sn(vu.x)*vlength()/vlength(vu))); #local bet=sn(vu.z)*(90*(sn(vu.x)-1)-degrees(myacos(vu.x/vlength()))); #end #end #if (vlength(norm)=0) //--- #switch (typ) #case (1) #local result=transform { scale vlength(B-A)/2 rotate alp*z rotate bet*y translate (A+B)/2 } #break #case (0) #local result=transform { scale rotate alp*z rotate bet*y translate (A+B)/2 } #break #case (2) #local result=transform { rotate alp*z rotate bet*y translate (A+B)/2 } #break #end //--- #else //--- #local tempz=vaxis_rotate(z,y,bet)*2; #local tempy=vaxis_rotate(y,z,alp)*2; #local tempy=vaxis_rotate(tempy,y,bet); #local phi=-sn(vdot(tempy,norm))*degrees(myacos(vdot(tempz,norm)/(vlength(tempz)*vlength(norm)))); #switch (typ) #case (1) #local result=transform { scale vlength(B-A)/2 rotate phi*x rotate alp*z rotate bet*y translate (A+B)/2 } #break #case (0) #local result=transform { scale rotate phi*x rotate alp*z rotate bet*y translate (A+B)/2 } #break #case (2) #local result=transform { rotate phi*x rotate alp*z rotate bet*y translate (A+B)/2 } #break #end //--- #end result #end #macro buildbelt(ck) #if (belt_d=0) #local al=0; #else #local al=myacos((belt_R1-belt_R2)/belt_d); #end #local l=sqrt(belt_d*belt_d-(belt_R1-belt_R2)*(belt_R1-belt_R2)); #local C1=(2*pi-2*al)*belt_R1; #local C2=2*al*belt_R2; #local Long=C1+2*l+C2; #local Dl=Long/belt_nb; #local p0=<0,0,0>; #if (belt_typ=1) #local P=belt_tour*ck*(2*pi*belt_R1); #else #local P=belt_tour*ck*Long; #end #local P=mod(P,Long); #local P=mod(P+Long,Long); #local k=0; #while (k<(belt_nb+1)) #switch (P) #range (0,l) #local p1=+; #break #range (l,l+C2) #local tp=P-l; #local bet=al-(tp/belt_R2); #local p1=; #break #range (l+C2,l+C2+l) #local tp=P-C2-l; #local p1=+<-tp*sin(al),0,-tp*cos(al)>; #break #else #range (l+C2+l,Long) #local tp=P-l-C2-l; #local bet=(tp/belt_R1); #local p1=<-belt_R1*cos(pi-al-bet),0,-belt_R1*sin(pi-al-bet)>; #break #end #local nm=vnormalize(vcross(p1-p0,belt_norm))*1.5; #switch (k) #case(1) #local result=object{ belt_el[k] transform put(p0,p1,nm,1) } #break #range (2,belt_nb+1) #local result=union { object { result } object{ belt_el[k] transform put(p0,p1,nm,1) } } #break #end #local p0=p1; #local P=P+Dl; #if (P>Long) #local P=mod(P,Long); #end #local k=k+1; #end #declare belt_al=degrees(al); #declare belt_Long=Long; #declare belt_Dl=Dl; #declare belt_R1bis=sqrt(belt_R1*belt_R1-(Dl/2)*(Dl/2)); #declare belt_R2bis=sqrt(belt_R2*belt_R2-(Dl/2)*(Dl/2)); result #end