École 42
Cub3D
Un moteur de rendu en lancer de rayons, à la manière de Wolfenstein 3D : un fichier de carte 2D transformé en vue 3D à la première personne, en temps réel.
Le contexte
Cub3D consiste à écrire, en C avec MinilibX pour la couche graphique, un moteur de rendu 3D minimaliste à partir d'une carte définie dans un simple fichier texte : analyse et validation du fichier, puis rendu en temps réel de la vue du joueur.
Le raycasting
Pour chaque colonne verticale de l'écran, un rayon est projeté depuis la position du joueur et avance case par case dans la grille (algorithme DDA) jusqu'à toucher un mur. La distance perpendiculaire à ce mur, et non la distance euclidienne brute, détermine la hauteur du mur affiché : c'est ce qui évite la déformation en « œil de poisson » propre à une projection naïve.
Déplacement & collisions
Le joueur se déplace et pivote au clavier (avancer/reculer, se déplacer latéralement, tourner), chaque déplacement étant vérifié indépendamment sur ses deux axes contre la grille de la carte pour permettre de glisser le long d'un mur sans y rester bloqué.
Ce que j'en retiens
Transformer une grille 2D en profondeur perçue en temps réel a été une première vraie confrontation avec de la géométrie appliquée : il faut raisonner en vecteurs plutôt qu'en coordonnées isolées, et comprendre pourquoi une distance mesurée depuis un point de vue donné déforme l'image si elle n'est pas corrigée. C'est une intuition qui a servi bien au-delà du raycasting, dans toute situation où une mesure dépend du référentiel depuis lequel elle est prise.
Code bientôt disponible sur GitHub.