Raytracer docs 🌐 EN

Accueil / Fonctionnalités

Fonctionnalités

Géométrie, structures d'accélération, éclairage, matériaux et outils interactifs disponibles dans le moteur. Tout le contenu de cette page reflète le code réel du projet (parseur de scène, builders, en-têtes de matériaux).

10 primitives Point & directional light PHONG / PBR BVH global & local Maillages .obj éditables

Primitives

Dix types de primitives sont reconnus par le parseur (SceneParser) et construits par le PrimitiveBuilder. Chaque primitive implémente l'interface IPrimitive (test d'intersection, boîte englobante, matériau, propriétés). La colonne type est la valeur de la clé "type" dans le fichier de scène JSON.

PrimitivetypeParamètres de scèneDescription
Sphèresphereposition, scale, radiusSphère analytique, la primitive de base.
Planplaneaxis (x/y/z), position, sizePlan infini orienté selon un axe.
Cubecubeposition, rotation, scale, sizeBoîte analytique (convertible en maillage exact de 8 sommets).
Cylindrecylinderposition, rotation, scale, radius, heightCylindre paramétrique.
Côneconeposition, rotation, scale, radius, heightCône paramétrique.
Triangletrianglevertex0, vertex1, vertex2Triangle défini par ses trois sommets (éditable).
Toretorusposition, rotation, radius, heightTore (anneau) ; radius = grand rayon, height = rayon du tube.
Tanglecubetanglecubeposition, rotation, threshold, sizeSurface implicite (isosurface) contrôlée par un seuil.
Fractalefractalposition, size, power, iterationsObjet fractal rendu par estimation de distance (type Mandelbulb).
Maillagemeshfile ou vertices/faces/normals, position, rotation, scale, vertex_overridesMaillage triangulé (.obj) avec BVH local et normales lisses (éditable).

Le fichier source Mobius_strip.* existe dans le dépôt, mais cette primitive n'est pas branchée au parseur, au builder ni au Makefile : elle n'est actuellement pas disponible en scène.

Géométrie d'accélération (AABB / BVH)

Deux structures utilitaires soutiennent le rendu : AABB (boîte englobante alignée sur les axes) et BVH (hiérarchie de volumes englobants). Chaque primitive expose sa boîte englobante, ce qui permet de la placer dans le BVH et de rejeter rapidement les rayons qui la manquent. Le détail de la construction est décrit dans la section Accélération BVH.

Lumières

Deux types de lumières sont pris en charge par le parseur et les builders. Chaque lumière implémente ILight (intensité, couleur) et est évaluée en éclairage direct par le modèle du renderer actif.

LumièretypeParamètresDescription
Ponctuellepoint_lightposition, color, intensityÉmet dans toutes les directions depuis un point (émetteur isotrope), avec atténuation avec la distance.
Directionnelledirectional_lightdirection, color, intensityRayons parallèles (type « soleil »), sans position ni atténuation.

Ombres

Pour chaque lumière et chaque point d'impact H, le moteur lance un rayon d'ombre depuis un point légèrement décalé (H + ε·N, où N est la normale de surface) en direction de la lumière :

  • Pour une lumière ponctuelle, le rayon est un segment limité à la distance de la lumière (t_max = d − ε).
  • Pour une lumière directionnelle, le rayon part vers −direction avec t_max = +∞.

Si un objet occulte le trajet avant t_max, la contribution directe de cette lumière est ignorée pour ce point ; sinon, les termes diffus et spéculaire sont évalués. Le décalage ε le long de la normale évite l'acné d'ombre (auto-intersection de la surface avec elle-même).

Matériaux

Les matériaux (srcs/common/Material.hpp) suivent l'un de deux modèles d'ombrage : PHONG (par défaut) ou PBR. Ils portent un name et sont référencés par ce nom depuis les objets de la scène. Le tableau ci-dessous liste tous les champs de la structure Material avec leurs valeurs par défaut réelles.

ChampTypeDéfautRôle
model"phong" / "pbr"phongModèle d'ombrage.
base_colorcouleur RGB[229,229,229]Couleur de base (albédo).
specularcouleur RGB[0,0,0]Couleur spéculaire.
shininessnombre32Brillance (exposant spéculaire Phong).
reflectivity0–10Part de réflexion miroir.
transparency0–10Transparence.
iornombre1.5Indice de réfraction.
metallic0–10Caractère métallique (PBR).
roughness0–10.5Rugosité (PBR).
ao0–11Occlusion ambiante.
specular_level0–10.5Niveau spéculaire (PBR).
specular_tint0–10Teinte spéculaire (vers la couleur de base).
clearcoat0–10Vernis : intensité de la couche claire.
clearcoat_roughness0–10.03Rugosité du vernis.
sheen0–10Effet « velours » (sheen).
sheen_tint0–10.5Teinte du sheen.
transmission0–10Transmission de la lumière à travers la surface.
alpha0–11Opacité.
normal_mapchemin""Carte de normales (image).
normal_map_enabledbooléenfalseActive la carte de normales.
normal_scalenombre1Force de l'effet de la carte de normales.
normal_noise_frequencynombre1Fréquence du bruit procédural de normale.
texture_mapchemin""Texture de couleur (PNG/JPG) échantillonnée en couleur de base.
texture_map_enabledbooléenfalseActive la texture de couleur.
texture_uv_scalenombre1Facteur de répétition (tiling) des UV.

