Projet Raycasting
Objectifs
A partir des éléments vus en cours et en TD, réaliser une application illustrant les notions fondamentales du raycasting et la comparer à un rendu de la scène en OpenGL. L'implantation devra se faire en Python, à l'aide des bibliothèques standards et d'une ou deux bibliothèques graphiques au choix (dont OpenGL obligatoirement).
L'application permet d'offrir deux visualisations 3D d'un ensemble de pièces et de couloirs modélisé à partir d'une grille de 16 x 16 carrés minimum. Cet ensemble est lui-même complètement entouré de murs. L'utilisateur a la possibilité de se déplacer en prenant en compte les collisions avec les murs.
Principes du raycasting
Le raycasting est une technique de calcul d'images de synthèse 3D. Elle a été utilisée avec succès au début des années 1990 dans les jeux vidéo comme Wolfenstein 3D ou Doom. L'implantation était alors entièrement logicielle et ne faisait pas appel à du matériel spécifique.
Il tire parti de certaines caractéristiques du monde virtuel : celui-ci est représenté par une carte 2D simplifiée, les murs sont des plans en général perpendiculaires par rapport au sol, les primitives graphiques sont représentées sous la forme d'approximations planaires.
Le raycasting produit des images anguleuses, avec un champ de vision limité, parallèle au sol. Ceci est dû au fait que le raycasting est essentiellement une technique basée sur une description 2D, et non pas 3D, de la scène.
Tombée en désuétude lors de l'apparition des moteurs entièrement en 3D, cette technique a été remise au goût du jour pour les technologies mobiles.
Conception
Une conception modulaire, voire objet, se prête naturellement à ce type de problème. En dehors de quelques abstractions (objets mathématiques, images numériques, ...), tous les modules associés au projet trouvent un écho dans le monde réel : caméra, obstacles, lumières et caméra. Les descriptions des modules qui suivent ne sont que des suggestions (certains sont communs aux deux approches, raycasting et OpenGL).
Module carte : lecture d'une map, position des objets, détection de collisions.
Module caméra : gestion des paramètres caractéristiques d'un joueur (position, orientation), projection et rendu de tous les objets à l'écran (sol, plafond, murs et sprites).
Module principal : boucle de scrutation, gestion des évènements, mise à jour et rendu.
Evaluation
Ce projet est un prototype pour lequel un certain nombre de fonctionnalités sont demandées :
- codage et chargement d'une carte du niveau courant, définie à partir d'une grille codant l'emplacement des murs (et autres),
- affichage en pseudo 3D de la map par la méthode du raycasting,
- affichage en 3D de la même map par l'intermédiaire d'OpenGL avec modèle d'illumination et plaquage de textures,
- déplacement et rotation de la caméra avec tests de collisions pour les deux approches,
- affichage informationnel (position et orientation du joueur, nombre d'images par seconde) pour les deux approches.
Les fonctionnalités suivantes sont optionnelles :
- application de textures sur les murs en raycasting,
- affichage de sprites représentant des éléments de décors ou des personnages avec tests de collisions pour les deux approches.
Les cinq premiers objectifs du projet ainsi que la qualité de la programmation (dont la présence de commentaires pertinents) seront évalués sur la base de 16 points, les suivants seront évaluées sur la base de 4 points. Une archive comportant tous les fichiers nécessaires à l'exécution du projet devra être remise à l'enseignant pour évaluation.