Bonjour,
J'ai un petit soucis de rotation d'objets. J'ai un objet à l'écran, je peux le faire tourner dans tous les sens sur lui même. J'utilise les quaternions pour ne pas que mes axes s'emmelent lors des rotations en séries.
Jusque là tout va bien.
Maintenant j'aimerai qu'automatiquement mon objet effectue une certaine rotation d'une position à l'autre.
En gros j'ai un mesh 3D que j'aimerai, suite à plein de rotations, repositionner vers une certaine rotation. (le devant face à la caméra, le haut face à la caméra, etc.).
J'ai donc essayé d'utilisé les "slerp" pour effectuer une transition douce entre deux quaternions (la courante, et la destination). Mais de temps en temps j'ai des tranformations pas jolie jolie... Le mesh qui se déforme dans tous les sens, puis qui finalement se positionne bien. Mais entre les deux c'est pas beau.
Mais j'arrive pas du tout à voir d'où proviendrais mon erreur. J'aurai pas dû utiliser les quaternions ? les slerps ? une erreur de code ?
Bref, si vous avez des pistes ça serais cool.
Merci d'avance.
J'ai utilisé ce code pour le slerp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Quaternion Slerp( const Quaternion& lhs, const Quaternion& rhs, float t ) { float cosAlpha = lhs.Dot( rhs ); Quaternion r = rhs; if( cosAlpha < 0.0f ) { // if cos(alpha) is positive, then the path from q1 to q2 is shorter. r = -1.0f*r; } cosAlpha = lhs.Dot( r ); float alpha = acos( cosAlpha ); if( fabs( alpha ) < epsilon ) { //< these quaternions are too close to slerp between. return lhs; } float a = sin( ( 1.0f - t ) * alpha ) / sin( alpha ); float b = sin( t*alpha ) / sin( alpha ); Quaternion q = a*lhs + b*r; q.Normalize(); //< we want a unit quaternion return q; }
Partager