{"id":19138127,"url":"https://github.com/r-o-b-o-t-o/cpp-raytracer","last_synced_at":"2026-06-20T17:32:04.285Z","repository":{"id":107380570,"uuid":"166086380","full_name":"r-o-b-o-t-o/cpp-raytracer","owner":"r-o-b-o-t-o","description":null,"archived":false,"fork":false,"pushed_at":"2019-02-17T20:57:28.000Z","size":1369,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-22T18:41:23.067Z","etag":null,"topics":["cpp","raytracer","school-project"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/r-o-b-o-t-o.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-16T18:01:36.000Z","updated_at":"2021-03-15T10:14:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"b54b3f8c-265b-4afe-829b-9146a693753f","html_url":"https://github.com/r-o-b-o-t-o/cpp-raytracer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/r-o-b-o-t-o/cpp-raytracer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-o-b-o-t-o%2Fcpp-raytracer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-o-b-o-t-o%2Fcpp-raytracer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-o-b-o-t-o%2Fcpp-raytracer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-o-b-o-t-o%2Fcpp-raytracer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/r-o-b-o-t-o","download_url":"https://codeload.github.com/r-o-b-o-t-o/cpp-raytracer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-o-b-o-t-o%2Fcpp-raytracer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34580039,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","raytracer","school-project"],"created_at":"2024-11-09T06:41:51.222Z","updated_at":"2026-06-20T17:32:04.241Z","avatar_url":"https://github.com/r-o-b-o-t-o.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Raytracer\n\nLe programme utlise des scènes au format YAML pour créer une image représentant la scène. Les scènes sont à placer dans le dossier `scenes` à la racine du projet.\n\n\n\n## Scène\n\nLe fichier détaillant la scène est constitué de plusieurs attributs:\n\n- `name` -\u003e le nom de la scène qui apparait dans le sélecteur de scènes et qui sera le nom de l'image générée.\n\n- `light` / `lights` -\u003e la/les lumière(s) utilisée(s) pour éclairer la scène.\n\n- `camera` -\u003e la caméra qui enregistre tout ce qu'elle voit dans la scène.\n\n- `objects` -\u003e les objets de la scène (plane, square, spheres, cubes, ...)\n\nChacun de ces attributs possède d'autres attributs mais certains leurs sont communs, tels que:\n\n    - position -\u003e qui possède 3 attributs (x, y et z) qui est donc la position de l'entité. Peut être definie sur les entités: light, camera, objet. Si elle n'est pas définie, la position de l'entité sera par défaut x:0.0, y:0.0, z:0.0.\n\n    - rotation -\u003e qui possède 3 attributs (x, y et z) qui est donc la rotation de l'entité en degrés. Peut être définie sur les entités: light, camera, objet. Si elle n'est pas definie, la position de l'entité sera par défaut x:0.0, y:0.0, z:0.0.\n\nSur l'entité light, il est possible d'ajouter certains attributs:\n\n    - diffuse -\u003e qui possède 3 attributs (r, g et b) qui est la couleur de la lumière diffuse. Peut être définie sur light et tous les attributs material. Si elle n'est pas définie, la lumière sera blanche -\u003e r = g = b = 255.\n    - speculaire -\u003e qui possède 3 attributs (r, g et b) qui est la couleur de la lumière spéculaire. Peut être définie sur light et tous les attributs material. Si elle n'est pas définie, la lumière sera blanche -\u003e r = g = b = 255\n\n```yaml\nlight:\n  position:\n    x: 1.0\n    y: -3.0\n    z: -0.5\n  diffuse:\n    r: 204.0\n    g: 204.0\n    b: 204.0\n  specular:\n    r: 128.0\n    g: 128.0\n    b: 128.0\n```\n\nSur l'entité camera, il est possible d'ajouter certains attributs:\n\n    - shadow -\u003e qui active ou non les ombres sur la scène (true ou false).\n    - resolution -\u003e qui prend 2 attributs (width et height) qui est la taille de l'image.\n    - focal -\u003e qui est la distance focale de la camera.\n    - position\n    - rotation\n\nExemple:\n```yaml\ncamera:  \n  shadow: true  \n  resolution:  \n    width: 480  \n    height: 480  \n  focal: 2.0  \n  position:  \n    x: 0.0  \n    y: -1.0  \n    z: 0.5  \n  rotation:  \n    x: 10.0  \n    y: 0  \n    z: 0  \n```\n\nSur l'attribut objects, on peut ajouter plusieurs objets dont le nom de l'attribut est à notre choix, exemple:\n```yaml\nobjects:  \n    premiere_sphere:  \n        ...  \n    deuxieme_sphere:  \n        ...  \n    mon_plane: \n        ...  \n```\n\nChacun de ces attributs sera considéré comme un objet, ces objets ont plusieurs attributs:\n\n    - type -\u003e une string définissant le type de l'objet (\"sphere\", \"cube\", \"plane\", \"square\", ...).\n    - position\n    - rotation\n    - material -\u003e qui prend l'attribut ambiant (qui est la couleur par défaut d'un objet en r, g et b), l'attribut diffuse, l'attribut specular et l'attibut shininess (qui représente la brillance)\n    - scale -\u003e qui modifie la taille de l'objet: peut être un réel ou un vecteur (x, y, z)\n\n```yaml\nobjects:\n  sphere1:\n    type: \"sphere\"\n    position:\n      x: 0.0\n      y: -0.6\n      z: -0.8\n    material:\n      ambiant:\n        r: 25\n        g: 128\n        b: 25\n      diffuse:\n        r: 64\n        g: 64\n        b: 64\n      specular:\n        r: 191\n        g: 191\n        b: 191\n      shininess: 3.0\n```\n\nL'attribut materials vient sous deux forme: `material` et `materials`. `materials` permet de specifier deux matériaux à utiliser pour l'objet. Il faut specifier l'attribut `type` (\"checkerboard\" ou \"stripes\" pour damier ou lignes) et ajouter un \"-\" pour definir les deux matériaux.\n\n```yaml\nobjects:\n  square1:\n    type: \"plane\"\n    position:\n      x: 0.0\n      y: 0.0\n      z: -1.0\n    rotation:\n      x: 90\n      y: 0.0\n      z: 0.0\n    materials:\n      - type: \"checkerboard\"\n      - ambiant:\n          r: 0\n          g: 120\n          b: 214\n        diffuse:\n          r: 64\n          g: 64\n          b: 64\n        specular:\n          r: 191\n          g: 191\n          b: 191\n        shininess: 3.0\n      - ambiant:\n          r: 241\n          g: 79\n          b: 33\n        diffuse:\n          r: 64\n          g: 64\n          b: 64\n        specular:\n          r: 191\n          g: 191\n          b: 191\n        shininess: 3.0\n```\n\nLes matériaux peuvent utiliser des textures, il suffit de spécifier le chemin vers la texture dans un attribut `texture`:\n\n```yaml\n  ...\n    material:\n      ambiant:\n        r: 128\n        g: 128\n        b: 128\n      diffuse:\n        r: 64\n        g: 64\n        b: 64\n      specular:\n        r: 191\n        g: 191\n        b: 191\n      shininess: 3.0\n      texture: \"textures/monimage.png\"\n```\n\n(Attention, **les chemins relatifs vers les textures sont relatifs par rapport au dossier `scenes`**. Par exemple, ici, le fichier sera cherché dans `scenes/textures/monimage.png`)\n\nDes exemple de scènes sont disponibles dans le dossier `scenes`.\n\n\n\n## Volumes implémentés\n\n- `Cube`\n- `Plane`\n- `Sphere`\n- `Square`\n- `Triangle`\n- `Cylinder`\n\n\n\n## Algorithmes utilisés\n\n**Illumination** : Ombrage de Phong\n\n**Matrice** : Élimination de Gauss-Jordan pour l'inversion\n\n\n\n## Fonctionnement du programme\n\nCréation de l'image dans la fonction `render()` de la classe `Scene`, utilise `getImpactColor()` de la classe `Camera`.\n\n`main()` : gestion de la GUI, et appel à la fonction `render()` pour une scène donnée.\n\nLes classes mathématiques (`Point`, `Vector`, `Matrice`, `Ray`) sont dans le dossier `maths` (.cpp dans `src/maths`, .hpp dans `include/maths`) et les classes concernant la scène (`Entity`, `Object`, `Camera`, `Color`, `Material`, ...) sont dans le dossier scene (.cpp dans `src/scene`, .hpp dans `include/scene`).\n\n\n\n## Répartition des tâches\n\n**Axel COCAT** (*[robot0](https://github.com/robot0)*) : Classes maths (`Ray`, `Point`, `Vector`, `Matrice`, ...), GUI, multithread.\n\n**Yohann JERRAIN** (*[Kryod](https://github.com/Kryod)*) : Classes scène (`Entity`, `Scene`, `Object`, `Square`, `Plane`, `Sphere`, `Camera`, `Light`, ...), ombres, parsing scène -\u003e yaml, readme.\n\n\n\n## Bibliothèques utilisées\n\n- **[OpenCV](https://github.com/opencv/opencv)**: matrice de pixels, enregistrement au format PNG. _([licence BSD](https://github.com/opencv/opencv/blob/master/LICENSE))_\n\n- **[ImGui](https://github.com/ocornut/imgui)**: interface graphique. _([licence MIT](https://github.com/ocornut/imgui/blob/master/LICENSE.txt))_\n\n- **[SFML](https://github.com/SFML/SFML)**: gestion de la fenêtre et de ses événements. _([licence](https://github.com/SFML/SFML/blob/master/license.md))_\n\n- **[ImGui + SFML](https://github.com/eliasdaler/imgui-sfml)**: bindings pour utiliser ImGui avec SFML. _([licence MIT](https://github.com/eliasdaler/imgui-sfml/blob/master/LICENSE))_\n\n- **[tinyfiledialogs](https://sourceforge.net/projects/tinyfiledialogs/)**: dialogues natifs d'enregistrement ou de choix de fichiers, boîtes de messages. _([licence zlib](https://sourceforge.net/directory/license:zlib/))_\n\n- **[yaml-cpp](https://github.com/jbeder/yaml-cpp)**: parsing de YAML _([licence MIT](https://github.com/jbeder/yaml-cpp/blob/master/LICENSE))_\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr-o-b-o-t-o%2Fcpp-raytracer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fr-o-b-o-t-o%2Fcpp-raytracer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr-o-b-o-t-o%2Fcpp-raytracer/lists"}