/*Alcys_Selector3D *IL s'agit de déplacer des pieces sur un damier3D. Le selecteur de piece est un pointeau blanc *que l'on peut déplacer à la souris sur les cases en draguant sa pointe en pressant sur le bouton droit. *Avant de draguer il est conseillé de placer le curseur sur la pointe du sélecteur. Les touches "q" et "w" ou UP et * DOWN permettent de mofier la taille du pointeau. Dès que le pointeau est assez proche de la pointe d'un cone rouge *celui-ci peut être sélectionné par la touche "p". * Le déplacement se fait par clic droit et drag. *La désection se fait par la touche "r" *Le pointeau peut-être inversé par la touche "i" * *Credit : Markavian et MyT see: http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Contribution_3DOpenGL;action=display;num=1116270837 * * right click and drag to it selector white to bring it closer a red cone. *This one will be selected by the key "p" for move. * The key "R" removes this selection. * The keys "I" "W" "Q" modify the selector.. * **/ Camera cam; float theta,phi,distanceEcranOeil,cote; Quat lequat; Vecteur camX,camY,camZ,camX0,camY0,camZ0,vectOriginMouse,vectEyeMouse,vectImpact ; int doInverse; PFont mafont; LesPions pionsys; void setup(){ size(800,600,P3D); distanceEcranOeil=height/(2*(float)Math.tan(PI/6)); theta=1.0f; phi=1.0f; cote=40; doInverse=1; lequat=new Quat(1,0,0,0); 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(); cam=new Camera(camX0,camY0,camZ0); vectOriginMouse=new Vecteur(0,0,0); vectImpact=new Vecteur(0,0,cote); mafont=loadFont("Arial.vlw"); textFont(mafont,20); mafont=loadFont("Arial.vlw"); textFont(mafont,10); Pion[] pions=new Pion[4]; pions[0]=new Pion(77,88,40); pions[1]=new Pion(-77,108,30); pions[2]=new Pion(77,-50,50); pions[3]=new Pion(-47,188,55); pionsys=new LesPions(pions); } void draw(){ background(200,200,255); cam.placercamera(); directionalLight(190, 255, 255, 0.3,0.4,-0.2); ambientLight(155,150,180); damier(); pionsys.dessiner(); pointeur(); } void repere(){ stroke(255 ,0 , 0); line(0,0,0,100,0,0); stroke(0 ,255 ,0 ); line(0,0,0,0,100,0); stroke(0 ,0 ,255 ); line(0,0,0,0,0,100); } 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 keyPressed(){ if(keyCode==UP ||key=='q')cote=cote+1; if(keyCode==DOWN || key=='w')cote=cote-1; vectImpact.z=cote; if(key=='i')doInverse*=-1; if(key=='p')pionsys.CalculerLePionMobile(); if(key=='r')pionsys.mobile=-1; } void mouseDragged(){ if(mouseButton==LEFT){ theta=(mouseY-pmouseY)/30.0f; phi=(mouseX-pmouseX)/30.0f; lequat=Quat.mul(new Quat(cos(theta/2),sin(theta/2),0,0),lequat); lequat=Quat.mul(new Quat(cos(phi/2),0,0,sin(phi/2)),lequat); camZ=lequat.tourner(camZ0); camY=lequat.tourner(camY0); camX=lequat.tourner(camX0); } if(mouseButton==RIGHT){ vectEyeMouse=camZ.mul(distanceEcranOeil).ajouter(camY,mouseY-height/2). ajouter(camX,-mouseX+width/2); vectOriginMouse=cam.oeil.ajouter(vectEyeMouse,1); intersectionRayonPlanXY(); } } public void intersectionRayonPlanXY(){ if(vectEyeMouse.z!=0){ float lambda=(cote-cam.oeil.z)/vectEyeMouse.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); fill(0); translate(0,0,10); text(" x= "+round(vectImpact.x)+" y= "+round(vectImpact.y)+" z= "+round(vectImpact.z),0,0); translate(0,0,-10); fill(185,180,205); 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),-cote/3*doInverse); vertex(10*cos(a2),10*sin(a2),-cote/3*doInverse); } 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),-cote/3*doInverse); vertex(4*cos(a1),4*sin(a1),-cote*doInverse); } } endShape(); popMatrix(); } void damier(){ for(int li=-5;li<5;li++){ for(int co=-5;co<5;co++){ int coul=((li+co)%2==0)? 255:0; fill(coul); rect(co*50-25,li*50-25,50,50); } } }