/*Alcys_Dessin3D *IL s'agit d'écrire sur des plans , appelés plan d'écriture. Le pointeau rouge modifie le vecteur normal du plan où l'on désire écrire . *Celui-ci est déplacé par le clic droit et drag sur sa pointe . *Avant de draguer il est conseillé de placer le curseur sur la pointe du sélecteur. * Le plan d'écriture étant dans la position désirée vous pouvez écrire dessus par clic gauche et drag *Pour voir mieux vos tags vous pouvez taper la barre SPACE qui permet la rotation de tout le system *Le plan d'écriture peut assi être translaté par les touches UP DOWN * right click and drag red cone to move plan . *left click and drag to draw in the plan . * The bar "SPACE" turn the system * The bar "SPACE" * the keys UP , DOWN translate the plan. **/ Camera cam; float theta,phi,distanceEcranOeil,cote, hcote,angle; Quat lequat; Vecteur camX,camY,camZ,camX0,camY0,camZ0,vectOriginMouse,vectEyeMouse,vectImpact ,vecabsolu; int doInverse; PFont mafont; Vector points; AxeQuat quatsystem; boolean btourne; //----------------------------------------------- //----------------------------------------------- void setup(){ size(800,600,P3D); distanceEcranOeil=height/(2*(float)Math.tan(PI/6)); theta=1.0f; phi=1.0f; cote=40; hcote=50; doInverse=1; lequat=new Quat(1,0,0,0); camX0=new Vecteur(-1,0,0); camY0=new Vecteur(0,1,0); camZ0=new Vecteur(0,0,-1); camZ=camZ0.cloner(); camY=camY0.cloner(); 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); points= new Vector(); quatsystem=new AxeQuat(); frameRate(50); } //----------------------------------------------- //----------------------------------------------- void draw(){ if(btourne)angle+=0.05; background(255,200,205); pushMatrix(); cam.placercamera(); rotateY(angle); dessinerPoints(); repere(); //damier(); pointeur(); quatsystem.dessiner(vectImpact); popMatrix(); rectMode(CENTER); } //----------------------------------------------- //----------------------------------------------- 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); } //----------------------------------------------- //----------------------------------------------- void keyPressed(){ if((keyCode==RIGHT ||key=='q')&&cote<500)cote=cote+5; if((keyCode==LEFT || key=='w')&&cote>5)cote=cote-5; if((keyCode==UP ||key=='q')&&hcote<500)hcote=hcote+5; if((keyCode==DOWN || key=='w')&&hcote>-500)hcote=hcote-5; if(key==' '){btourne=!btourne;angle=0;} vectImpact.z=cote; if(key=='i')doInverse*=-1; } //----------------------------------------------- //----------------------------------------------- void mouseDragged(){ if(mouseButton==LEFT){//Déplacer le point dans le plan normal à vectImpact vectEyeMouse=camZ.mul(distanceEcranOeil).ajouter(camY,mouseY-height/2). ajouter(camX,-mouseX+width/2); vectOriginMouse=cam.oeil.ajouter(vectEyeMouse,1); ajouterPoint( intersectionRayonPlanUV()); } if(mouseButton==RIGHT){//déplacer le sélecteur en calculant le vecteur vectImpact vectEyeMouse=camZ.mul(distanceEcranOeil).ajouter(camY,mouseY-height/2). ajouter(camX,-mouseX+width/2); vectOriginMouse=cam.oeil.ajouter(vectEyeMouse,1); intersectionRayonPlanXY(); } } //----------------------------------------------- //----------------------------------------------- public Vecteur intersectionRayonPlanUV(){ Vecteur au=vectImpact.normerCopie(hcote); float numerateur=(au.ajouter(cam.oeil,-1)).dot(vectImpact); float denom=vectEyeMouse.dot(vectImpact); float lambda=numerateur/denom; return cam.oeil.ajouter(vectEyeMouse,lambda); } 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(); stroke(255); line(0,0,0,vectImpact.x,vectImpact.y,vectImpact.z); translate(vectImpact.x,vectImpact.y,vectImpact.z); fill(255,60,65); 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(){ int coul; for(int li=-15;li<15;li++){ for(int co=-15;co<15;co++){ coul=((li+co)%2==0)? color(155,170,255):color(150,150,195); fill(coul,200); rect(co*100-25,li*100-50,100,100); } } } //----------------------------------------------- //----------------------------------------------- void ajouterPoint(Vecteur vect){ points.addElement(vect); if(points.size()>2500)points.removeElementAt(0); } //----------------------------------------------- //----------------------------------------------- void dessinerPoints(){ Vecteur v; for(int i=0;i