La formule de rotation
AlbanR Il y a 3 semaines Premium Pro0

Hello,

dans le DLC #113, David nous montre comment coder un mini moteur 3D fil de fer en Lua/Love2D.

Dans son code, il utilise une fonction permettant d’appliquer une rotation à un point.

Soit un point M ayant pour coordonnées (x, y)

On lui applique une rotation de 𝜃 (théta) radians.

On obtient alors un point M’ ayant pour coordonnées (x’, y’).

La formule de rotation permet de calculer les nouvelles coordonnées (x’, y’) après rotation:

x’ = x . cos 𝜃  –  y . sin 𝜃

y’ = x . sin 𝜃  + y . cos 𝜃

Ici nous sommes en 2D: la direction de l’axe de rotation traverse donc la feuille de papier (le plan). Si l’on considère le plan dans un espace 3D, alors cet axe est l’axe des z et la coordonnée z des points resterait inchangée, les points situés sur l’axe n’étant pas affectés par le mouvement de rotation.

On peut donc écrire la même formule pour une rotation en 3D autour de l’axe z (rotation du point de coordonnées x, y, z de theta radians donnant le point transformé de coordonnées x’, y’, z’):

x’ = x . cos 𝜃  –  y . sin 𝜃

y’ = x . sin 𝜃  + y . cos 𝜃

z’ = z

Dans l’espace, la formule de rotation selon l’axe des x ou l’axe des y est similaire car la transformation suit le même principe avec seulement deux des coordonnées qui sont modifiées et celle de l’axe de rotation qui ne l’est pas.

Je ne m’étends pas plus sur la 3D et vous trouverez facilement ces formules sous une forme mathématique comme ci-dessus et David vous les a données sous forme de fonctions en langage LUA.

 

Dans le DLC #113, David traite ces formules de rotation comme des « boites noires »: on a des coordonnées en entrée, des coordonnées en sortie, on applique la formule et ça marche.

Le but de ce billet est de montrer comment retrouver cette formule de rotation et au passage comprendre pourquoi elle a cette allure là.

Dans l’absolu, ça n’a pas d’interêt pour coder; on ne va pas chercher et re-démontrer la formule à chaque fois qu’on en a besoin évidemment !

Mais ce sont des maths plutôt simples au final: repères, coordonnées, vecteurs unitaires, un peu de cosinus et de sinus …

Je ne suis pas prof de math, alors il y a peut-être des trucs pas super rigoureux dans ce qui suit …

Poser le problème:

Qu’est-ce que l’on connait ? On a:

  • notre point M de coordonnées (x, y) avant rotation
  • un point O autour duquel on tourne
  • notre point M’ de coordonnées (x’, y’) une fois la rotation de 𝜃 radians appliquée

Puisque le point M a effectué une rotation, on peut être certain que les points M et M’ sont sur un même cercle de centre O (le centre de la rotation).

Comme on parle de coordonnées pour nos points, il nous faut un repère.

On se munit donc d’un repère orthonormé dont l’origine va être le point O.

Et pour se simplifier la vie, on va supposer que le cercle sur lequel notre point tourne est de rayon 1. Autrement dit, la distance OM vaut 1.

La distance OM’ vaut aussi 1 car la rotation a conservé cette distance.

Pourquoi choisir arbitrairement cette distance de 1 ? Pour simplifier les calculs car changer d’échelle c’est juste multiplier nos coordonnées par un nombre mais au final tout se simplifie et ce facteur d’échelle disparait de la formule. Et c’est normal, puisque la rotation conserve les distance !

Donc si on était à une distance D du centre avant rotation, on sera toujours à une distance D du centre après rotation. Donc autant choisir 1 !

 

Maintenant, attention ! Quelque chose de fondamental …

Nous avons notre repère mais que veut dire exactement que M a pour coordonnées (x, y) ?

Quand on parle de repère, on indique généralement une origine et deux axes (en 2D en tout cas) perpendiculaires: l’axe des abscisses pour les valeurs de x et l’axe des ordonnées pour les valeurs de y.

En réalité, notre repère c’est un point pour l’origine et deux vecteurs que j’ai appelés i et j.

Comme je ne sais pas comment ajouter des flèches de vecteur sur le texte, je vais utiliser le caractère accent circonflexe « ^ ».

En fait, l’autre particularité de ces deux vecteurs c’est qu’ils ont une longueur (on parle de norme si l’on veut être strict ou magnitude en anglais) de 1. Ce sont des vecteurs unitaires.

On représente parfois des vecteurs unitaires avec un accent circonflexe justement: si i est un vecteur unitaire, on va l’écrire î

Malheureusement comme j accent circonflexe, ça n’existe pas, je ne peux pas faire la même chose qu’avec i.

Je vais donc systématiquement mettre l’accent circonflexe avant. C’est moche, mais la notation sera homogène:

Le vecteur unitaire i: ^i

Le vecteur unitaire j: ^j

Notre repère est donc le repère (O, ^i, ^j).

Je précise également que ces deux vecteurs unitaires ne doivent pas avoir la même direction.

