Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Dans cette annexe mathématique nous verrons le concept mathématique de trigonométrie, généralement rencontrée dès la classe de 4ème dans le cursus français.
Nous nous contenterons de parcourir le minimum utile pour faire de la 3D et nous verrons que des outils mathématiques faciles d'utilisation peuvent nous être grandement utiles.
La trigonométrie (littéralement "mesures" dans le "triangle"), est une branche des maths qui vient donner des relations entre les longueurs des cotés d'un triangle et ses angles.
La trigo se recontre généralement dans le cas d'un triangle rectangle :
En considérant l'angle alpha, on définit deux fonctions "cosinus" et "sinus" permettant de donner une relation entre la valeur de cet angle, et les longueurs des cotés du triangles :
En utilisant l'inverse de ces fonctions on peut alors trouver la valeur de l'angle en fonction des longueurs des cotés. On peut tout aussi bien, à partir de la valeur de l'angle et de la longueur d'un seul coté du triangle, trouver les longueurs des autres cotés.
Le triangle rectangle est la première approche que l'on a de la trigonométrie. On introduit généralement un autre objet mathématique : le cercle trigonométrique. Ce cercle mesure "1" (pas d'unité requise) de rayon et nous permet de donner tout leur sens au cosinus et sinus que nous venons de rencontrer :
Dans la figure ci-dessus on retrouve un triangle rectangle et donc nos formules vues plus haut sont toujours applicables :
Et là tout s'éclaire ! Alors qu'auparavant nous pensions que cos et sin étaient de simples mesures abstraites qui ne servaient pas à grand chose, ici on se rend compte grâce au cercle trigonométrique qu'elles permettent de donner l'abscisse (sur X) et l'ordonnée (sur Y) d'un point quelconque du cercle trigonométrique se trouvant à un angle alpha donné par rapport à l'origine.
On note au passage que les angles se mesurent ici dans le sens trigonométrique (c'est à dire le sens inverse des aiguilles d'une montre).
Nous avons vu rapidement dans le cas du cercle trigonométrique que nous pouvions passer d'un angle à une coordonnée (X,Y). Il est donc temps de faire un petit rappel non exhaustif sur les systèmes de coordonnées qui nous intéressent avec OpenGL.
Coordonnées cartésiennes
Les coordonnées cartésiennes sont les plus courantes. C'est d'ailleurs dans ce système qu'on exprime les positions de nos vertices avec OpenGL :
glVertex3d( X, Y, Z);
Coordonnées polaires
Les coordonnées polaires sont un autre système de coordonnées que nous n'utiliserons pas trop mais qui nous sert d'intermédiaire pour bien comprendre la suite.
Un point est repéré par un
angle (thêta) et un
rayon (r). On y voit une généralisation du cercle trigonométrique (où r valait 1) et donc pouvons très facilement en déduire commencer passer des coordonnées polaires aux coordonnées cartésiennes :
Exemple en OpenGL
Nous venons de voir qu'il est possible d'exprimer un même point dans des systèmes de coordonnées différents.
Nous pouvons donc envisager deux méthodes identiques en OpenGL pour faire tourner un point autour de l'origine :
| Coordonnées polaires | Coordonnées cartésiennes* |
|---|
Code : C1
2
3
4 | glRotated(theta,0,0,1);
glBegin(GL_POINTS);
glVertex2i(r,0);
glEnd();
|
|
Code : C1
2
3
4
5
6
7 | #include <math.h>
x=r*cos(theta*M_PI/180);
y=r*sin(theta*M_PI/180);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
|
|
* les angles en OpenGL sont exprimés en degré, cependant cos et sin, les fonctions définies dans <math.h>, attendent des radian. Il faut donc les convertir en multipliant par M_PI/180.
Coordonnées sphériques
Ce système de coordonnées peut être vu comme une généralisation des coordonnées polaires en 3D. Il est très utile et nous servira notamment à contrôler l'orientation de notre caméra à l'aide de la souris.
En coordonnées sphériques, un point est représenté par
un rayon r, et
deux angles thêta et phi :
Pour passer des coordonnées sphériques aux coordonnées cartésiennes qui nous sont si chères, il faut y aller en 2 étapes et se ramener à des cas 2D très simples.
Tout d'abord considérons seulement le rayon r et l'angle phi. Nous nous ramenons à un cas de coordonnées polaires sur le plan XZ :
Nous pouvons en déduire directement la coordonnée Z de notre point avec le sinus , et le cosinus nous permet de définir une variable intermédiaire rtemp.
rtemp est le rayon d'un cercle intermédiaire placé à l'altitude Z de notre point :
En regardant notre sphère du dessus et considérant le cercle de rayon rtemp avec le dernier angle thêta, nous sommes à nouveau dans un simple problème de coordonnées polaires. Il est donc aisé de déterminer les coordonnées X et Y finale de notre point :
En résumé nous avons donc tout simplement :
Comme je l'ai dit plus haut, ce système de coordonnées nous sera très utile car nous pourrons ainsi contrôler l'orientation de la caméra à la souris : l'angle thêta contrôle l'orientation horizontale du regard (comme quand on fait "non" de la tête) et l'angle phi contrôle l'orientation verticale du regard (comme quand on fait "oui" de la tête).
Ce chapitre, d'un niveau mathématique assez facile (collège), viendra trouver tout son sens dans le chapitre qui arrive : contrôle avancé de la caméra, où nous contrôlerons une caméra de type free-fly avec la souris le clavier.