//=================================================== class Bille{ Vecteur pos,pos0,vit,vit0,accel,center,axeRot,lanormale,laderive,latangente,force; int numero; float r,m,angleRot,deltangle; Terrain lesol; Quat qRotLocal; public Bille(int numero,Vecteur pos,Vecteur vit,float r,Terrain lesol){ this.lesol=lesol; this.numero=numero ; this.pos=pos; pos.y=lesol.cote(pos.x,pos.z); this.r=r; this.m=r*r*r/10000; this.center=getCenter(); qRotLocal=new Quat(1,0,0,0); lanormale=lesol.getNormale(pos.x,pos.z); this.vit=projeterSurPlanTangent(vit); } //================================================================= Vecteur projeterSurPlanTangent(Vecteur v){ Vecteur res= v.ajouter(lanormale.mul(v.dot(lanormale)),-1); return res; } //================================================================= Vecteur getCenter(){ return pos.ajouter(lesol.getNormale(pos.x,pos.z),r); } //================================================================= void actualiser(){ pos0=pos.cloner(); vit0=vit.cloner(); force=pesanteur0.ajouter(lanormale.mul(pesanteur0.dot(lanormale)),-1); vit=vit.ajouter(force,dT/m); pos=pos.ajouter(vit, dT); pos.y=lesol.cote(pos.x,pos.z); vit=pos.ajouter(pos0,-1).normalize(vit.length());//correction de la nouvelle position if (pos.y>limite) { pos.x=pos.x*limite/pos.y; pos.z=pos.z*limite/pos.y; pos.y=lesol.cote(pos.x,pos.z);; vit=vit0.mul(0.8f); vit.y*=-1; vit=projeterSurPlanTangent(vit); } deltangle=dT*vit.length()/(2*r); // laderive=lesol.getDerive(pos.x,pos.z); latangente=lesol.getTangente(pos.x,pos.z); // Vecteur n0=lanormale.cloner(); // lanormale=lesol.getNormale(pos.x,pos.z); Vecteur omega=lanormale.cross(vit).mul(1/r); float angl=dT*omega.length()/2; //calcul du quaternion qRot float cost=(float)Math.cos(angl); // float sint=(float)Math.sin(angl); Vecteur omegan=omega.normalize(); Quat qomegat=new Quat(cost,sint*omegan.x,sint*omegan.y,sint*omegan.z); qRotLocal=Quat.mul(qomegat, qRotLocal); qRotLocal.normalize(); } //================================================= void afficherSphere(){ lesol.dessinerOmbre(pos.x-r*0.5f, pos.z+r*0.5f,r*0.9f); pushMatrix(); Vecteur pos1=pos.ajouter(lanormale,r*1.05f); translate(pos1.x,pos1.y,pos1.z); float[] tbLocal=qRotLocal.getValue(); stroke(255,255,0); rotate(tbLocal[0],tbLocal[1],tbLocal[2],tbLocal[3]); fill(255,70*numero,75*(4-numero)); noStroke(); // box(r*1.5f); dessinerSphere(); popMatrix(); } // ******************************************* void dessinerSphere(){ pushMatrix(); stroke(150,50); for(int i=0;i<8;i++){ float co=(float)Math.cos(PI/8*i); float si=(float)Math.sin(PI/8*i); fill(120+25*i,120+25*i,55+25*(8-i)); afficherCercle(co,0,si,r,0.0f,0.0f,0.0f); afficherCercle(0.0f,1.0f,0.0f,r*si,0.0f,r*co,0.0f); } popMatrix(); } // ******************************************* void afficherCercle(float nx,float ny,float nz,float r,float cx,float cy,float cz){ pushMatrix(); ellipseMode(CENTER); translate(cx,cy,cz); rotateZ(atan2(ny,nx)); rotateY(atan2(sqrt(nx*nx+ny*ny),nz)); ellipse(0, 0, 2*r, 2*r); popMatrix(); } void afficherRepere(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); } }