import processing.opengl.*; /*Alcys_Arcen3D * 1) clic droit et drag: change le point de vue * 2) clic gauche et drag : déplacer la queue de billard et lui donner sa force et sa direction * * * 1)click and drag right: to move the camera * 2)click and drag left :to move the axis * * * **/ PImage brazil,brazilr; Camera cam; float theta,phi,distanceEcranOeil,rayon,zplan; Quat lequat; Vecteur camX,camY,camZ,camX0,camY0,camZ0,vectOriginMouse,vectEyeMouse,vectImpact ; int etape; String texte; PFont mafont; AxeQuat quatsystem; void setup(){ size(700,600,OPENGL); //size(700,600,P3D); brazil=loadImage("Brazil200.jpg"); brazilr=loadImage("Brazil200r.gif"); distanceEcranOeil=-height/(2*(float)Math.tan(PI/6)); theta=1.0f; phi=1.0f; zplan=200; lequat=new Quat(1,0,0,0); camZ0=new Vecteur(0,0,1); camY0=new Vecteur(0,1,0); camX0=new Vecteur(1,0,0); Quat lequa=Quat.mul(new Quat(cos(-0.65),sin(-0.65),0,0),lequat); camZ0=lequa.tourner(camZ0); camY0=lequa.tourner(camY0); camX0=lequa.tourner(camX0); camZ=camZ0.cloner(); camY=camY0.cloner(); camX=camX0.cloner(); cam=new Camera(camX0,camY0,camZ0); vectOriginMouse=new Vecteur(0,0,0); vectImpact=new Vecteur(-30,400,200); mafont=loadFont("Arial.vlw"); textFont(mafont,28); rayon=15; quatsystem=new AxeQuat(); etape=0; ellipseMode(CENTER); resetMatrix(); } void draw(){ background(5,15,40);//0,30,80 pushMatrix(); cam.placercamera(); repere(); image(brazil,50,50,200,200); pointeur(); quatsystem.dessiner(vectImpact); popMatrix(); pushMatrix(); resetMatrix(); translate(0 ,0,-1000); fill(255); text(texte,-600,500); text("please, clik SPACE..... and UP, DOWN, LEFT, RIGHT",-600,550); popMatrix(); } void repere(){ float lo,ep,lo2,ep2,dif; lo=100; ep=4; lo2=lo/2; ep2=ep/2; dif=lo2-ep2; pushMatrix(); noStroke(); translate(lo2,ep2,ep2); fill(255,0,0); box(lo,ep,ep); translate(-dif,dif,0); fill(0,250,0); box(ep,lo,ep); translate(0,-dif,dif); fill(0,0,250); box(ep,ep,lo); popMatrix(); } Vecteur absolu(float x,float y,float z){ float xx=modelX(x,y,z); float yy=modelY(x,y,z); float zz=modelZ(x,y,z); return new Vecteur(xx,yy,zz); } void mouseDragged(){ if(mouseY<570){ if(mouseButton==RIGHT){//Déplacer la caméra en calculant son nouveau repere theta+=(mouseY-pmouseY)/200.0f; phi+=(mouseX-pmouseX)/200.0f; repereCamera(); } if(mouseButton == LEFT){//déplacer le sélecteur en calculant le vecteur vectImpact intersectionRayonPlanXY(); }} } public void repereCamera() { Quat quat = new Quat(cos(phi / 2.0F), 0.0F, 0.0F, sin(phi / 2.0F)); Quat quat1 = new Quat(cos(theta / 2.0F), cos(phi) * sin(theta / 2.0F), sin(phi) * sin(theta / 2.0F), 0.0F); lequat = Quat.mul(quat1, quat); camZ = lequat.tourner(camZ0); camY = lequat.tourner(camY0); camX = lequat.tourner(camX0); } public void intersectionRayonPlanXY(){ vectEyeMouse = camZ.mul(distanceEcranOeil).ajouter(camY, mouseY - height / 2).ajouter(camX, mouseX - width / 2); vectOriginMouse = cam.oeil.ajouter(vectEyeMouse, 1.0F); if(vectEyeMouse.z!=0){ float lambda=(zplan-cam.oeil.z)/vectEyeMouse.z;//cam.oeil.z vectImpact=cam.oeil.ajouter(vectEyeMouse,lambda); } } public void pointeur(){ //dessiner le pointeur au point d'impact pushMatrix(); translate(vectImpact.x,vectImpact.y,vectImpact.z); directionalLight(255, 0, 255,-vectImpact.x,-vectImpact.y,-vectImpact.z); fill(255,25,20); noStroke(); beginShape(TRIANGLES); for(int i=0;i<=12;i++){ float a1=PI/6*i,a2=PI/6*(i+1); vertex(0,0,0); vertex(10*cos(a1),10*sin(a1),15); vertex(10*cos(a2),10*sin(a2),15); } endShape(); beginShape(TRIANGLE_STRIP); for(int i=0;i<=12;i++){ float a1=PI/6*i; if(i%2==0){ vertex(4*cos(a1),4*sin(a1),rayon/2); vertex(4*cos(a1),4*sin(a1),rayon*4); } } endShape(); popMatrix(); } void keyPressed() { if(keyCode==' '){ etape=(etape+1)%4; } if(keyCode==RIGHT){ quatsystem.angle=min(quatsystem.angle+0.01f,6.28f);} if(keyCode==LEFT){ quatsystem.angle=max(quatsystem.angle-0.01f,0.1f);} if(keyCode==UP){ quatsystem.rapport=min(quatsystem.rapport+0.01f,3.1f); quatsystem.rap=pow(quatsystem.rapport,1.0f/quatsystem.pas); } if(keyCode==DOWN){ quatsystem.rapport=max(quatsystem.rapport-0.01f,0.3f); quatsystem.rap=pow(quatsystem.rapport,1.0f/quatsystem.pas); } }