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.

 

Image non trouvée !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:

glWindowsImage non trouvée !qui a besoin de

cartegraphique pour le choix d'une résolution sous Windows ou X WindowImage non trouvée !et éventuellement de la gestion d'une liste d'instances Image non trouvée !si vous utilisez GLUT

qui gère une caméraImage non trouvée !qui a besoin des classes: vectorImage non trouvée !, point Image non trouvée !et évidemment des quaternionsImage non trouvée !,

sans oublier l'affichage d'infos Image non trouvée ! et les includes communs...Image non trouvée !

 

Il faut aussi un peu de figure 3D:Polyèdres nouvelles versionsImage non trouvée !( pour lesquels nous avons déjà des explications pour Windows ici et pour X Window ),

 

Ou tout regroupé en un seul ZIP:

Image non trouvée !C'est moins fatiguant !

 

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:

Image non trouvée !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).

Image non trouvée !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.

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...

Image non trouvée !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...

Image non trouvée !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

 

Terre !

Tout cela pour enfin aboutir à notre affichage de la planète terre...

 

 

Le code et son makefile pour LinuxImage non trouvée ! Les bmpImage non trouvée !(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 WindowsImage non trouvée !

Image non trouvée !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.

Image non trouvée !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.