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).
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.
| Primitive | type | Paramètres de scène | Description |
|---|---|---|---|
| Sphère | sphere | position, scale, radius | Sphère analytique, la primitive de base. |
| Plan | plane | axis (x/y/z), position, size | Plan infini orienté selon un axe. |
| Cube | cube | position, rotation, scale, size | Boîte analytique (convertible en maillage exact de 8 sommets). |
| Cylindre | cylinder | position, rotation, scale, radius, height | Cylindre paramétrique. |
| Cône | cone | position, rotation, scale, radius, height | Cône paramétrique. |
| Triangle | triangle | vertex0, vertex1, vertex2 | Triangle défini par ses trois sommets (éditable). |
| Tore | torus | position, rotation, radius, height | Tore (anneau) ; radius = grand rayon, height = rayon du tube. |
| Tanglecube | tanglecube | position, rotation, threshold, size | Surface implicite (isosurface) contrôlée par un seuil. |
| Fractale | fractal | position, size, power, iterations | Objet fractal rendu par estimation de distance (type Mandelbulb). |
| Maillage | mesh | file ou vertices/faces/normals, position, rotation, scale, vertex_overrides | Maillage 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ère | type | Paramètres | Description |
|---|---|---|---|
| Ponctuelle | point_light | position, color, intensity | Émet dans toutes les directions depuis un point (émetteur isotrope), avec atténuation avec la distance. |
| Directionnelle | directional_light | direction, color, intensity | Rayons 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
−directionavect_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.
| Champ | Type | Défaut | Rôle |
|---|---|---|---|
model | "phong" / "pbr" | phong | Modèle d'ombrage. |
base_color | couleur RGB | [229,229,229] | Couleur de base (albédo). |
specular | couleur RGB | [0,0,0] | Couleur spéculaire. |
shininess | nombre | 32 | Brillance (exposant spéculaire Phong). |
reflectivity | 0–1 | 0 | Part de réflexion miroir. |
transparency | 0–1 | 0 | Transparence. |
ior | nombre | 1.5 | Indice de réfraction. |
metallic | 0–1 | 0 | Caractère métallique (PBR). |
roughness | 0–1 | 0.5 | Rugosité (PBR). |
ao | 0–1 | 1 | Occlusion ambiante. |
specular_level | 0–1 | 0.5 | Niveau spéculaire (PBR). |
specular_tint | 0–1 | 0 | Teinte spéculaire (vers la couleur de base). |
clearcoat | 0–1 | 0 | Vernis : intensité de la couche claire. |
clearcoat_roughness | 0–1 | 0.03 | Rugosité du vernis. |
sheen | 0–1 | 0 | Effet « velours » (sheen). |
sheen_tint | 0–1 | 0.5 | Teinte du sheen. |
transmission | 0–1 | 0 | Transmission de la lumière à travers la surface. |
alpha | 0–1 | 1 | Opacité. |
normal_map | chemin | "" | Carte de normales (image). |
normal_map_enabled | booléen | false | Active la carte de normales. |
normal_scale | nombre | 1 | Force de l'effet de la carte de normales. |
normal_noise_frequency | nombre | 1 | Fréquence du bruit procédural de normale. |
texture_map | chemin | "" | Texture de couleur (PNG/JPG) échantillonnée en couleur de base. |
texture_map_enabled | booléen | false | Active la texture de couleur. |
texture_uv_scale | nombre | 1 | Facteur 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 :
| Primitive | Sommets éditables |
|---|---|
| Triangle | ses 3 coins (sauvegardés tels quels dans le JSON de scène). |
| Maillage | les 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.