La Terre
Voilà encore un prétexte afin de voir différentes "petites" choses indispensables pour faire des applications sympatiques avec OpenGL.
Il s'agit simplement de lancer des bases pour le développement d'un moteur 3D. Bien entendu, le code devant rester "lisible" (pour autant que ce genre de code puisse être lisible !), il n'y aura pas de recherche pour optimiser celui-ci.
L'idée
est aussi de faire en sorte que le même code puisse est porté rapidement
sous différents environnements: MS Windows, X Window ou GLUT (MS Windows/X
Windows).
Voici donc les différents sources auquels il sera fait référence par la suite:
Soit les sources éclatés:
cartegraphique pour le choix d'une résolution sous Windows
ou X Windowet
éventuellement de la gestion d'une liste d'instances
si
vous utilisez GLUT
qui gère une caméraqui
a besoin des classes: vector
,
point
et
évidemment des quaternions
,
sans oublier l'affichage d'infos
et les includes communs...
Il faut aussi un peu de figure 3D:Polyèdres nouvelles versions(
pour lesquels nous avons déjà des explications pour Windows ici
et pour X Window là),
Ou tout regroupé en un seul ZIP:
Pour aller plus loin, nous aurions pu mettre toutes ces classes en librairies, mais ce n'est pas le but ici. Faîtes le vous même !
La classe glWindows
Dans une première partie, nous allons définir une classe permettant de créer une fois pour toute une fenêtre et d'y associer une instance OpenGL. Cela va nous amener à créer des méthodes/évènements pour gérer cette fenêtre et OpenGL qui seront détaillées par la suite:
Evidemment, c'est
une des classes qui sera la plus complexe puisqu'elle devra être compilable
sous MS Windows et sous X Window (et éventuellement en utilisant GLUT).
Quelque soit l'environnement,
OpenGL sera activé avec un double buffer.
Le code peut aussi être plus difficile à lire, car vous y retrouverez dans les mêmes fichiers du code pour Windows/X Window ou GLUT. Mais l'avantage était de ne pas avoir à dupliquer certaines parties du code.
Dans un environnement Windows:
- Un classe pour gérer OpenGL dans une
fenêtre Windows
- Une classe pour gérer OpenGL dans une fenêtre Windows
- Constructeur/destructeur
- Initialiser une fenêtre en fullscreen ou non et initialiser OpenGL
- Boucle de traitement
- Procédure de gestion des messages intégrée dans la classe
- Liste des évènements de la classe
- Exemple de classe
Dans un environnement UNIX
- Un classe pour gérer OpenGL dans une
fenêtre X Window
- Une classe pour gérer OpenGL dans une fenêtre Windows
- Constructeur/destructeur
- Initialiser une fenêtre en fullscreen ou non et initialiser OpenGL
- Boucle de traitement
- Procédure de gestion des messages intégrée dans la classe
- Liste des évènements de la classe
- Exemple de classe
En passant par GLUT (WINDOWS ou X Window). Bon ce n'est évidemment pas la meilleur solution, mais comme les gens peuvent avoir l'habitude de cet environnement, voici une solution possible d'utilisation...
- Un classe pour gérer OpenGL dans
une fenêtre GLUT
- Une classe pour gérer OpenGL dans une fenêtre Windows
- Constructeur/destructeur
- Initialiser une fenêtre en fullscreen ou non et initialiser OpenGL
- Boucle de traitement
- Procédure de gestion des messages intégrée dans la classe
- Liste des évènements de la classe
- Exemple de classe
Pour information, voici la liste des méthodes disponibles dans cette classe et sa portabilitée dans les différents environnements: Liste des méthodes
La classe caméra
La seconde partie importante est le placement d'une caméra dans le monde
3D. Cette caméra pouvant être déplacée:
- Une classe caméra
- Avant tout, une explication/traduction pour tangage, lacet (ou cap) et roulis
- Perte d'un degré de liberté avec les angles d'Euler (blocage de cardan ou gimbal lock)
- La solution: les quaternions
- La classe caméra
- Les autres méthodes de la classe caméra
- Information sur la caméra
La classe caméra étant définie, il ne reste plus qu'à intégrer sa gestion dans une fenêtre Windows/OpenGL.
- Retour sur les évènements liés
à la gestion de la caméra
- Déplacer la caméra au clavier ou à la souris
- Afficher les informations sur la caméra
Afficher des objets 3D
Passons maintenant aux explications sur l'affichage
Gestion du clavier
Puis comment gérer le clavier
Gestion de la souris
Et enfin la souris
Exemple simple d'utilisation
Comment utiliser tout cela ?
Voilà que pas mal d'explications ont été données.
Reste à mettre en oeuvre tout cela pour voir ce que cela donne.
Voici un exemple qui va permettre l'affichage du cube géré par défaut dans notre classe glWindows avec déplacement de la caméra suivant le clavier/la souris.
Comme vous le verrez, il n'y a plus grand chose à coder pour avoir la gestion d'une caméra, ect...
Le
fichier makefile pour linux est présent aussi dans ce zip
Bon évidemment, si vous avez déjà développé par exemple avec des templates, au début, tout est beau, tout est rose, pas grand chose à faire, tout est fait automatiquement. C'est même comme ça que l'on vous l'a vendu !
Mais dès que vous voulez aller plus loin, là, cela devient plus lourd...
Pour une utilisation
avec GLUT sous Linux, il faudra dans le fichier makefile mettre en commentaire
la ligne de génération du code et retirer celle mise en commentaire
qui contient les librairies GLUT. De plus, ne pas oublier de mettre à
jour le fichier defaut.h pour activer la déclaration de la variable prépro.
USEGLUT et celle indiquant où trouver l'include GLUT.
Ce qu'il faut faire pour mettre en oeuvre tout cela ?
Dans le cas de MS Windows, et bien créer un projet dans lequel on va intégrer toutes les classes précédemments expliquées. Evidemment, il faudra aussi définir les librairies OpenGL (rappel de bases...). Si vous voulez utilisez GLUT, il faudra aussi ajouter la librairie GLUT (rappel là aussi) !
Dans le cas de Linux, tapez simplement make dans le répertoire où vous aurez dézippé tous les fichiers !
Afficher du texte
Les bases sont maintenant placées. Nous pouvons nous attaquer à des choses plus intéressantes:
Retour sur la classe objet3D
- Modification de la classe objet3D
- Retour sur charger une texture
- Gestion des textures dans une sphère
Terre !
Tout cela pour enfin aboutir à notre affichage de la planète terre...
Le code et son makefile pour Linux
Les bmp
(Ils
ne sont évidemment pas de moi et je ne connais pas l'origine, vous les
retrouverez sur internet via google sur plusieurs sites) et éventuellement,
l'exécutable pour Windows
Je n'y suis pas
allé de main morte sur la taille des textures. Il est donc possible,
pour des cartes graphiques un peu vieilles ou ayant peu de mémoire, d'avoir
des problèmes comme par exemple des lenteurs importantes d'affichage.
Toutefois, sous Linux, vous pouvez accélérer la chose en désactivant
les effets 3D que vous auriez activé pour le système, cela libérera
de la mémoire sur la carte.
Là encore,
pour une utilisation avec GLUT sous Linux, il faudra dans le fichier makefile
mettre en commentaire la ligne de génération du code et retirer
celle mise en commentaire qui contient les librairies GLUT. De plus, ne pas
oublier de mettre à jour le fichier defaut.h pour activer la déclaration
de la variable prépro. USEGLUT et celle indiquant où trouver l'include
GLUT.