Ce programme de scène 3D a été réalisé dans le cadre du projet de Lex & Yacc par deux étudiants de Licence 3 Informatique lors du cycle 2010 - 2011 :
Ce programme répond à l'énoncé suivant :
Décrivez des scènes 2D ou 3D, dans un format libre et visualisez les en OpenGl. Par exemple, les scènes 2D sont constituées de carrés, de cercles, de polygones, de segments... Les scènes 3D sont constituées de cubes, de tétraèdres, de sphères, etc.
Le langage de description n’a pas à fournir les variables, les boucles, ni les fonctions. Vous pouvez réutiliser ou vous inspirer du fichier fig.cpp.
Notre programme permet de définir des formes 3D à représenter. La caméra, la lumière et le rendu sont gérés directement par OpenGL et non pas par des instructions du langage. Pour information, vous pouvez zoomer Z ou dézoomer z. Vous pouvez faire pivoter la scène dans tous les axes avec les touches directionnelles ←, ↑, → et ↓.
Voici la liste des prérequis pour l'installation et la compilation du projet :
Vous pouvez compiler les sources de la manière suivante :
$ cd ./src/
$ make clean
$ make
Un exécutable nommé scene est alors généré.
Le mode interactif se lance par la commande :
$ cd ./src/
$ ./scene
Vous pouvez également précharger le contenu d'un fichier en suivant cet exemple :
$ cd ./src/
$ cat unfichier | ./scene
Deux exemples ont été ajoutés aux sources :
$ cd ./src/
$ cat ../exemple/lex | ./scene
$ cd ./src/
$ cat ../exemple/teapot | ./scene
Différents domaines sont utilisés dans le langage. Il s'agit d'intervalle de validité pour les paramètres des instructions. Voici la liste exhaustive :
{COLOR} = Entier [0 ; 255]
{INTEGER} = Entier [-Inf ; +Inf]
{ANGLE} = Entier [0 ; 360]
{SHAPE} = {cone;cube;cylinder;sphere;teapot;tetrahedron;torus}
{SIZE} = Entier [1 ; +Inf].
Une forme à dessiner est décrite entre les instructions begin et endqui constitue un bloc. D'autres instructions permettent de personnaliser cette forme.
begin
color {COLOR} {COLOR} {COLOR}
move {INTEGER} {INTEGER} {INTEGER}
position {INTEGER} {INTEGER} {INTEGER}
rotate {ANGLE} {ANGLE} {ANGLE}
scale {INTEGER} {INTEGER} {INTEGER}
shape {SHAPE}
size {SIZE}
end
L'instruction color permet de fixer la couleur de la forme via la codification RGB. La valeur par défaut est 128 128 128 ; soit du gris.
L'instruction move permet de déplacer la forme selon les axes X Y Z. La valeur par défaut est 0 0 0 ; aucun déplacement.
L'instruction position permet de placer la forme selon les axes X Y Z. La valeur par défaut est l'origine du repère, 0 0 0.
L'instruction rotate permet de faire pivoter la forme selon les axes X Y Z. La valeur par défaut des angles (en degré) est 0 0 0 ; aucune rotation.
L'instruction scale permet de faire un agrandissement ou une réduction de la forme selon les axes X Y Z. La valeur par défaut est 1 1 1 ; taille originale.
L'instruction shape permet de définir la forme.
L'instruction size permet de définir la taille ; selon la forme, il s'agit du rayon, de la longueur, etc. La valeur par défaut est 1.
Quand l'ensemble des formes est défini, l'instruction draw permet de lancer le rendu OpenGL.
A tout moment, les instructions exit ou quit permettent de quitter l'application (sauf si le rendu OpenGL est déjà lancé auquel cas il faut cliquer sur la croix).
Enfin, en plus des messages d'aide en cas d'erreur lors de la saisie des instructions, ces commandes ont été ajoutées :
help
help begin
help color
help draw
help end
help exit
help help
help move
help position
help quit
help rotate
help scale
help shape
help size
L'ensemble du projet a été développé à partir de zéro à l'aide des langages Lex et C++. C'est à dire qu'il ne s'agit pas là d'une simple adaptation d'un exemple de script disponible sur l'UFR Sciences Tech.
Pour des questions d'efficacité, le projet s'appuie au maximum sur les classes de la STL (Standard Template Library) de C++.
L'ensemble des sources a été commenté selon des conventions traditionnelles.
Le développement respecte le modèle MVC. C'est à dire que l'IHM a été séparée au mieux de la couche de données.
Ainsi, la classe Scene modélise la scène OpenGL. La classe Point est utilisée par la classe Scene. Ces deux classes constituent l'IHM.
La classe Objet est la couche de données. Toutes les propriétés des formes qui devront être dessinées sont stockées dans ces objets.
Les instructions du langage et l'aide de l'application sont volontairement en anglais.
Actuellement, l'application gère 7 formes. Comme améliorations, on pourrait gérer d'autres formes 3D en s'appuyant sur les basiques d'OpenGL :
On pourrait également ajouter des formes 2D :
La gestion des lumières et des textures pourrait également être ajouté au langage.
Le langage pourrait en outre se voir offrir une gestion des animations.
Bref, ce projet est une première version et beaucoup de fonctionnalités supplémentaires pourraient enrichir ce programme dans l'avenir.
Ce README est au format markdown. Une version (X)HTML peut facilement être générée à l'aide de la commande markdown via :
$ markdown README.md > README.html
Une documentation des sources peut être générée à l'aide d'un outil tel que Doxygen.
Ce programme n'est pas un projet web. Veuillez consulter la rubrique
Sources.
Pour tout bug, commentaire, toute critique, remarque, suggestion ou simplement si vous souhaitez participer ou contribuer, utilisez le formulaire de contact
du site.
Scène 3D 1.0.0
NEW - Création de l'application
Si vous souhaitez obtenir les sources de ce projet, veuillez les télécharger directement depuis le dépôt SVN du projet.