La section précédente vous a appris à colorier des triangles et des quadrilatères. Cette leçon vous apprendra à faire pivoter ces objets colorés autour de leurs axes de coordonnées.
En fait, ajoutez simplement quelques lignes au code de la section précédente. Réécrivons à nouveau toute la routine. Il est pratique pour vous de savoir ce qui a été ajouté et ce qui a été modifié.
Ajoutez deux variables pour contrôler la rotation de ces deux objets. Ces deux variables sont ajoutées après les autres variables au début du programme (bool fullscreen=TRUE ; deux lignes ci-dessous). Ce sont des variables de type virgule flottante qui nous permettent de faire pivoter les objets de manière très précise. Les nombres à virgule flottante contiennent des décimales, ce qui signifie que nous n'avons pas besoin d'utiliser des angles de 1, 2, 3... Vous constaterez que les nombres à virgule flottante sont la base de la programmation OpenGL. La nouvelle variable appelée rtri est utilisée pour faire pivoter le triangle et rquad est utilisée pour faire pivoter le quadrilatère.
Var
…
rtri : GLfloat; // Angle pour le triangle (nouveau)
rquad : GLfloat; // Angle pour quadrilatère (nouveau)
…
Modifiez ensuite glDraw() comme suit :
PRécédure glDraw();
Commencer
glClear(GL_COLOR_BUFFER_BIT Ou GL_DEPTH_BUFFER_BIT); // Efface l'écran et le tampon de profondeur
glLoadIdentity(); //Réinitialiser la matrice d'observation du modèle actuel
//La ligne de code suivante est nouvelle. glRotatef(Angle,Xvector,Yvector,Zvector) est responsable de la rotation de l'objet autour d'un certain axe.
//Cette commande a de nombreuses utilisations. L'angle est généralement une variable représentant l'angle de rotation de l'objet.
//Les trois paramètres Xvecteur, Yvecteur et Zvecteur déterminent conjointement la direction de l'axe de rotation.
//Par exemple, le vecteur décrit par (1,0,0) passe par 1 unité de l'axe des coordonnées X et est dirigé vers la droite.
//Le vecteur décrit par (-1,0,0) passe par 1 unité de l'axe des coordonnées X, mais dans la direction gauche.
//D. Michael Traub : fournit l'explication ci-dessus de Xvector, Yvector et Zvector.
//Pour mieux comprendre la rotation de X, Y et Z, permettez-moi de donner quelques exemples...
//Axe X - Vous utilisez une scie à table. L'axe au centre de la lame est placé de gauche à droite (tout comme l'axe X dans OpenGL).
//Les dents de scie tranchantes tournent énormément autour de l'axe X, apparemment vers le haut ou vers le bas.
//Dépend de la direction dans laquelle la lame de scie commence à tourner. C'est la même situation que lorsque nous faisons pivoter quelque chose autour de l'axe X dans OpenGL.
//(Note du traducteur : si vous placez votre visage vers le moniteur à ce moment-là, vous serez définitivement scié ^-^.)
//Axe Y - Disons que vous êtes au centre d'une énorme tornade, avec le centre de la tornade pointant du sol vers le ciel (tout comme l'axe Y dans OpenGL).
//Les déchets et débris tournent énormément autour de l'axe Y de gauche à droite ou de droite à gauche.
// C'est la même situation que lorsque nous faisons pivoter quelque chose autour de l'axe Y dans OpenGL.
//Axe Z - Vous regardez un ventilateur droit devant vous. Le centre du ventilateur est pointé directement vers vous (comme l'axe Z dans OpenGL).
//Les pales du ventilateur tournent énormément dans le sens des aiguilles d'une montre ou dans le sens inverse autour de l'axe Z. C'est la même situation que lorsque nous faisons pivoter quelque chose autour de l'axe Z dans OpenGL.
glTranslatef(-1.5, 0.0, -6.0); // Déplacement vers la gauche de 1,5 unités et dans l'écran 6.0
//Dans la ligne de code suivante, si rtri est égal à 7, on fait pivoter le triangle de 7 de gauche à droite autour de l'axe Y.
//Vous pouvez également modifier la valeur du paramètre pour faire pivoter le triangle autour des axes X et Y simultanément.
glRotatef(rtri, 0.0, 1.0, 0.0); // Fait pivoter le triangle autour de l'axe Y (nouveau)
//Il n'y a aucune modification dans le code ci-dessous. Un triangle dégradé coloré est dessiné sur le côté gauche de l’écran et pivoté de gauche à droite autour de l’axe Y.
glBegin(GL_TRIANGLES); // Dessine des triangles
glColor3f(1.0, 0.0, 0.0); //Définit la couleur actuelle sur rouge
glVertex3f(0.0, 1.0, 0.0); // Sommet supérieur
glColor3f(0.0, 1.0, 0.0); //Définit la couleur actuelle sur vert
glVertex3f(-1.0, -1.0, 0.0); // En bas à gauche
glColor3f(0.0, 0.0, 1.0); //Définit la couleur actuelle sur bleu
glVertex3f(1.0, -1.0, 0.0); // En bas à droite
glEnd(); // Fin du dessin du triangle
//Vous remarquerez dans le code ci-dessous que nous avons ajouté un autre appel à glLoadIdentity().
//Le but est de réinitialiser la matrice d'observation du modèle.
// Si nous ne réinitialisons pas et n'appelons pas glTranslate directement, des résultats inattendus se produiront.
//Comme l'axe des coordonnées a été tourné, il n'est probablement pas dans la direction souhaitée.
// Ainsi, ce que nous voulions à l'origine déplacer l'objet vers la gauche et la droite peut devenir de haut en bas, en fonction de la rotation de l'axe de coordonnées.
//Essayez de commenter glLoadIdentity() et voyez quels résultats apparaîtront.
//Après avoir réinitialisé la matrice d'observation du modèle, les axes X, Y et Z sont tous réinitialisés et nous appelons glTranslate.
//Vous remarquerez que cette fois nous n'avons déplacé que 1,5 unités vers la droite au lieu de 3,0 unités comme dans la dernière leçon.
//Parce que lorsque nous réinitialisons la scène, la mise au point revient au centre de la scène (à 0,0).
//De cette façon, il vous suffit de vous déplacer de 1,5 unités vers la droite.
//Lorsque nous passons à la nouvelle position, faites pivoter le quad autour de l'axe X. Le carré tournera de haut en bas.
glLoadIdentity(); //Réinitialiser la matrice d'observation du modèle
glTranslatef(1.5, 0.0, -6.0); // Déplacement vers la droite de 1,5 unités et passage à l'écran 6.0
glRotatef(rquad, 1.0, 0.0, 0.0); // Rotation du quadrilatère autour de l'axe X (nouveau)
glBegin(GL_QUADS); // Dessine un carré
glColor3f(0.6, 0.2, 2.0); //Définit la couleur actuelle sur violet
glVertex3f(-1.0, 1.0, 0.0); // En haut à gauche
glVertex3f(1.0, 1.0, 0.0); // En haut à droite
glVertex3f(1.0, -1.0, 0.0); // En bas à gauche
glVertex3f(-1.0, -1.0, 0.0); // En bas à droite
glEnd(); // Fin du dessin du carré
//Les deux lignes suivantes sont nouvelles.
//Si rtri et rquad sont imaginés comme des conteneurs,
//Puis au début du programme nous avons créé des conteneurs (rtri et rquad).
//Lorsque le conteneur est créé, il est vide.
//La première ligne de code ci-dessous ajoute 0,2 au conteneur.
//Donc, chaque fois que nous exécutons le code précédent, la valeur dans le conteneur rtri sera ici augmentée de 0,2.
//La ligne suivante réduit la valeur dans le conteneur rquad de 0,15.
// De même, chaque fois que nous exécutons le code précédent, la valeur dans le conteneur rquad diminuera ici de 0,15.
//La chute finira par faire tourner l'objet dans le sens opposé au sens de croissance.
rtri := rtri + 0.2; // Augmente la variable de rotation du triangle (nouveau)
rquad := rquad - 0.15; // Réduire la variable de rotation du quadrilatère (nouveau)
Fin;