Bon je rappelle des infos de base, pour s´entendre sur le lexique.
On représente habituellement l’ossature d’un personnage animé par une hiérarchies d’« os » où chacun possède une position relative à son précédent dans la hiérarchie. Souvent le point de départ de la hiérarchie est le bassin. D’un point de vue math, on représente chaque articulation par deux informations : d’une part la distance par rapport à l’articulation précédente (par exemple, le coude est à L centimètres de l’épaule) et d’une rotation. La première est usuellement constante (le squelette ne se déforme pas, les os ne s’allongent pas) et est représentée par une matrice de translation (la longueur L est placée dans la composante x, tandis que y et z sont laissés à zéro). La rotation est elle aussi représentée par une matrice de rotation et c’est elle qui sera animée.
(J’ai un peu simplifié, il y a mille petites règles, habitudes et astuces : par exemple on incorpore un facteur d’échelle et la translation n’est pas nécessairement alignée exactement sur un axe)
Pour passer des coordonnées « locales » de chaque articulation à une position dans le monde, tu composes les matrices de translations et de rotation depuis la racine de la hiérarchie jusqu’au point que tu veux calculer. Par exemple, en prenant la notation « a gauche » tu obtiens pour le poignet quelque chose comme :
M_poignet = T_poignet * R_poignet * T_coude * R_coude …. * T_bassin * R_bassin
(avec chaque T_ et R_ correspondant respectivement à une matrice de translation ou de rotation)
Maintenant les quaternions apportent une autre représentation de la rotation. Dans la plupart des cas il ne servent qu’au stockage des animations et à l’interpolation, en revanche pour les autres calculs 3D ils sont convertis en matrice. Il y a une quasi-équivalence entre matrice de rotation et quat (« quasi » : c’est-à-dire que d’un point de vue pratique c’est équivalent, mais il y a des détails sur le plan math qui diffèrent).
Tout cela pour dire que bien que ta question mathématiquement correcte (je détaille ci-après), on utilise plus fréquemment les matrices, même lorsque la source de données était basée sur des quats.
Dans ton exemple, si tu veux connaître la position d’un vecteur après une rotation comprise entre Q1 et Q2, tu peux le faire ainsi :
Vector3 BlendRotation ( Quat Q1, Quat Q2, float inter, Vector3 v )
Quat Q = Slerp( Q1, Q2, t )
Quat Qv ( v.x, v.y, v.z, 0 )
Quat Qr = Q * Qv * ~Q
Return Vector3( Qr.x, Qr.y, Qr.z )
Note: ~Q pour le conjugué de Q
La rotation d’un vecteur par un quat est donnée par : Q * Qv * ~Q
En espérant que ce soit plus limpide qu’un fog Londonien.
A02halo well, je connais cette impression Ce qui est intéressant toutefois c’est qu’en fait on comprend tous les question posées par ce genre de problème math, c’est la formulation qui devant être précise, univoque qui rend la lecture difficile.