class Camera { float distance; float dEcranOeil; float dEcranRepere; Vecteur oeil,PosRegard,vectEyePosRegard; Vecteur camX,camY,camZ,camX0,camY0,camZ0,vectEyeMouse,vectEyeImpact,vectOrigineImpact ; //++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++ public Camera(){ camZ0=new Vecteur(0,0,1); camZ=camZ0.cloner(); camY0=new Vecteur(0,1,0); camY=camY0.cloner(); camX0=new Vecteur(1,0,0); camX=camX0.cloner(); distance=5000; vectOrigineImpact=new Vecteur(); PosRegard=new Vecteur(500,100,600);// vectEyePosRegard=camZ.mul(distance);//-------signe oeil=PosRegard.ajouter( vectEyePosRegard,-1); dEcranOeil=height/(2*tan(PI/6)); dEcranRepere=distance-dEcranOeil; vectEyeImpact=new Vecteur(0,0,-400); } //++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++ void placercamera(){ oeil=PosRegard.ajouter(camZ,distance); //Posregard ne change pas, ni la distance. Les nouveaux vecteurs camX,camY,camZ sont modifiés par tournerRepere camera(oeil.x,oeil.y,oeil.z,PosRegard.x,PosRegard.y,PosRegard.z,camY.x,camY.y,camY.z); stroke(0); repere(400);//ce repere (en maigre) est le repere absolu repereCam(800);//ce repere (en gras) est dessiné à partir de l'origine absolue mais les vecteurs restent parallèles à l'écran } //++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++ void tournerCam(Quat lequa){ camZ=lequa.tourner(camZ0); camY=lequa.tourner(camY0); camX=lequa.tourner(camX0); } //++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++ public void intersectionRayonRectangle(Rectangle rrr){ float lambda; vectEyeMouse=camZ.mul(-dEcranOeil).ajouter(camY,mouseY-height/2).ajouter(camX,mouseX-width/2); Vecteur EK=rrr.centre.ajouter(oeil,-1.0); lambda=EK.dot(rrr.normale)/vectEyeMouse.dot(rrr.normale); vectEyeImpact=vectEyeMouse.mul(lambda); vectOrigineImpact=oeil.ajouter( vectEyeImpact,1.0); } //++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++ public boolean intersectRayonRectangle(Rectangle rrr){ float lambda; vectEyeMouse=camZ.mul(-dEcranOeil).ajouter(camY,mouseY-height/2).ajouter(camX,mouseX-width/2); Vecteur EK=rrr.centre.ajouter(cam.oeil,-1.0); lambda=EK.dot(rrr.normale)/vectEyeMouse.dot(rrr.normale); vectEyeImpact=vectEyeMouse.mul(lambda); vectOrigineImpact=oeil.ajouter( vectEyeImpact,1.0); return rrr. impactDansLeRectangle( vectOrigineImpact); } //++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++ public float intersectionDragueRectangle(Vecteur rcentre,Vecteur nnormale,Vecteur u1){ Vecteur rnormale=nnormale.cross(u1).normalize(); Vecteur vectEyeMouse0=camZ.mul(-dEcranOeil).ajouter(camY,mouseY-height/2).ajouter(camX,mouseX-width/2); Vecteur EK=rcentre.ajouter(cam.oeil,-1.0); float lambda0=EK.dot(rnormale)/vectEyeMouse0.dot(rnormale); return ( (vectEyeMouse0.mul(lambda0)).ajouter(EK,-1.0)).dot(nnormale); } //++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++ public void repere(float lon){ stroke(255,0,0); line(0,0,0,lon,0,0); stroke(0,255,0); line(0,0,0,0,lon,0); stroke(0,0,255); line(0,0,0,0,0,lon); } //++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++ public void repereCam(float lon){ strokeWeight(3); stroke(255,0,0); line(0,0,0,lon*camX.x,lon*camX.y,lon*camX.z); stroke(0,255,0); line(0,0,0,lon*camY.x,lon*camY.y,lon*camY.z); stroke(0,0,255); line(0,0,0,lon*camZ.x,lon*camZ.y,lon*camZ.z); strokeWeight(1); } }