//Alcys_Karting version du 20/04/2004 Systeme sys; void setup(){ size(700,400); sys=new Systeme(); ellipseMode(CENTER_DIAMETER); } void loop(){ background(100,100,185); push(); if (mousePressed == true) {sys.voiture.vitesse+=20; }; if (keyPressed==true){ if(key==UP){sys.voiture.vitesse+=10;}; if(key==DOWN){if(sys.voiture.coords.x/2000>sys.t) sys.voiture.vitesse-=10;}; if(key==RIGHT){sys.voiture.anglevoiture-=0.05;}; if(key==LEFT){sys.voiture.anglevoiture+=0.05;}; } sys.afficher(); pop(); } //////////////////////////////////////////////////// //CLASSE SYSTEME //////////////////////////////////////////////////// class Systeme{ Mobile voiture; Trajectoire trajet; Camera lacamera; float v,t; public Systeme(){ this.v=0.03; this.t=0; this.trajet=new Trajectoire(); Vecteur c=new Vecteur(800,700,0); this.voiture=new Mobile(c); this.lacamera=new Camera(); } void afficher(){ t+=((voiture.coords.x-2200)/2000-t)/10;//la pendule:la camera suit la voiture souplement,avec retard Vecteur positionRepere=trajet.route(t);//la nouvelle position de la camera dans le repère absolu Vecteur vecTangent=trajet.routeT(t); Vecteur vecNormal=trajet.routeN(t); Vecteur anglesRepere=vecTangent.anguler();//les angles du repere contenant dans x0y n et t Vecteur routebal=trajet.route(voiture.coords.x/2000); lacamera.placercamera(positionRepere,anglesRepere,routebal); trajet.dessinerlaroute(t); voiture.dessinerlavoiture(anglesRepere.z); } } //////////////////////////////////////////////////// //CLASSE CAMERA //////////////////////////////////////////////////// class Camera{ float fov, oeilX, oeilY,oeilZ, lookX, lookY,lookZ, oeilDist, nearDist, farDist, aspect; public Camera(){ fov = 60; oeilX = 0; oeilY = 0; oeilZ=0; oeilDist = 400; nearDist = oeilDist / 1000.0f; farDist = oeilDist * 1000.0f; aspect = (float)width / (float)height; } void placercamera(Vecteur poscam,Vecteur angles,Vecteur routb){ lookX=objectX(1000000,0,0);//routb.x; lookY=objectY(1000000,0,0);//routb.y; lookZ=objectZ(1000000,0,0);//routb.z; beginCamera(); perspective(fov, aspect, nearDist, farDist); lookat(poscam.x-800 , poscam.y+500 ,poscam.z-600, lookX, lookY, lookZ, 0, 0, 1); endCamera(); } //////////////////////////////////////////////////// //CLASSE POSITION //////////////////////////////////////////////////// } class Position{ float rayon; public Position(){ this.rayon=1500.0; } public Vecteur route(float tt){ Vecteur p=new Vecteur(0,0,0); p.x=tt*2000; p.y=rayon/3*sin(tt*2); p.z=rayon/2*cos(tt); return p; } public Vecteur routeT(float tt){ Vecteur p=new Vecteur(0,0,0); p.x=2000.0f; p.y=rayon/3*2*cos(tt*2); p.z=-rayon/2*sin(tt); p.normer(); return p; } public Vecteur routeN(float tt){ Vecteur p=new Vecteur(0,0,0); p.x=0; p.y=-rayon/3*4*sin(tt*2); p.z=-rayon/2*cos(tt); p.normer(); return p; } } //////////////////////////////////////////////////// //CLASSE TRAJECTOIRE //////////////////////////////////////////////////// class Trajectoire extends Position{ float rayon,alfa,beta,t; Mobile voiture; Vecteur c,v; public Trajectoire(){ this.alfa=0; this.beta=0; } void repere(){ stroke(255,0,0);line(0,0,0,1000,0,0); stroke(0,255,0);line(0,0,0,0,1000,0); stroke(0,0,255);line(0,0,0,0,0,1000);} void dessinerlaroute(float t){ Vecteur ancp=route(t);//init pour entrer dans la boucle de dessin for(float i=t+0.03;irout0.x){lights(); fill(255,255,255);box(1100,1200,3600);//-(120*i)%55-(150*i)%45(55*i)%55 translate(1800,-7000,0);box(1200,1800,3600); noLights(); } pop(); } } } //////////////////////////////////////////////////// //CLASSE VECTEUR //////////////////////////////////////////////////// class Vecteur{ float x,y,z; Vecteur(float x1,float y1,float z1){ this.x=x1; this.y=y1; this.z=z1; } Vecteur normer(){ float lg=dist(0,0,0,x,y,z); Vecteur prov; if(lg==0){prov=new Vecteur(0,0,0);}else { prov=new Vecteur( x/=lg,y/=lg, z/=lg);} return prov; } Vecteur anguler(){ float alfa=atan2(y,x); float beta=atan2(z,dist(0,0,x,y)); return (new Vecteur(0,beta,alfa)); } } //////////////////////////////////////////////////// //CLASSE MOBILE //////////////////////////////////////////////////// class Mobile extends Position{ Vecteur coords ,ancCoords; float angleroue,vitesse,anglevoiture; Mobile(Vecteur c){ this.coords=c; this.vitesse=20; this.ancCoords=new Vecteur(0,0,0); this.angleroue=0; this.anglevoiture=0; } void dessinerlavoiture(float anglz){ vitesse*=0.99; //calculs dans le repere absolu:choc avec les bords Vecteur posbords=route(coords.x/2000); float lim=posbords.y; if(coords.ylim+1380){modifiervitesse(anglz);coords.y=lim+1380;}; coords.x+=vitesse*cos(anglevoiture); coords.y+=vitesse*sin(anglevoiture); posbords=route(coords.x/2000); coords.z=posbords.z; Vecteur posbordsT=routeT(coords.x/2000); Vecteur angls=posbordsT.anguler(); //les angles pour la voiture push();fill(255,100,100);translate(coords.x,coords.y,coords.z-100); rotateY(-angls.y);rotateZ(anglevoiture); box(500,180,100); translate(0,100,90);fill(0,0,0,10);box(600,500,2);translate(0,-100,-90);//ombre push();fill(200,50,0);translate(-200,0,-150);rotateY(-0.4);box(300,500,20);fill(0);pop();//aileron push(); translate(200,180,-30);rotateY(angleroue-=vitesse/50);box(150,80,150);translate(0,-360,0);box(150,80,150); pop(); translate(-200,200,-30);rotateY(angleroue-=vitesse/50);box(150,100,150);translate(0,-400,0);box(150,100,150); pop(); } void modifiervitesse(float anglez){ anglevoiture=2*anglez-anglevoiture; coords.x+=vitesse*cos(anglevoiture); coords.y+=vitesse*sin(anglevoiture); vitesse/=2; } }