Bibliothèque de matériaux

Les matériaux peuvent être enregistrés dans une bibliothèque personnelle (MaterialLibrary) située dans ~/.raytracer/materials/. Chaque matériau y est stocké sous forme d'un fichier <nom>.json (le nom est assaini : les caractères non alphanumériques deviennent _). loadAll() lit tous les .json du dossier et les trie par nom.

La sérialisation (MaterialLibrary::toJson/fromJson) est partagée avec le chargeur/sauveur de scène : un matériau fait un aller-retour identique qu'il vive dans la bibliothèque ou qu'il soit intégré dans un fichier de scène. Les couleurs (base_color, specular) sont écrites en RGB entiers [r,g,b] sur 0–255.

Réflexions et transparence

Les champs reflectivity, transparency et ior du matériau contrôlent respectivement la réflexion miroir, la transparence et la réfraction. Ils reposent sur des rayons secondaires partant du point d'impact : un rayon de réflexion et un rayon de réfraction, lancés avec un décalage ε pour éviter l'auto-intersection. Le ior (indice de réfraction) détermine la déviation du rayon transmis à l'interface.

En l'absence de skybox, les surfaces très réfléchissantes ou transparentes peuvent apparaître sombres là où le rayon secondaire ne rencontre aucune géométrie éclairée.

Accélération BVH

Avant le rendu, la scène construit une hiérarchie de volumes englobants (BVHNode, via scene.buildBvh()). Chaque nœud possède une boîte englobante (AABB) ; un rayon qui manque la boîte d'un nœud ignore tout son sous-arbre, ce qui réduit fortement le nombre de tests d'intersection sur des scènes chargées. Les maillages disposent en plus d'un BVH local construit sur leurs triangles, reconstruit lorsqu'un sommet est édité (voir Édition de sommets).

Maillages et import .obj

Un maillage charge un fichier Wavefront .obj (via ObjParser), en dérive des triangles (MeshTriangle), calcule des normales lisses (moyenne des faces incidentes) et construit un BVH local. Un maillage peut aussi être défini en ligne dans la scène via vertices / faces / normals, ce qui permet de le sérialiser sans fichier externe.

Quand un maillage fournit une géométrie en ligne (vertices non vide), celle-ci a la priorité sur un éventuel chemin file : c'est ainsi que sont stockées les primitives « cuites » (converties en maillage).

{
    "name": "Suzanne",
    "type": "mesh",
    "file": "tests/obj/suzanne.obj",
    "position": [0.0, 0.0, 0.0],
    "rotation": [0.0, 0.0, 0.0],
    "scale": [1.0, 1.0, 1.0],
    "material": "Blue"
}

Édition de sommets

Les primitives qui implémentent IEditablePrimitive (en plus de IPrimitive) peuvent voir leurs sommets déplacés directement dans le viewport. Sont éditables :

PrimitiveSommets éditables
Triangleses 3 coins (sauvegardés tels quels dans le JSON de scène).
Maillageles sommets uniques (soudés) du .obj — déplacer un sommet partagé met à jour toutes ses faces.

Les primitives analytiques (cube, sphère, plan, cylindre, cône, tore, tanglecube, fractale) ne sont pas éditables au sommet : sélectionnez-les et utilisez Convert to Mesh pour les transformer en maillage triangulé, puis éditez-les. Un cube est converti exactement en 8 sommets / 12 triangles ; les autres formes sont échantillonnées (un plan infini n'est pas convertible).

Les modifications d'un maillage sont enregistrées comme surcharges de sommets (vertex_overrides, en espace-objet) réappliquées après le chargement du .obj ; le fichier .obj n'est jamais modifié. Après chaque édition, le BVH est marqué à reconstruire et le viewport se met à jour.

Les contrôles détaillés (poignées, verrouillage d'axe, champ Vertex, navigateur de sommets, raccourcis) sont décrits dans Interface graphique → Édition de sommets.

Rendu en cluster

Le moteur peut répartir un rendu sur plusieurs machines : un serveur découpe l'image en tuiles et les distribue aux clients connectés, qui renvoient leurs pixels. On lance un serveur avec --server [PORT] et on rejoint avec --connect IP PORT. La communication repose sur des paquets typés (rejoindre, envoi de scène, demande de rendu, remontée de tuile, état du rendu). Voir Architecture → Cluster.