Sujets et Corrections |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
TP n°1 et TP n°2 : Premières implantations OpenGL Exercice n°1
Télécharger le fichier archive IG-2024-2025.zip. Ce fichier archive contient une "solution" Visual Studio 2022. Une solution est un package destiné à référencer
des projets de développement Visual Studio (exécutables, librairies, dll, drivers..., mais aussi éventuellement sites web statiques ou dynamiques). La concrétisation physique d'une solution est formée
a minima d'un fichier .sln quand elle ne contient aucun projet de développement. Elle consistera plus généralement en un fichier .sln, en les fichiers .vcxproj des projets qu'elle inclut et en
les fichiers (source ou autre) nécessaires à la compilation de ces projets. Il est bon que tout cela soit organisé physiquement en répertoires pour que tout ne soit pas mélangé.
Le contenu de la solution peut être visualisé dans Visual Studio en utilisant l'explorateur de solution (item supérieur du menu Affichage). La solution IG-2024-2025 comprend
un seul projet de développement nommé Exemple. Ce projet référence un seul fichier source Exemple.cpp et est préconfiguré pour une compilation utilisant OpenGL :
1) Extraire l'archive IG-2024-2025.zip. Lancer Visual Studio et charger la solution. Elle est théoriquement compatible avec les versions 2015, 2017, 2019 et 2022 de
Visual Studio au prix d'une conversion qui devrait être proposée lors du premier chargement. 2) Le fichier code source GLUtMinimum.cpp illustre le fonctionnement événementiel de la librairie GLUt. On rappelle que nous allons utiliser cette librairie annexe à OpenGL pour construire l'interface utilisateur de nos programmes OpenGL, celui-ci ne contenant aucune fonction dédiée à cette fin.
Le fichier source GLUtMinimum.cpp contient le minimum possible d'appels à OpenGL tout en affichant quand-même quelque chose, de façon à mettre en évidence les fonctionnalités GLUt et non les fonctionnalités OpenGL. a) Repérer dans le code les appels de fonction qui semblent correspondre aux fonctionnalités implantées listées ci-dessous en italique. Placer des commentaires dans le code pour garder une trace de ce que vous avez repéré.
La scène construite est constituée d'un unique tore muni du matériel par défaut d'OpenGL. Le calcul d'illumination est activé et une seule lumière est allumée. L'élimination des parties
cachées est activée. La projection est réalisée en projection orthographique. Le contenu du volume cubique dont la diagonale est définie par les positions (-1.0,-1.0,-1.0) et (1.0,1.0,1.0) du repère de
modélisation est affiché dans le viewport de visualisation (la fenêtre) en projection selon l'axe -z du repère de modélisation. Le viewport de visualisation est configuré pour occuper automatiquement
(dynamiquement) l'intégralité de la fenêtre.
Les événements suivants sont gérés "normalement" avec exécution de code OpenGL valide et cohérent : b) Remplacer le fichier Exemple.cpp par le fichier GLUtMinimum.cpp dans le projet VisualStudio. Le fichier GLUt-3-spec.pdf contient la documentation de référence de GLUt. Il pourra vous aider à implanter les réponses aux questions c) à g).
De part sa nature non orientée objet la librairie GLUt ne peut pas être employée sans utiliser des variables globales. Celles-ci permettent le partage d'informations entre les différentes fonctions
implantées pour être exécutées en réponse aux événements. De façon à ne pas aller contre le fonctionnement événementiel de GLUt mais plutôt à s'inscrire dans son cadre, on évitera de s'autoriser
à placer des instructions OpenGL dans toutes les fonctions événementielles et on limitera un tel placement aux seules fonctions display (rafraichissement de la fenêtre de dessin) et reshape (changement
de la taille de la fenêtre de dessin). Il est naturel que ces deux fonctions aient à contenir de l'OpenGL car la fonction reshape devra configurer la caméra virtuelle de visualisation OpenGL et la
fonction display devra modéliser la scène en OpenGL. Au lancement de l'application, GLUt entre en boucle infinie après post automatique d'un événement reshape et d'un événement display. Il
exécute donc la fonction reshape puis la fonction display, et se met en attente d'événements. Les événements peuvent arriver à n'importe quel instant et être de n'importe quel type lorsqu'ils
arrivent y compris des reshape et des display. Placer des instructions OpenGL dans d'autres fonctions que reshape et display n'est pas interdit mais présenterait pour inconvénient de générer un
flux OpenGL plus difficile à rendre déterministe, nous allons donc éviter de le faire.
c) Implanter un contrôle clavier permettant de switcher entre les modes d'affichage plein et fil de fer en utilisant la touche de clavier Espace.
d) Implanter une animation telle que le tore tourne sur lui-même autour de l'axe Ox à raison de 1° de rotation entre chaque image.
e) Implanter un contrôle clavier permettant d'activer/désactiver l'animation au moyen de la touche Entrée.
f) Implanter un contrôle clavier permettant de faire tourner interactivement le tore sur lui-même autour de l'axe Oy dans un sens ou dans l'autre en utilisant les touches Flèche gauche
et Flèche droite du clavier. On pourra par exemple appliquer une rotation de 1° ou de -1° à chaque utilisation d'une des flèches.
g) Implanter un contrôle permettant de faire tourner le tore sur lui-même autour de l'axe Oz en réaction aux mouvements horizontaux de la souris bouton appuyé à raison de 1° de rotation
par pixel de déplacement.
TD n°1 : Modélisation géométrique par objets canoniques, premières scènes OpenGL Exercice n°1
(1) Programmer en OpenGL la scène suivante sous la forme d'une fonction C sans utiliser les fonctions glPushMatrix et glPopMatrix ailleurs qu'en début et fin de fonction : (2) Reprogrammer en OpenGL la scène de la question (1) de telle manière que les cubes aient une de leurs faces orientée vers l'origine du repère. (3) Reprogrammer en OpenGL la scène de la question (2) en utilisant les fonctions glPushMatrix et glPopMatrix pour rendre les objets indépendants les uns des autres et simplifier l'écriture de la fonction scène.
(4) Programmer une scène OpenGL en plaçant 3 cubes de côté 2.0 aux 3 sommets d'un triangle équilatéral défini avec les caractéristiques suivantes :
Exercice n°2
(1) Programmer la scène OpenGL modélisant un bras robot simplifié composé d'un bras et d'un avant-bras.
(2) Modifier la fonction OpenGL de l'exercice n°1 en remplaçant les parallélépipèdes par des cylindres de tailles équivalentes à celles des objets qu'ils remplacent.
Exercice n°3 (supplémentaire) (1) Implanter en OpenGL une fonction de dessin d'une molécule de Benzène (C6H6).
Les atomes de carbone (atomes centraux) ont un rayon égal à 0.5.
(2) Modifier la modélisation de la molécule de benzène de la question précédente pour que les liaisons carbone-carbone soient alternativement des liaisons simples et
des liaisons doubles (voir figure ci-dessous).
Solutions
Hiérarchie de classes
|