l’interpolation sphérique linéaire
L’orientation d’un corps dans l’espace à 3 dimension est défini par 3 angles tout comme la position d’un objet posé sur une sphère est définie par les 2 angles de latitude et de longitude, plus un angle définissant l’orientation de l’objet
Le problème consistant à faire tourner « en douceur » un objet dans l’espace pour l’amener dans une orientation déterminée est appelé « interpolation sphérique linéaire » parce qu’il est équivalent à celui consistant à se déplacer « en douceur » sur une sphère pour atteindre une position et une orientation donnée. Le problème n’est pas trivial pour 2 raisons:
- comme les angles sont définis « modulo 360° », il faut que l’interpolation en tienne compte : si on va par exemple de la longitude -179° à la longitude +179°, il faut faire 2° dans le sens négatif et pas 358° dans le sens positif.
- quelle que soit la manière dont on définit les 3 angles, il existe des « singularités » aux point analogues aux pôles : à la lattitude 90°, la longitude n’a plus d’importance mais si on passe par le pôle, il faut « se rappeler » de notre dernière longitude pour pouvoir continuer « tout droit » dans la longitude augmentée de 180° (modulo 360°), et simultanément éviter qu’une mauvaise description de l’angle d’orientation nous fasse faire brusquement un demi-tout sur nous mêmes en passant par le pôle pour conserver un angle par rapport au nord …
La page « the right way to calculate stuff » dont je parle aussi ici décrit la fonction « slerp » [1] qui définit l’interpolation sphérique linéaire entre 2 vecteurs unitaires v0, v1 ainsi:
sin((1-t)*a) sin(t*a)
slerp(v0,v1,t) = ______________*v0 + __________*v1 sin(a) sin(a)
où a est l’angle entre v0 et v1 (calculé comme indiqué ici). Mais il est clair que pour des angles tels que sin(a) est nul ou très petit, des problèmes numériques vont survenir. En travaillant un peu la fonction slerp peut s’écrire:
sin_over_x((1-t)*a) sin_over_x(t*a) slerp(v0,v1,t) = ____________________*(1-t)*v0 + ________________*t*v1 sin_over_x(a) sin_over_x(a)
où sin_over_x est la fonction sin(x)/x calculée de façon robuste, toujours comme indiqué ici.
Reste à traiter le cas ou a est proche de 180°, ce qui revient à retourner un objet, ou à aller aux antipodes du point où on se trouve sur le globe. Il y a alors une infinité de trajets possibles, et il faut bien en choisir un plutôt que de laisser l’ordinateur se planter…
Références:
- Ken Shoemake, Animating rotation with quaternion curves, SIGGraph ’85 proceedings
[…] partie vraiment intéressante concerne l'interpolation sphérique linéaire. (Comme c'est assez spécifique à la 3D, je publie aussi ce qui suit sur mon blog […]
[…] partie vraiment intéressante concerne l’interpolation sphérique linéaire. (Comme c’est assez spécifique à la 3D, je publie aussi ce qui suit sur mon blog […]