Retour aux projets

Cub3D

C Parsing

Un raycaster en C comme Wolfenstein 3D

Aperçu du projet Cub3D

📋 Présentation Générale

Cub3D est un projet pédagogique développé dans le cadre de l'école 42. Il s'agit de concevoir un moteur de rendu graphique s'inspirant des techniques utilisées dans les jeux des années 1990, comme le légendaire Wolfenstein 3D.

L'objectif principal est de maîtriser la technique du raycasting, permettant de simuler une expérience visuelle "3D" à partir d'une carte 2D.

Ce projet couvre:

  • Algorithmique et mathématiques appliquées
  • Gestion mémoire et programmation bas niveau en C
  • Initiation aux concepts des premiers moteurs de jeu
  • Optimisation et rendu temps réel

🎯 Enjeux et Objectifs pédagogiques

Compétence Description
Moteur Pseudo-3D Comprendre et implémenter les fondamentaux d'un rendu 3D basé sur le raycasting
Bibliothèque graphique Maîtriser MiniLibX (MLX), une API graphique bas niveau
Mathématiques Appliquer des concepts de géométrie, vecteurs et trigonométrie
Gestion mémoire Optimiser l'utilisation des ressources système en C
Événements Développer une gestion avancée des entrées et collisions
Architecture Concevoir une architecture logicielle pour application temps réel

🎮 Principe du Raycasting : De la carte 2D à l'illusion 3D

Contrairement aux moteurs 3D modernes qui manipulent objets, caméras et lumières dans un univers tridimensionnel, le raycasting simule la 3D en projetant des rayons depuis la "caméra" (le joueur) dans une structure de niveau représentée sous forme d'une simple matrice 2D.

🗺️ Carte de jeu

Une carte typique de Cub3D est représentée par un tableau de caractères ou d'entiers, où chaque élément définit la nature de la cellule :

Symbole Signification
1 Mur ou surface solide
0 Espace traversable
N, S, E, W Point de départ du joueur et son orientation initiale

Voici un exemple de carte:

111111111111
100000000001
101110111101
N00000000001
111111111111

Sur ce plan, le joueur (ici N) sera placé face au nord, entouré de murs (1) avec des zones accessibles (0).

⚙️ Mécanisme du Raycasting

L'outil fondamental est l'algorithme de DDA (Digital Differential Analyzer). L'idée est de simuler pour chaque colonne de l'écran le lancement d'un rayon qui progresse "case après case" dans la carte, jusqu'à rencontrer un obstacle.

Principe du Raycasting

Fonctionnement pas à pas:

  • Projection de rayons - Pour chaque colonne de pixels à l'écran, un rayon est lancé
  • Calcul de trajectoire - Le rayon avance dans la matrice selon la position et rotation du joueur
  • Détection de collision - On cherche la première cellule où le rayon rencontre un mur
  • Calcul de distance - La distance trouvée détermine la hauteur du mur sur cette colonne
  • Rendu visuel - Plus le mur est loin, plus il apparaît petit à l'écran
  • Répétition - Ce processus est répété pour chaque colonne, créant l'illusion 3D

🛠️ Librairie Utilisée : MiniLibX

MiniLibX (MLX) est une bibliothèque graphique développée pour 42, fournissant les fonctionnalités essentielles:

  • Création de fenêtres
  • Dessin de pixels
  • Gestion des événements (clavier/souris)
  • Affichage d'images

Pour un rendu fluide, Cub3D utilise la technique du double buffering:

  • La scène est d'abord dessinée dans une image en mémoire (buffer offscreen)
  • Une fois toute la frame calculée, l'image est copiée ("blitée") sur la fenêtre graphique
  • Ce processus élimine les problèmes de scintillement (flickering) et de déchirement d'image (tearing)

🧩 Architecture du Code et Fonctionnalités

Principaux modules:

Module Fonction
Parsing Lecture et validation de la carte, chargement des textures
Joueur Gestion de la position, angle de vue, déplacements et collisions
Raycasting Cœur du moteur: calcul des rayons, intersections et distances
Rendu Dessin de la scène avec textures et gestion du rafraîchissement
Entrées Capture des mouvements clavier (ZQSD/flèches) et orientation de la vue