Zone de Texte:  Dernières modifications

Changement du barème de correction  (2006-01-19)

Ajout d’une image de Polyman (2006-01-19)

Instructions pour le projet


Objectifs généraux

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:

  1. Élaboration de la structure de données et modélisation initiale
  2. Développement d'une interface usager graphique de base
  3. Techniques de rendu
  4. Rapport synthèse

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.

 

Polyman!

 

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!

 

 

But du jeu

 

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.

 

Description

 

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…

 

Éditeur

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.

Manipulation de la fenêtre virtuelle

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 la souris. Pour ce faire, l'utilisateur choisi le sous-mode approprié et la fenêtre virtuelle suit la souris lorsqu'elle est déplacée en maintenant le bouton enfoncé.

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:

  • Le bouton de gauche a été utilisé: on fait un zoom-in, la nouvelle fenêtre virtuelle est modifiée pour contenir, le plus exactement possible, le rectangle dessiné.
  • Le bouton de droite (s’il n’est pas utilisé pour les menus contextuels) a été utilisé: on fait un zoom-out, la nouvelle fenêtre virtuelle est modifiée pour que la fenêtre virtuelle précédente contienne, le plus exactement possible, le rectangle dessiné. (Pas de panique, on en parlera en classe...)

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.

Création d'objets

Zone de Texte: •	 Voici les objets qui peuvent être créés en mode édition :

  • Grille de dimensions quelconque sur laquelle seront disposées les cases
  • Case de type obstacle destructible (un bloc cubique)
  • Case de type obstacle indestructible (un bloc cubique)
  • Case de type rampe (à 45 degrés)
  • Case de type plateau, de hauteur variable
  • Case de type pont, disposé selon des orientations de 90 degrés
  • Groupe de cases de type "usine de fantômes" (4 murs encadrant un groupe de 2 x 2 cases)
  • Capsule à ramasser sur une case

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.

Construction par niveaux

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 la touche Page Up l'édition passe au niveau 2 et tous les objets seront ajoutés sur ce niveau. S'il appuie sur Page Down l'édition revient au niveau 1. Ainsi, l'utilisateur peut naviguer vers les niveaux supérieurs ou inférieurs. Le jeu doit permettre d'ajouter des objets sur au moins 10 niveaux. Un objet sur un niveau n'a pas à être supporté par un objet au niveau inférieur.

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.

Destruction d'objets

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.

Sélection d'objets

En sous-mode mouvement, rotation ou propriété, l'utilisateur peut sélectionner des objets avec la souris. Dans ces sous-modes, tout objet sur lequel l'utilisateur clique est sélectionné. L'objet, ainsi que tous ses enfants et petits-enfants, doivent être affiché en surbrillance (changement de couleur).

Déplacement d'objets

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 la souris. Dès que le bouton est relâché, les objets sont déposés (mais ils restent affichés en surbrillance).

Rotation d'objets

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.

Trajectoire des fantômes cybernétiques

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.

Enregistrement et chargement

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.

Mode Jeu

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.

Contrôle de Polyman

Polyman se contrôle de façon très intuitive, en se servant du clavier.

  • Les flèches permettent de mouvoir Polyman vers les directions où pointent celles-ci.
  • La barre d’espacement donne la commande à Polyman de déposer une bombe, qui explose après un compte à rebours fixe.

Comptabilisation des points

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.

Neutralisation des fantômes

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.

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

Caméras

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.

Lumière

Au moins une lumière directionnelle doit éclairer votre scène, ainsi qu’une lumière omnidirectionnelle.

Requis, livrable 1

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.

Effet de loupe (zoom-in, zoom-out) avec le clavier

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) 1 pt

Structure de données

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.

Documentation des classes

Les classes sont décrites dans la documentation complète des classes générée par doxygen.

Fichiers fournis

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:

 

Interface usager

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é)
Commencer un rectangle élastique (sous-mode zoom)

déplacement avec bouton 1 enfoncé

 

Déplacer la fenêtre virtuelle (sous-mode fenêtre virtuelle)
Modifier le rectangle élastique (sous-mode zoom)
Déplacer un objet (sous-mode mouvement)
Modifier l'angle de rotation (sous-mode rotation)

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.


Plan de travail

·         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 la scène. Ceci demande d'être capable de sélectionner.

·         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 !


Détails de l'implantation

Fonctionnalités de l'éditeur

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.

Affichage graphique

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