// by Greg M. Johnson http://members.xoom.com/gregjohn/animation.html. #version unofficial MegaPov 0.5; #include "colors.inc" //carswrite04f I got rid of steering wheel. #declare num=17 ; // number of actors #declare framenum=375; // number of frames+1 (put number of frames +0 in povray.ini and read file) #declare RRR=seed(2022) ; // We'll be using random numbers! #declare UMAX=40 ; // maximum initial postion #declare VMAX=7 ; // maximum initial velocity #declare actorp= array[num+1] // position of each actor #declare actorv= array[num+1] // instantaneous velocity of each actor //#declare actoravoid= array[num+1] // vector for best path to avoid collision with peers //#declare wheel= array[num+1] // float for steering position #declare car= array[num+1] // float for steering position #declare racetrack= union{ cylinder{0,<0,-10,0>,200} difference{ cylinder{<0, 0.0,0>,<0,2.0,0>,140} cylinder{<0,-0.1,0>,<0,2.1,0>,139} } difference{ cylinder{<0, 0.0,0>,<0,2.0,0>,181} cylinder{<0,-0.1,0>,<0,2.1,0>,180} } pigment{Brown} } #macro Reorient(Axis1,Axis2) #local vX1=vnormalize(Axis1); // this macro created by john vansickle #local vX2=vnormalize(Axis2); #local vY=vnormalize(vcross(vX1,vX2)); #local vZ1=vnormalize(vcross(vX1,vY)); #local vZ2=vnormalize(vcross(vX2,vY)); matrix < vX1.x, vY.x,vZ1.x, vX1.y,vY.y,vZ1.y, vX1.z,vY.z, vZ1.z, 0,0,0 > matrix < vX2.x,vX2.y,vX2.z, vY.x,vY.y, vY.z, vZ2.x,vZ2.y,vZ2.z, 0,0,0 > #end #macro brake(n) #debug "Car" #debug str(n,2,0) #debug "is braking.\n" #declare actorv[n]=0.9*actorv[n]; #end #macro accel(n) #debug "Car" #debug str(n,2,0) #debug "is accelerating.\n" #declare actorv[n]=vnormalize(actorv[n])*vlength(actorv[n]+.8); #end //note: steer also used to test so not an actual declaration. #macro steer(n,w) vaxis_rotate(actorv[n],y,w/2) #end // WARNING! // This line declares the name of the file which contains the positions and velocities // of all your particles. MAKE SURE to correct the format of the // file name to include a proper drive and subdirectory for your computer! // When working with multiple tweaks, it is often helpful to change this filename frequently. #fopen MyFile2 "c:\pov31g\include\carswrite04k.inc" write #write(MyFile2,"#declare Position=array[", framenum-1, "][", num, "][6] {\n") //initialize the three vectors for each actor. #declare n=0 ; #while (n,y,6*mod(n,3)); #declare actorv[n]=<0,0,.01>;// 20*; //#declare wheel[n]=0; #declare car[n]=box{<-0,.01,-.5>,<3,1,.5>} #declare n=n+1 ; #end #declare tt=1; // tt is the "time" element. #while(tt Reorient(x,actorv[i]) translate actorp[i] ); #local vantager=vtransform(<3.01,0.5,-0.51> Reorient(x,actorv[i]) translate actorp[i] ); #local rearright=vtransform(<.01,0.5,-0.51> Reorient(x,actorv[i]) translate actorp[i] ); #local rearleft=vtransform(<.01,0.5,0.51> Reorient(x,actorv[i]) translate actorp[i] ); #local rdist2wall=trace(racetrack,vantager,steer(i,0)); #local ldist2wall=trace(racetrack,vantagel,steer(i,0)); #local rdist2cars=trace(allcars, vantager,steer(i,0)); #local ldist2cars=trace(allcars, vantagel,steer(i,0)); #local turns2wall=min(vlength(vantager-rdist2wall),vlength(vantagel-ldist2wall))/0.10/vlength(actorv[i]); #local turns2cars=min(vlength(vantager-rdist2cars),vlength(vantagel-ldist2cars))/0.10/vlength(actorv[i]); #if (turns2wall<3) #debug "\n \n Car #" #debug str(i,3,0) #debug " crashed! HIT WALL!!! \n" //#declare car[i]=sphere{0,0} #end #if (turns2cars<3) #debug "\n \n Car #" #debug str(i,3,0) #debug " crashed! HIT CAR!!! \n" //#declare car[i]=sphere{0,0} #end #if ((turns2wall<45 | turns2cars<30)&(turns2wall>3)&(turns2cars>3)) brake(i) #else #if (turns2wall>100 & turns2cars>40) accel(i) #end #end #local dist2any=min(vlength(vantagel-trace(trackandcars,vantagel,steer(i,0))),vlength(vantager-trace(trackandcars,vantager,steer(i,0)))); #local steerr2=min(vlength(vantagel-trace(trackandcars,vantagel,steer(i,+2))),vlength(vantager-trace(trackandcars,vantager,steer(i,+2)))); #local steerl2=min(vlength(vantagel-trace(trackandcars,vantagel,steer(i,-2))),vlength(vantager-trace(trackandcars,vantager,steer(i,-2)))); #local steerr4=min(vlength(vantagel-trace(trackandcars,vantagel,steer(i,+11))),vlength(vantager-trace(trackandcars,vantager,steer(i,+11)))); #local steerl4=min(vlength(vantagel-trace(trackandcars,vantagel,steer(i,-11))),vlength(vantager-trace(trackandcars,vantager,steer(i,-11)))); #local reardistr=2*min(vlength(rearright-trace(trackandcars,rearright,vaxis_rotate(actorv[i],y,90))),vlength(vantager-trace(trackandcars,vantager,vaxis_rotate(actorv[i],y,90)))); #local reardistl=2*min(vlength(rearright-trace(trackandcars,rearleft,vaxis_rotate(actorv[i],y,-90))),vlength(vantagel-trace(trackandcars,vantagel,vaxis_rotate(actorv[i],y,-90)))); /*#debug "\n reardistr " #debug str(reardistr,6,3) #debug "\n reardistl " #debug str(reardistl,6,3) */ /* #if ((steerr2>steerr4) & (steerr2>dist2any) &(steerr2>steerl2) &(steerr2>steerl4)) #declare wheel[i]=wheel[i]+2; #else #if (steerr4>dist2any & steerr4>steerl2 &steerr4>steerl4) #declare wheel[i]=wheel[i]+4; #else #if (dist2any>steerl2 &dist2any>steerl4) //hi #else #if (steerl2>steerl4) #declare wheel[i]=wheel[i]-2; #else #declare wheel[i]=wheel[i]-4; #end #end #end #end */ #if(min(reardistr,min(steerr2,steerr4))>min(reardistl,min(steerl2,steerl4))) #declare w= 2; #else #declare w=-2; #end #declare actorv[i]=steer(i,w); #declare i=i+1; #end #declare n=0 ; #while (n look_at <0, 0, 0> angle 30 } light_source{<10,200,-50>rgb 1.2} light_source{<10,-200,50>rgb .2} fog { fog_type 1 distance 2000 rgb <.2,.3,.7>}