// Credit: code inspiré de Ariel Malka ArcBall http://www.chronotext.org/bits/030/arcball_1.pde class ArcBall { float centreX, centreY, rayon; Vecteur vSource, vBut; Quat quatNew, quatOld, qTransfert; ArcBall() { this.centreX = width/2; this.centreY = height/2; this.rayon = max(centreX,centreY)*2; vSource = new Vecteur(); vBut = new Vecteur(); quatNew = new Quat(1,0,0,0);//le quaternion qui donne la nouvelle position quatOld = new Quat(1,0,0,0);//le quaternion qui conserve la position actuelle qTransfert = new Quat(1,0,0,0);//le quaternion associé à la rotation qui transforme vSource dans vBut(à un facteur 2 près) } void mousePress() { vSource = pointDeLaSphere(mouseX, mouseY); quatOld.set(quatNew); qTransfert.reset(); } void mouseDrag() { vBut = pointDeLaSphere(mouseX, mouseY); qTransfert.set(Vecteur.dot(vSource, vBut), Vecteur.cross(vSource, vBut)); } void calculerQuat() { quatNew = Quat.mul(qTransfert, quatOld); quatNew.normalize(); } Vecteur pointDeLaSphere(float x, float y) { Vecteur v = new Vecteur(x - centreX,y - centreY,0);//le rayon de la sphere est supérieur à max(w,h) v = new Vecteur(x - centreX,y - centreY,sqrt(rayon - v.length())*4);//x4 pourquoi pas! return v.normalize(); } }