Accueil / Utilisation
Utilisation
Lancer le programme, comprendre les options de la ligne de commande, le mode de rendu headless et le format complet des fichiers de scène JSON.
Ligne de commande
./raytracer [OPTIONS] [FICHIER_SCENE]
Le FICHIER_SCENE est optionnel : sans lui, une scène vierge par défaut est
chargée. Les arguments sont analysés par la structure Options
(srcs/config/Options.hpp).
| Option | Description |
|---|---|
-h, --help | Affiche l’aide d’utilisation et quitte. |
-v, --version | Affiche la version (raytracer version 1.0.0) et quitte. |
-r, --render [NOM].png | Mode headless : rend la scène dans un fichier PNG sans lancer l’interface graphique. Le NOM optionnel doit finir par .png et fixe la sortie (par défaut render.png). |
--server [PORT] | Lance l’interface et démarre un serveur de cluster. Le PORT optionnel (0–65535) fixe le port d’écoute ; sinon un port automatique est choisi. |
--connect IP PORT | Lance l’interface et rejoint le serveur de cluster à l’adresse IP sur le PORT. Les deux arguments sont obligatoires. |
Exclusions mutuelles. --render (headless) ne peut pas
être combiné avec --server ni --connect, et --server
et --connect ne peuvent pas être utilisés ensemble. Toute option inconnue ou un
second argument de scène provoque une erreur.
Exemples de commandes
# Interface graphique sur une scène d'exemple
./raytracer tests/configs/subject.json
# Rendu direct vers un PNG (sans interface)
./raytracer -r output.png tests/configs/subject.json
# Rendu headless avec le nom de sortie par défaut (render.png)
./raytracer --render tests/configs/cube.json
# Interface + serveur de cluster sur le port 8080
./raytracer --server 8080 tests/configs/subject.json
# Interface + connexion à un serveur de cluster
./raytracer --connect 127.0.0.1 8080 tests/configs/subject.json
Mode headless (rendu PNG)
Le mode -r / --render ne charge pas l’interface : il
construit la scène, calcule l’image, l’exporte en PNG, puis quitte. Idéal pour les scripts
et l’intégration continue.
./raytracer -r sortie.png tests/configs/cube.json
# Sortie console attendue :
# Loaded 2 renderer plugin(s)
# - Viewport
# - Default
# Finished rendering scene! Saving to file..
# Render has been saved to file 'sortie.png'
Si aucun nom n’est fourni (ou s’il ne finit pas par .png), la
sortie par défaut est render.png.
Format des fichiers de scène
Une scène est un fichier JSON (extension .json obligatoire) lu par
SceneParser. Les sections camera et objects sont
obligatoires ; environment et materials sont
facultatives. Les clés inconnues sont simplement ignorées.
Squelette général
{
"environment": { "ambient": 0.4, "diffuse": 0.6 },
"camera": {
"resolution": [1920, 1080],
"position": [0.0, -100.0, 20.0],
"rotation": [0.0, 0.0, 0.0],
"fieldOfView": 72.0,
"samplesPerPixel": 128
},
"objects": [
{ "name": "Sphere A", "type": "sphere", "position": [60, 5, 40], "radius": 25, "material": "Material A" }
],
"materials": [
{ "name": "Material A", "model": "pbr", "base_color": [230, 60, 60], "roughness": 0.5 }
]
}
Section environment
Facultative. Contrôle l’éclairage global.
| Clé | Type | Défaut | Rôle |
|---|---|---|---|
ambient | nombre | 0.4 | Coefficient de lumière ambiante global. |
diffuse | nombre | 0.6 | Coefficient de contribution diffuse global. |
Section camera
Obligatoire. Définit le point de vue et la qualité du rendu.
| Clé | Type | Rôle |
|---|---|---|
resolution | [largeur, hauteur] | Dimensions de l’image en pixels (2 entiers). Obligatoire. |
position | [x, y, z] | Position de la caméra dans le monde. Obligatoire. |
rotation | [x, y, z] | Orientation en angles d’Euler, exprimés en degrés. Obligatoire. |
fieldOfView | nombre | Champ de vision (degrés). Obligatoire. |
samplesPerPixel | entier > 0 | Échantillons par pixel (anti-aliasing / bruit). Défaut : 5. Alias accepté : samples_per_pixel. |
Section objects
Obligatoire. Liste des primitives, des lumières et des groupes. Chaque objet possède un
type (obligatoire) et un name (facultatif). Les primitives peuvent
référencer un material par son nom. Le SceneParser ne lit que les
clés pertinentes pour le type ; les clés inconnues sont ignorées. Types disponibles :
type | Clés principales |
|---|---|
sphere | position, radius, scale, material |
plane | axis ("x" / "y" / "z"), position, size, material |
cube | position, rotation, scale, size, material |
cylinder | position, rotation, radius, height, material |
cone | position, rotation, radius, height, material |
triangle | vertex0, vertex1, vertex2, material |
torus | position, rotation, radius, height, material |
tanglecube | position, rotation, size, threshold, material |
fractal | position, size, power, iterations, material |
mesh | file (.obj) ou vertices / faces / normals, position, rotation, scale, vertex_overrides, material |
point_light | position, color, intensity |
directional_light | direction, color, intensity |
Attention : le plan se définit par axis, pas par
normal/origin. La clé axis attend une chaîne
"x", "y" ou "z". Toute autre clé (comme normal
ou origin) est ignorée par le parseur.
Il existe aussi un type group (avec un tableau children
et ses propres position/rotation/scale) pour composer des
hiérarchies d’objets. Voir la page
Fonctionnalités pour le détail de chaque
primitive.
Couleurs et vecteurs
- Un vecteur est un tableau
[x, y, z]de 3 nombres (position, rotation en degrés, échelle, direction…). - Une couleur est un tableau
[r, g, b]de 3 composantes entières comprises entre0et255.
Section materials
Facultative. Chaque matériau porte un name (référencé par les objets via
material) et un model ("phong" ou "pbr").
Les champs lus par parseMaterial :
| Clé | Type | Défaut | Rôle |
|---|---|---|---|
model | "phong" / "pbr" | phong | Modèle d’éclairage du matériau. |
base_color | [r, g, b] | [230,230,230] | Couleur de base (albédo). |
specular | [r, g, b] | [0,0,0] | Couleur spéculaire (Phong). |
shininess | nombre | 32.0 | Netteté des reflets spéculaires (Phong). |
reflectivity | nombre | 0.0 | Part de réflexion miroir. |
transparency | nombre | 0.0 | Transparence. |
ior | nombre | 1.5 | Indice de réfraction. |
metallic | nombre 0–1 | 0.0 | Caractère métallique (PBR). |
roughness | nombre 0–1 | 0.5 | Rugosité de la surface (PBR). |
ao | nombre 0–1 | 1.0 | Occlusion ambiante. |
clearcoat | nombre 0–1 | 0.0 | Intensité du vernis (couche claire). |
sheen | nombre 0–1 | 0.0 | Reflet velouté (tissu). |
transmission | nombre 0–1 | 0.0 | Transmission de la lumière (verre). |
alpha | nombre 0–1 | 1.0 | Opacité globale. |
texture_map | chaîne | "" | Chemin d’une image utilisée comme couleur de base. |
texture_map_enabled | booléen | false | Active l’échantillonnage de texture_map. |
texture_uv_scale | nombre | 1.0 | Facteur de répétition des coordonnées UV. |
normal_map | chaîne | "" | Chemin d’une carte de normales. |
normal_map_enabled | booléen | false | Active la carte de normales. |
normal_scale | nombre 0–1 | 1.0 | Force de l’effet de la carte de normales. |
Champs additionnels reconnus : specular_level,
specular_tint, clearcoat_roughness, sheen_tint,
normal_noise_frequency. Plusieurs acceptent aussi une variante en
camelCase (par ex. clearcoatRoughness, specularLevel).
{
"name": "GoldMetal",
"model": "pbr",
"base_color": [255, 198, 92],
"metallic": 0.9,
"roughness": 0.22,
"clearcoat": 0.0,
"transmission": 0.0,
"ior": 1.5
}
Exemple complet commenté
Extrait fidèle de tests/configs/subject.json (deux sphères, un plan et une lumière) :
{
"environment": { "ambient": 0.4, "diffuse": 0.6 },
"camera": {
"resolution": [1920, 1080], // largeur x hauteur en pixels (obligatoire)
"position": [0.0, -100.0, 20.0],
"rotation": [0.0, 0.0, 0.0], // degrés (obligatoire)
"fieldOfView": 72.0, // degrés (obligatoire)
"samplesPerPixel": 128 // anti-aliasing (défaut 5)
},
"objects": [
{
"name": "Sphere A",
"type": "sphere",
"position": [60.0, 5.0, 40.0],
"radius": 25,
"material": "Material A" // référence par nom
},
{
"name": "Plane",
"type": "plane",
"axis": "z", // "x" | "y" | "z" — PAS "normal"/"origin"
"position": [0.0, 0.0, -20.0],
"material": "Material C"
},
{
"name": "Point light",
"type": "point_light",
"intensity": 1000000.0,
"position": [400.0, 100.0, 500.0]
}
],
"materials": [
// La clé reconnue est "model" (phong | pbr) ; "base_color" en [r,g,b] 0-255.
{ "name": "Material A", "model": "phong", "base_color": [255, 64, 64] },
{ "name": "Material C", "model": "phong", "base_color": [64, 64, 255] }
]
}
Dans le fichier d’origine, les matériaux utilisent une clé type ;
or le parseur lit le modèle depuis model. Une clé type pour un
matériau est donc ignorée et le modèle retombe sur le défaut phong. Préférez
model.
De nombreuses scènes prêtes à l’emploi se trouvent dans
tests/configs/ : cube.json, cone.json,
torus.json, fractal.json, tanglecube.json,
mesh_showcase.json, vertex_edit.json, etc.
Importer un maillage .obj
Un objet de type mesh charge un fichier .obj via la clé
file. Les fichiers d’exemple sont dans tests/obj/
(cube.obj, poly.obj, slt.obj).
{
"name": "Polished Metal",
"type": "mesh",
"file": "tests/obj/slt.obj",
"position": [34.0, 4.0, 6.0],
"rotation": [0.0, 0.0, -18.0],
"scale": [110.0, 110.0, 110.0],
"material": "GoldMetal"
}
Un maillage peut aussi être défini en ligne (sans fichier externe) via
vertices, faces et normals, ou porter des modifications
de sommets ponctuelles avec vertex_overrides (liste d’entrées
{ "index": n, "position": [x,y,z] }) — voir
Édition de sommets.
Sauvegarde de scène
Depuis l’interface, la scène peut être ré-exportée en JSON : SceneRegister
sérialise la caméra (resolution, position, rotation,
fieldOfView, samplesPerPixel), les objets (avec leurs transformations
locales, et pour les maillages leurs vertices/faces/normals
ou vertex_overrides) et les matériaux. Le cycle
charger → éditer → sauvegarder → recharger restitue fidèlement la scène.