On dit qu’ils sont linéairement indépendants.

Sinon, comme ils ont tous les deux une longueur de 1, si en plus ils avaient la même direction, ils seraient égaux ! Et donc notre repère n’aurait plus qu’un seul vecteur (axe) et nous ne pourrions plus représenter tous les points du plan (2D) mai seulement des points sur une droite (1D).

Mais je m’égare …

J’en reviens donc à cette chose fondamentale dont je parlais plus haut:

Dire qu’un point M a pour coordonnées (x, y) dans le repère (O, ^i, ^j), c’est en fait dire que:

le vecteur OM est égal à x . ^i  +  y . ^j

Autrement dit, tout vecteur du plan est une combinaison linéaire des vecteurs ^i et ^j.

En effet si l’on se représente un vecteur par un déplacement dans le plan, alors tout déplacement peut être décomposé en une quantité de déplacement horizontal + une autre quantité de déplacement vertical.

C’est exactement ce que veut dire cette écriture. Le déplacement de O vers M est composé de x fois le vecteur ^i + y fois le vecteur ^j

 

Maintenant, considérons qu’au lieu de faire tourner le point M, on fait tourner tout le repère d’une rotation de 𝜃 radians.

Comme si vous aviez dessiné la figure précédente sur une feuille et vous faites tourner la feuille.

On obtient une nouvelle paire de vecteurs ^i’ et ^j’ qui ont une longueur de 1 (la rotation ne modifie toujours pas les distances !) et qui sont les images de nos vecteur ^i et ^j d’origine après rotation de 𝜃 radians.

Quelles sont les coordonnées de ces deux vecteurs dans le repère (O, ^i, ^j), c’est à dire le repère de départ ?

Pour ^i’, c’est assez direct:

  • sa coordonnée x est cos 𝜃
  • sa coordonnée y est sin 𝜃

Pour ^j’, il faut remarquer que l’on retrouve l’angle 𝜃 entre les vecteurs ^j et ^j’. De fait,

  • sa coordonnée x est -sin 𝜃
  • sa coordonnée y est cos 𝜃

On peut d’ailleurs vérifier que ces deux vecteurs sont bien toujours orthogonaux en vérifiant que leur produit scalaire est nul:

^i . ^j = cos 𝜃 . sin 𝜃 + -sin 𝜃 . cos 𝜃 = 0

C’est une technique pour obtenir facilement un vecteur orthogonal à un vecteur de direction dans un jeu: il suffit d’inverser les coordonnées x et y et d’ajouter un signe – et hop … ça marche !

 

Maintenant, une observation importante!

Comme on a fait tourner les vecteur de notre repère, les coordonnées du point M’ dans le repère (O, ^i’, ^j’) sont aussi (x, y) !

Imaginez que vous ayez dessiné sur une feuille à carreaux: vous tournez la feuille, mais les carreaux ont tourné avec, ainsi que les points. Les coordonnées restent donc intactes mais dans un nouveau repère !

Si les coordonnées de M’ dans le repère (O, ^i’, ^j’) sont (x, y) alors on peut écrire (vous vous rappelez de la définition fondamentale un peu plus haut ?) que:

(1) le vecteur OM’ est égal à x . ^i’  +  y . ^j’

Or on sait que ^i’ a pour coordonnées (cos 𝜃, sin 𝜃) dans le repère (O, ^i, ^j) ce qui signifie:

(2) ^i’ =  cos 𝜃 . ^i  + sin 𝜃 . ^j

De même, on sait que ^j’ a pour coordonnées (-sin 𝜃, cos 𝜃) dans le repère (O, ^i, ^j) ce qui signifie:

(3) ^j’ = -sin 𝜃 . ^i.  +  cos 𝜃 . ^j

On replace les égalités (2) et (3) dans (1):

vecteur OM’ = x . (cos 𝜃 . ^i  + sin 𝜃 . ^j)  + y . (-sin 𝜃 . ^i.  +  cos 𝜃 . ^j)

= x . cos 𝜃 . ^i + x . sin 𝜃 . ^j  –  y . sin 𝜃 . ^i + y . cos 𝜃 . ^j

On regroupe les termes en ^i et ^j :

vecteur OM’ = x . cos 𝜃 . ^i – y . sin 𝜃 . ^i  + x . sin 𝜃 . ^j  + y . cos 𝜃 . ^j

= (x . cos 𝜃 – y . sin 𝜃) . ^i + (x . sin 𝜃 + y . cos 𝜃) . ^j

Et là Bingo !

C’est exactement la définition qui nous permet d’écrire que:

M’ a pour coordonnée (x . cos 𝜃 – y . sin 𝜃, x . sin 𝜃 + y . cos 𝜃) dans le repère (O, ^i,  ^j)

On a donc trouvé les coordonnées du point M’, image du point M par la rotation de 𝜃 radians dans le repère  (O, ^i,  ^j)

 

Conclusion: j’ai beaucoup détaillé mais l’essence de la démonstration est de s’intéresser à comment sont transformés les vecteurs du repère. Ensuite, les coordonnées des points peuvent être déduites.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.