/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* main.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: lkantzer <lkantzer@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/12 08:37:50 by lkantzer #+# #+# */ /* Updated: 2025/12/12 09:46:51 by lkantzer ### ########.fr */ /* */ /* ************************************************************************** */
miniRT
Un lanceur de rayons écrit à la main, en C
Sphères, plans, cylindres, ombres portées et modèle de Phong — sans aucune bibliothèque au-delà de l'affichage de pixels.
- 3
- primitives
- Phong
- modèle
- 800 × 600
- résolution
Du pixel à la couleur
Rien n'est projeté à l'écran : c'est l'écran qui interroge la scène. Un rayon part de la caméra à travers chaque pixel, et la couleur du pixel est celle de la première chose que ce rayon rencontre.
- 01Le rayon
Origine la caméra, direction le pixel traversé. Le champ de vision de la caméra fixe l'écartement des rayons, donc la perspective.
- 02L'intersection
Chaque primitive résout son équation avec le rayon et rend une distance ; on garde la plus petite qui soit devant la caméra.
- 03La normale
Au point touché, la perpendiculaire à la surface. C'est elle qui décide de tout l'éclairage — une sphère la calcule depuis son centre, un plan la porte partout la même.
- 04Phong
Trois termes additionnés : l'ambiant qui remplit les creux, le diffus proportionnel à l'angle entre la normale et la lumière, le spéculaire qui pose le point brillant.
- 05L'ombre
Avant d'éclairer, un second rayon part du point vers la lumière. S'il rencontre quoi que ce soit avant d'y arriver, le point reste dans l'ombre.
Le coût est celui-là : une résolution de 800 × 600 fait 480 000 rayons primaires, plus un rayon d'ombre par source et par point touché.
Le fichier de scène
Rien n'est écrit en dur : la scène est un fichier texte, un élément par ligne, et le parseur refuse tout ce qui ne s'écrit pas exactement ainsi.
A 0.2 255,255,255 C -50,0,20 0,0,1 70 L -40,50,0 0.6 255,255,255 sp 0,0,20 20 255,50,50 pl 0,0,0 0,1,0 200,200,200 cy 50,0,20 0,0,1 14.2 21.42 50,50,255
- A
- Éclairage ambiant : un rapport entre 0 et 1, puis une couleur. Une seule fois dans le fichier.
- C
- Caméra : position, vecteur d'orientation normalisé, champ de vision en degrés. Une seule fois également.
- L
- Lumière : position, intensité, couleur.
- sp · pl · cy
- Sphère (centre, diamètre), plan (point, normale), cylindre (centre, axe, diamètre, hauteur) — chacun suivi de sa couleur, autant de fois qu'on veut.
Le parseur est la moitié du travail : un rapport hors bornes, un vecteur non normalisé, un champ en trop doivent sortir une erreur et rien d'autre.
Trois sphères et un plan, éclairés par une source ponctuelle. Déplacez la souris : la lumière suit et les ombres se recalculent — chaque pixel relance un rayon vers la source pour savoir s'il est occulté. Coupez les ombres ou le spéculaire pour voir ce que chaque terme apporte.
- 01Un rayon par pixel, intersection la plus proche, éclairage au point touché
- 02Trois primitives, chacune avec sa géométrie propre
- 03Ambiant, diffus, spéculaire, plus un rayon d'ombre par source
- 04Scènes décrites en fichier texte, parseur qui ne fait pas confiance
Le cylindre
La sphère et le plan tiennent en quelques lignes. Le cylindre demande de traiter séparément la surface latérale, les deux capuchons et les bornes de hauteur.