Je suis nul en quartenions... a l´occas, j´aimerais bien apprendre a m´en servir.
La méthode que je vais te donner est différente ( vetcorielle et matricielle)
Moi je vais te donner autre chose :
( je fais la fonction a la volée, l´algorithme est formel pas vérifiée, de plus, j´emploie des fonctions que tu devas implémenter)
void Rotation(float *x,float *y,float *z,float nx,float ny,float nz,float mx,float my,float mz,float a)
{
point A(nx,ny,nz); / / point de départ de ton axe de rotation
point B(mx,my,mz); / / point d´arrivée
point P(*x,*y,*z); / / point a faire tourner.
vecteur z(A,B); / / vecteur directeur de ton axe.
normalise(z); / / faut que la norme vale 1.
point O = projection_orthogonale_point_sur_vecteur(P,A,z); / / te trouve le point projeté orthogonal de P sur ton vecteur.
vecteur x(O,P); / / vecteur x du repere, non normalisé.
vecteur y = produit_vectoriel(z,x); / / y fera la meme norme que x.
point resultat = O + x*cos(a) + y*sin(a); / / je te renvoie a l´algebre des vecteurs, c´est tres facile.
}
Je te fais la fonciotn délicate suivante :
point projection_orthogonale_point_sur_vecteur(point P,point A,vecteur z)
{
float k;
/ / k sera le parametre ou le point O sera sur z avec A comme origine.
/ / OP.z = 0 --> produit scalaire < => OPx*zx + OPy*zy + OPz*zz = 0
/ / < => ( Px-Ax-k*zx)*zx + ( Py-Ay-k*zy)*zy + ( Pz-Az-k*zz)*zz =0
/ / 1 equation, 1 inconnue ( k)
/ / < => Px*zx-Ax*zx - k*zx² + Py*zy-Ay*zy - k*zy² + Px*zz-Ax*zz - k*zz² = 0
k = ( Px*zx-Ax*zx + Py*zy-Ay*zy + Px*zz-Ax*zz)/(zx²+zy²+zz²);
return A+k*z; / / point O retourné.
}
Je te laisse vérifier les calculs, il se peut qu´ils soient faux ( j´ai fait ça de tete rapidos)