Dernières modificationsChangement du barème de correction (2006-01-19)
Ajout d’une image de Polyman (2006-01-19)
Le but de
ce projet est de permettre à l'étudiant de mettre en pratique plusieurs notions
d'infographie vues dans le cours. Ce projet se divise en quatre parties,
chacune faisant appel à des notions spécifiques du cours, et permettant d'atteindre
des objectifs précis. Ces parties sont:
L'étudiant complétera d'abord l'implantation de classes C++ utilisées dans la conception du jeu en utilisant les fichiers fournis. Il ajoutera les fonctions principales pour la création et l'affichage des objets de la scène.
Ensuite, l'étudiant se familiarisera avec les concepts de base nécessaires à la réalisation d'un logiciel interactif simple utilisant les possibilités de conception d'interface graphique d'utilisateur de glut. On approfondira aussi la compréhension du concept de fenêtre/clôture ainsi que l'utilisation des principales primitives graphiques du système OpenGL et de leurs attributs.
Finalement, l'étudiant mettra en pratique les concepts de graphisme 3D élaborés en classe: la compréhension du système de visualisation modélisé par la caméra synthétique, la hiérarchisation de primitives graphiques et l'utilisation de primitives graphiques avancées. Le projet utilisera également des notions de dialogue interactif, les modèles d'illumination d'OpenGL et le mode de sélection d'OpenGL.
De nombreuses années se sont écoulées depuis que Pac Man est devenu une star internationale et a pris sa retraite. Il s’est depuis lors malheureusement séparé de Miss Pac Man, qui lui a préféré une star un peu plus jeune, Bomberman. De cette union peu conventionnelle, un nouveau héros a vu le jour : Polyman!
Permettre à Polyman de ramasser toutes les capsules dans un circuit, tout en évitant d’être capturé par les fantômes cybernétiques. Le circuit est composé de cases sur lesquelles se trouvent des capsules. Les cases peuvent être des plans inclinés, des passerelles élevées, ou tout simplement des obstacles.
Le jeu sera aussi composé d’un mode édition où vous créerez vos circuits afin de mettre Polyman au défi.
Le circuit sur lequel Polyman s’aventure est composé de cases. Celles-ci peuvent contenir des capsules, que Polyman doit ramasser. Elles peuvent aussi agir en tant qu’obstacles, que Polyman peut détruire en déposant une bombe à côté. Le circuit peut se situer sur plusieurs niveaux. Ainsi, certaines cases serviront de rampes vers d’autres qui sont surélevées, ou d’autres qui forment des ponts.
Les ennemis de Polyman sont des fantômes cybernétiques qui le poursuivent sans relâche sur le circuit. Ceux-ci sont dotés d’une intelligence artificielle hors du commun…
Voici certains détails d'implantation concernant l'éditeur. Certains requis font référence à cette section, consultez la donc avant d'implanter les différents requis.
L'édition se fait toujours en vu de plan avec projection orthogonale, même si les objets créés sont en 3D.
En mode éditeur de niveau, il doit être possible de modifier la vue en changeant l'effet de loupe (zoom-in, zoom-out) ou en effectuant des déplacements de la fenêtre virtuelle. Les changements de facteur d'agrandissement seront effectués avec les touches + et - et les déplacements avec les flèches du clavier. La grandeur d'un déplacement devrait être égale dans l'espace de visualisation.
Il devra aussi être possible de
manipuler la fenêtre virtuelle avec
Un effet de loupe avec rectangle
élastique devra aussi être implanté. Dans ce sous-mode, l'utilisateur clique à
un endroit et maintient le bouton enfoncé. Un rectangle est dessiné entre le
point de départ et le point courant. Lorsque le bouton est relâché, la fenêtre
virtuelle est modifiée. Deux situations sont possibles:
La fenêtre virtuelle et la clôture doivent être mis-à-jour correctement quand l'utilisateur redimensionne manuellement la fenêtre du système d'exploitation.
Voici les objets qui peuvent être créés en mode
édition :
Pour créer un objet, l'utilisateur sélectionne tout d'abord le type d'objet à créer (avec le clavier ou via un menu). Ensuite, à chaque fois qu'un clic gauche de souris à lieu, un objet est ajouté à l'endroit du clic. Si un objet se trouve déjà dans cette case, aucun objet n'est ajouté. Comme une usine de fantômes recouvre plusieurs cases, une telle usine n'est ajoutée que si toutes les cases sont libres.
Il doit aussi être possible de spécifier la case de départ de Polyman. Lorsque l'utilisateur spécifie cette case, on y place l'objet représentant Polyman. Cet objet doit être assez complexe, une simple sphère n'est pas suffisante. De plus, il ne peut y avoir qu'un seul Polyman sur le circuit. Si l'utilisateur tente d'ajouter un nouveau Polyman, le premier doit être automatiquement détruit.
Notez finalement que, dans le mode jeu, vous aurez besoin de créer dynamiquement deux autres types d'objets: les bombes et les fantômes. Ces objets ne peuvent cependant pas être insérés en mode création.

