Programmation Graphique : TP séance 06
- Rendu du TP sur Ametice :
- Suivez les instructions pour le rendu du TP en mettant le bon numéro de séance dans le nom du répertoire.
- N'oubliez pas de rendre votre travail à la fin de la séance comme indiqué, même si vous n'avez pas fini la planche de TP, puis de rendre la version finale (sans changer le nom du fichier) avant le deadline indiqué sur Ametice.
Exercice 1. Pédalier avec shaders multiples
On se propose d'animer un pédalier de vélo, relié à un pignon avec une chaîne composée de maillons, en utilisant différents shaders pour l'éclairage et des textures.
Dans votre nouveau répertoire pgra-TP06-NOM1-NOM2
, récupérer les
fichiers suivants :
le Makefile
du TP 04 (qui compile avec stb_image
),
les fichiers de GLAD glad.c
, glad.h
,
khrplatform.h
,
le module de calcul matriciel vmath.h
,
le petit complément vmath-et.h
,
la librairie tout-en-un stb_image.h
et le petit
module C associé stb_image.c
.
Enfin, récupérer l'exemple de départ fw62-ubo.cpp
.
Vérifiez que vous pouvez compiler et exécuter l'exemple (au besoin, voir 3.1. Installation et compilation dans le CM 01).
On peut afficher les shaders par défaut et les modifier, voir l'affichage
avec l'argument --help
.
La touche U
recharge les shaders sans quitter le programme.
La touche a
déclenche une animation, la touche p
change le type de
projection, h
affiche l'aide pour les réglages de la projection.
Les éléments utiles en OpenGL core pour réaliser ce TP sont expliqués dans le CM 06.
1.1. Préparation
Supprimez toutes les classes de dessin sauf WireCube
; dans displayGL
,
placez le WireCube
au centre de la scène (en supprimant la rotation et la
mise à l'échelle.
Rajoutez les classes de dessin mises au point dans les précédents TPs :
les classes Cylindre
, Pedale
, RoueNor
.
Écrivez une nouvelle classe Boite
permettant de dessiner une boîte
rectangulaire de taille donnée, avec les normales aux faces. Chaque face
est constituée de 2 triangles.
Instanciez chaque classe dans l'application et affichez-les dans différentes parties de la fenêtre, avec les program shader qui conviennent parmi ceux donnés par défaut.
2.2. Éléments à animer
Il est conseillé de lire la suite de l'énoncé en entier avant de poursuivre le codage.
Les éléments mécaniques à afficher sont :
- le plateau avant (une roue dentée) ;
- le pignon arrière (une autre roue dentée, plus petite);
- la chaîne, qui relie le plateau avant au pignon arrière ;
- les manivelles, de part et d'autre du plateau avant ;
- les pédales, solidaires des manivelles ;
-
les axes situés au travers
- du pignon,
- du plateau et des manivelles,
- de chaque manivelle et de sa pédale.
Lorsqu'on fera tourner le plateau, les manivelles tourneront de concert ; les pédales resteront horizontales ; la chaîne sera entraînée par le plateau, et mettra en rotation le pignon.
Le pédalier sera animé en maintenant la touche espace enfoncée.
Pour simplifier les calculs, le rapport entre le nombre de dents du plateau et du pignon sera un nombre entier. Par exemple si on prend 30 et 10 dents, le rapport étant de 3, cela signifiera que le pignon tournera 3 fois plus vite que le plateau (angle multiplié par 3), et que le rayon du plateau sera 3 fois le rayon du pignon.
La chaîne sera composée de maillons internes et de maillons externes (comme c'est le cas sur un vrai vélo, une moto ou encore une tronçonneuse !). Un maillon externe pourra être représenté par 2 cylindres encadrés par 2 boîtes rectangulaires fines avec des coins aplatis ; idem pour un maillon interne mais sans les cylindres.
Pour que le résultat soit esthétique, faites des roues assez fines, avec des dents assez petites (à peu près la hauteur d'un maillon).
2.3. Placement des maillons
Le point important est le placement des maillons : ils sont articulés entre eux et s'insèrent parfaitement entre les dents du plateau et du pignon. On suppose que la chaîne est tendue (il faudra peut-être tâtonner pour trouver la position idéale du pignon selon le nombre de maillons que vous avez choisi, qui est nécessairement pair).
Un maillon peut être dans 3 situations :
-
plaqué sur une roue dentée (\(A \ldots B\), \(C \ldots D\)): les cylindres du maillon sont dans l'alignement du creux de part et d'autre de la dent ;
-
entre le plateau et le pignon (\(D \ldots A\), \(B \ldots C\)), sur une ligne droite parallèle à une tangente aux deux roues (pointillés magenta) ;
-
situation intermédiaire (en \(A\), \(B\), \(C\), \(D\)) : un cylindre du maillon dans un creux entre 2 dents, l'autre sur une des lignes tangentes. end{enumerate}
Dans le cas 1, le placement sera calculé par rapport à l'angle de rotation de la roue dentée. Dans le cas 2, le placement se fera de proche en proche, à partir du premier maillon qui est dans le cas 3.
Le principe est donc, étant donné la position du plateau, de placer angulairement tous les maillons sur la zone extérieure du plateau de \(A\) à \(B\), puis l'un après l'autre les maillons alignés de \(B\) à \(C\), où on arrive sur le pignon ; on fait le tour de \(C\) à \(D\) angulairement, et enfin l'un après l'autre les maillons alignés de \(D\) à \(A\).
Il faut donc bien placer le pignon par rapport au plateau pour que les maillons s'emboîtent bien et que la jonction en arrivant sur \(A\) se fasse bien (sinon, pendant la rotation du pédalier, on aura l'impression que les maillons sont élastiques ! on peut tricher un tout petit peu).
2.4. Dessins
Faire une classe Maillon
avec un flagis_external
.
Le maillon instanciera 2 cylindres et 2 boîtes (pour les côtés)
s'il est externe, sinon seulement 2 boîtes.
Instancier ensuite le plateau, le pignon, une manivelle, une pédale, un cylindre, un maillon externe et un maillon interne (chaque instance en un seul exemplaire).
Dessiner la scène consistera donc à appeler la méthode de dessin des instances (autant de fois que nécessaire, en particulier pour chaque maillon), en plaçant chaque fois l'objet à l'aide de matrices (pour la position et l'éclairage).
2.5. Éclairage et texture
La scène sera éclairée avec une lumière diffuse et une lumière ambiante ; de plus un lissage de Phong sera effectué pour les facettes des cylindres. Ne choisissez pas de couleurs trop sombres afin que le lissage soit bien visible.
Les côtés du plateau seront décorés par une texture représentant du bois.
Chacune des 2 faces sera éclairée et tournera avec le plateau.
Il faudra donc rajouter un shader program combinant éclairage diffus et
texture ; on l'appellera texlight
.