Polyman peut monter et descendre de niveau en empruntant les rampes. Les rampes et obstacles (destructibles ou non) ont tous la même hauteur. Ainsi, après avoir grimpé une rampe, Polyman pourra se déplacer sur les obstacles du niveau inférieur (voir la figure ci-contre).
Pour
permettre l'édition du circuit l'utilisateur peut choisir le niveau sur lequel
les objets seront ajoutés. Lors du lancement, tous les objets sont placés sur
le niveau 1. Si l'utilisateur appuie sur
Le numéro du niveau sélectionné pour l'édition doit être affiché par l'application dans la barre d’état. De plus, l'utilisateur peut demander à l'application d'afficher tous les objets ou alors de limiter l'affichage aux objets du niveau courant.
Un sous-mode, sélectionné par le clavier ou par un menu, permet de détruire des objets. Dans ce sous-mode, dès que l'utilisateur clique sur un objet, celui-ci est détruit. Si une case est détruite, l’endroit qu’elle occupait devient à nouveau disponible pour y placer quelque chose.
En sous-mode mouvement, rotation
ou propriété, l'utilisateur peut sélectionner des objets avec
Dans ce sous-mode, l'utilisateur
clique pour faire une sélection et, tant qu'il maintient le bouton enfoncé,
tous les objets en surbrillance suivent
Dans ce sous-mode, l'utilisateur clique pour faire une sélection dans le but de faire effectuer une rotation aux objets. L'angle de rotation augmente ou diminue selon que la souris est déplacée vers la droite ou la gauche, par incréments de 90 degrés. Dès que le bouton est relâché, les objets sont déposés. Ainsi, il est possible par exemple de changer l’orientation de d’une rampe ou d’un pont.
Les fantômes se déplacent sur les cases en fonction du chemin le plus court vers Polyman, en distance « Manhattan » (addition de déplacements verticaux et horizontaux). À chaque pas d’animation, la trajectoire des fantômes est revue et corrigée en tenant compte du niveau de difficulté, des obstacles détruits, des raccourcis possibles, etc.
Dans un premier temps, il doit être possible de lister sur la sortie standard (STDOUT – fenêtre DOS), en format texte, tous les objets et toutes leurs propriétés (position, orientation...).
Il doit être possible d'enregistrer l'état actuel du circuit dans un fichier et de le recharger plus tard. Il doit aussi être possible de réinitialiser l'état en effaçant tous les objets.
En mode jeu, l’objectif est de ramasser toutes les capsules se situant sur un circuit sans que Polyman ne se fasse attraper par les fantômes cybernétiques. Ceux-ci peuvent être neutralisés un certain temps lorsqu’ils se trouvent dans le rayon de déflagration d’une des bombes de Polyman : ils sont alors renvoyés dans la zone de réactivation, qui se trouve en marge du circuit.
Le but est donc de ramasser toutes les capsules en un temps record, sans entrer en contact avec les fantômes.
Polyman se contrôle de façon très intuitive, en se servant du clavier.
Le score est comptabilisé en fonction du nombre que Polyman réussit à amasser sans se faire neutraliser. À chaque fois que Polyman a perdu toutes ses vies, le score est réinitialisé. Si le score du joueur dépasse les records actuels, il y a possibilité d’enregistrer ce dernier, associé au nom du joueur, dans un tableau des « Hauts scores ». Le score du joueur est pondéré en fonction du nombre de vies qu’il a perdues sur un circuit et du temps qu’il mit pour le compléter.
Si un fantôme se trouve dans le rayon d’explosion d’une bombe, celui-ci est mis hors-jeu temporairement. Le temps de récupération des fantômes dépend du niveau de difficulté variable du jeu.
Le jeu se termine lorsque Polyman a ramassé toutes les capsules sur un circuit donné. Il y a alors possibilité de passer au circuit suivant, ou d’enregistrer son score pour ce tableau. Évidemment, le jeu se termine aussi quand le joueur a perdu toutes ses vies.
Il doit être possible de changer la vue du jeu. Trois vues différentes peuvent être sélectionnées, mais vous pouvez en ajouter plus si cela vous semble propice.
Une vue en plan avec projection perspective. Il s'agit de la vue par défaut. Le facteur de zoom doit être ajusté automatiquement de manière à cadrer correctement. C’est la vue traditionnelle du jeu Bomberman.
Une autre vue doit être possible, soit une vue avec projection à plat, tout comme dans le jeu PacMan.
Finalement, une troisième vue doit aussi pouvoir être sélectionnée, soit la vue à la troisième personne, où la caméra suit Polyman par derrière.
Au moins une lumière directionnelle doit éclairer votre scène, ainsi qu’une lumière omnidirectionnelle.
Pour le livrable 1, seule la vue du dessus doit être implantée. Il doit être possible de créer et de sélectionner les différents types d’objets possibles.
De plus, pour ce livrable, aucun menu n'a à être implanté, seul le clavier sera utilisé. Le mode jeu n'a pas à être implanté, les seules opérations possibles se font en mode édition.
|
2 |
|
|
Déplacer la fenêtre virtuelle avec le clavier |
1 |
|
Déplacer la fenêtre virtuelle avec la souris |
1 |
|
Zoom proportionnel avec la souris |
1 |
|
Afficher le rectangle élastique lors de l’effet de loupe |
1 |
|
Effet de loupe (zoom-in) avec le rectangle élastique |
1 |
|
Effet de loupe (zoom-out) avec le rectangle élastique |
1 |
|
Mise-à-jour lors d'un redimensionnement manuel de la fenêtre |
2 |
|
Création de chacun de types d’objets (2 types d’obstacles, rampe, pont, plateau, usine de fantômes, capsule, grille et Polyman) |
3 |
|
Création des
fantômes et affichage de la trajectoire (ligne entre le fantôme et la plus
proche usine) |
1 |
|
Sélection d'objets avec la souris |
1 |
|
Copier l’objet sélectionné (un seul Polyman) |
1 |
|
Déplacer l’objet sélectionné |
1 |
|
Tourner les objets (les rampes, capsule et Polyman) |
1 |
|
Destruction de l’objet sélectionné |
1 |
|
Lister les objets et leurs propriétés sur STDOUT |
1 |
|
Bonus à la
discrétion du chargé de lab |
1 |
|
La note est sur 20 |
|
L’évaluation du Tp1
est le : 17 février.
Un rapport de 2-3 pages
maximum à remettre au début (avant 9h00) du laboratoire du 24 février.
Introduction
3pts (explication du projet sans copier
l’énoncé)
Difficultés
Rencontres 6pts (3 difficultés résolu ou non)
Limites d’OpenGL 4pts (2 limites pour 2 points chacune)
Recommandations
3pts (3 recommandations pertinentes)
Conclusion 2pts
Qualité du
français 1pt
Répartition des
taches (avec le temps pour chacune)
Plusieurs classes ont déjà été définies et se trouvent dans une série de fichiers, les classes à ajouter sont semblables à celles données. Pour chaque classe, il y a un fichier .h et parfois un fichier .cpp correspondant. Les méthodes longues devraient se trouver dans le fichier .cpp alors que les méthodes courtes peuvent se trouver dans le .h pour permettre le "inlining".
Certaines des classes sont incomplètes. En effet, pour certaines classes, le code fourni consiste en un .h dans lequel certaines méthodes sont implantées. Il vous faudra aussi ajouter d'autres méthodes et d'autres éléments de données pour permettre la fonctionnalité souhaitée. Notez que certaines méthodes sont seulement définies dans l'interface de la classe, mais non implantées. Tant que ces méthodes ne sont pas utilisées, l'éditeur de liens n'indique aucune erreur à leur sujet. Lorsqu'un appel à une de ces fonctions (explicitement ou implicitement) est détecté, l'éditeur de liens cherche à résoudre le symbole et produit alors un message du type "undefined reference". Il faut donc, en général, implanter toutes les fonctions qui sont définies dans les .h des classes utilisées. Notez que vous pouvez définir et ajouter tous les attributs nécessaires aux classes déjà existantes afin d'assurer une modélisation adéquate des comportements souhaités. Il sera donc peut-être nécessaire d'ajouter quelques autres méthodes afin que toutes les fonctions demandées puissent être réalisées.
Bien que dans les fichiers fournis, on ne retrouve pas nécessairement toujours un ".cpp" pour chaque classe, vous devez implanter les méthodes importantes dans des fichiers ".cpp" séparés des ".h". Si vous créez de nouvelles classes, veillez donc à prendre ce commentaire en considération. La mauvaise pratique de mettre toutes les méthodes directement dans le ".h" sera pénalisée.
Les classes sont décrites dans la documentation complète des classes générée par doxygen.
Les définitions et les implémentations initiales des classes sont fournies, et peuvent être récupérées dans un des formats de fichiers d'archive ci-après:
Au début, il est plus simple d'utiliser le clavier pour construire une interface. L'usager devra pouvoir utiliser le clavier pour placer les objets, les déplacer, et modifier la fenêtre de visualisation.
Une brève description de chaque
commande et la touche correspondante suit. Vous pouvez ajouter des touches et
commandes au besoin, mais vous devez respecter ces touches et les quelques
autres déjà définies dans les fichiers fournis! Ne les changez pas...
En mode édition:
|
Touche |
Nom |
Description |
|
flèche droite |
GLUT_KEY_RIGHT |
Déplacer de la fenêtre virtuelle vers la droite |
|
flèche gauche |
GLUT_KEY_LEFT |
Déplacer de la fenêtre virtuelle vers la gauche |
|
flèche haut |
GLUT_KEY_UP |
Déplacer de la fenêtre virtuelle vers le haut |
|
flèche bas |
GLUT_KEY_DOWN |
Déplacer de la fenêtre virtuelle vers le bas |
|
"+"ou "=" |
|
Zoom-In |
|
"-"ou "_" |
|
Zoom-Out |
|
v ou V |
|
Passer dans le sous-mode déplacement de la fenêtre virtuelle avec la souris |
|
z ou Z |
|
Passer dans le sous-mode zoom avec rectangle élastique |
|
1 |
|
Placer des cases indestructibles |
|
2 |
|
Placer des cases destructibles |
|
3 |
|
Placer des cases rampes |
|
4 |
|
Placer des cases pont |
|
5 |
|
Placer des fantômes |
|
6 |
|
Placer des capsules sur les cases |
|
d ou D |
|
Passer dans le sous-mode de destruction d'objets |
|
m ou M |
|
Passer dans le sous-mode de mouvement d'objets |
|
r ou R |
|
Passer dans le sous-mode de rotation d'objets |
|
p ou P |
|
Passer dans le sous-mode de propriété des objets |
|
i ou I |
|
Réinitialiser, tout effacer |
|
s ou S |
|
Sauvegarde l'état de la construction |
|
c ou C |
|
Charge une construction précédamment sauvegardée |
|
j ou J |
|
Passer au mode jeu |
|
bouton 1 (gauche) de la souris |
|
Sélectionner l'objet
sous le curseur (sous-mode mouvement, rotation ou propriété) |
|
déplacement avec bouton 1 enfoncé |
|
Déplacer la fenêtre
virtuelle (sous-mode fenêtre virtuelle) |
|
x, q, X, Q ou escape |
|
Arrêter l'application |
En mode jeu:
|
Touche |
Nom |
Description |
|
flèche droite |
GLUT_KEY_RIGHT |
Déplace Polyman à droite |
|
flèche gauche |
GLUT_KEY_LEFT |
Déplace Polyman à gauche |
|
flèche haut |
GLUT_KEY_UP |
Déplace Polyman vers le haut |
|
flèche bas |
GLUT_KEY_DOWN |
Déplace Polyman vers le bas |
|
1 |
|
Caméra en plan |
|
2 |
|
Caméra en perspective |
|
Barre d’espacement |
|
Dépose une bombe |
|
x, q, X, Q ou escape |
|
Quitter le mode jeu |
Les définitions des touches sont disponibles dans le fichier glut.h sur votre système.
· Commencez par vous familiariser avec le code. Où sont vos structures de données? Où se trouve le code pour afficher?
· Commencez par la manipulation de la fenêtre virtuelle. La théorie est simple et les modifications dans le code ne demandent pas de comprendre l'ensemble de celui-ci. Profitez-en quand même pour vous familiariser avec le code pendant que les consignes sont simples.
· Placez maintenant des éléments sur votre scène. Ceci n'a pas l'air «payant» en points à première vue... Toutefois, il faut considérer qu'une fois que l'on sait comment placer un type d'élément, la procédure se répète pour les types suivants.
· Implémentez maintenant vos transformations
d'éléments déjà sur
· Il est maintenant le temps d'amener la souris dans le jeu. Adaptez les fonctions du point précédent pour utiliser la souris.
· À n'importe quel moment, si vous désirez prendre repos du travail de cerveau et passez à vos élans créatifs, vous pouvez prendre le temps de travailler vos modèles 3D. On demande une certaine complexité pour vos modèles 3D, sans toutefois exiger un travail professionnel (ce n'est pas un cours de modélisation). Demandez à votre chargé de lab si vous doutez de vos modèles.
· Jusqu'ici, votre progrès s'est fait sur le mode d'édition. Travaillez vos menus afin qu'ils s'adaptent à un changement de mode.
· À la fin, il reste les «effets spéciaux». C'est-à-dire toutes les réactions particulières (vibrations et autres) et les lumières.
· La session est terminée et vous n'avez pas vu le temps passer... Assurez-vous de garder du code clair, lisible et commenté tout au long du projet. Cette bonne pratique sera évaluée, mais surtout, vous allez vouloir revenir sur le projet pour l'améliorer un jour !
Le programme est séparé en deux modes, édition et jeu. Le passage du mode d'édition au mode jeu se fait à partir du menu principal. Les deux modes possèdent des menus différents et permettent de changer de mode.
Le design de l'interface utilisateur n'est pas complètement spécifié et vous devrez compléter certains éléments de ce design en vue de construire une application permettant les fonctionnalités désirées.
Vous devez aussi implémenter la fonctionnalité d'enregistrement et de chargement d'une partie. Ces commandes seront accessibles à partir du menu de la fenêtre principale et les données contenues dans le modèle de données pourront être réinitialisées, chargées et sauvegardées.
Un tableau d'affichage permettra de visualiser le pointage de la partie.
Vous devrez aussi implémenter des listes d'affichage et ainsi vous familiariser avec cette nouvelle notion. Des listes d'affichage devront être utilisées pour afficher les objets géométriques (sphères, cylindres, etc). D'autres listes d'affichage contiendront au besoin les transformations servant à l'animation.
Les objets devraient être représentés par des sphères, des cylindres, des cubes... Pour tracer des sphères ou des cylindres, vous pouvez facilement utiliser un ensemble de polygones en donnant un nombre suffisant de coordonnées afin que le tout ressemble à une sphère ou à un cylindre. Toutefois, les fonctions gluSphere et gluCylinder sont beaucoup plus utiles pour tracer ces objets.
La fenêtre initiale est carrée afin de faciliter l'affichage. Vous devez toutefois prévoir que les dimensions de la fenêtre peuvent être modifiées interactivement et que le rapport d'aspect doit être conservé.