Skip to content

r-o-b-o-t-o/cpp-raytracer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

61 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Raytracer

Le 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.

Scène

Le fichier détaillant la scène est constitué de plusieurs attributs:

  • name -> 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.

  • light / lights -> la/les lumière(s) utilisée(s) pour éclairer la scène.

  • camera -> la caméra qui enregistre tout ce qu'elle voit dans la scène.

  • objects -> les objets de la scène (plane, square, spheres, cubes, ...)

Chacun de ces attributs possède d'autres attributs mais certains leurs sont communs, tels que:

- position -> 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.

- rotation -> 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.

Sur l'entité light, il est possible d'ajouter certains attributs:

- diffuse -> 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 -> r = g = b = 255.
- speculaire -> 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 -> r = g = b = 255
light:
  position:
    x: 1.0
    y: -3.0
    z: -0.5
  diffuse:
    r: 204.0
    g: 204.0
    b: 204.0
  specular:
    r: 128.0
    g: 128.0
    b: 128.0

Sur l'entité camera, il est possible d'ajouter certains attributs:

- shadow -> qui active ou non les ombres sur la scène (true ou false).
- resolution -> qui prend 2 attributs (width et height) qui est la taille de l'image.
- focal -> qui est la distance focale de la camera.
- position
- rotation

Exemple:

camera:  
  shadow: true  
  resolution:  
    width: 480  
    height: 480  
  focal: 2.0  
  position:  
    x: 0.0  
    y: -1.0  
    z: 0.5  
  rotation:  
    x: 10.0  
    y: 0  
    z: 0  

Sur l'attribut objects, on peut ajouter plusieurs objets dont le nom de l'attribut est à notre choix, exemple:

objects:  
    premiere_sphere:  
        ...  
    deuxieme_sphere:  
        ...  
    mon_plane: 
        ...  

Chacun de ces attributs sera considéré comme un objet, ces objets ont plusieurs attributs:

- type -> une string définissant le type de l'objet ("sphere", "cube", "plane", "square", ...).
- position
- rotation
- material -> 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)
- scale -> qui modifie la taille de l'objet: peut être un réel ou un vecteur (x, y, z)
objects:
  sphere1:
    type: "sphere"
    position:
      x: 0.0
      y: -0.6
      z: -0.8
    material:
      ambiant:
        r: 25
        g: 128
        b: 25
      diffuse:
        r: 64
        g: 64
        b: 64
      specular:
        r: 191
        g: 191
        b: 191
      shininess: 3.0

L'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.

objects:
  square1:
    type: "plane"
    position:
      x: 0.0
      y: 0.0
      z: -1.0
    rotation:
      x: 90
      y: 0.0
      z: 0.0
    materials:
      - type: "checkerboard"
      - ambiant:
          r: 0
          g: 120
          b: 214
        diffuse:
          r: 64
          g: 64
          b: 64
        specular:
          r: 191
          g: 191
          b: 191
        shininess: 3.0
      - ambiant:
          r: 241
          g: 79
          b: 33
        diffuse:
          r: 64
          g: 64
          b: 64
        specular:
          r: 191
          g: 191
          b: 191
        shininess: 3.0

Les matériaux peuvent utiliser des textures, il suffit de spécifier le chemin vers la texture dans un attribut texture:

  ...
    material:
      ambiant:
        r: 128
        g: 128
        b: 128
      diffuse:
        r: 64
        g: 64
        b: 64
      specular:
        r: 191
        g: 191
        b: 191
      shininess: 3.0
      texture: "textures/monimage.png"

(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)

Des exemple de scènes sont disponibles dans le dossier scenes.

Volumes implémentés

  • Cube
  • Plane
  • Sphere
  • Square
  • Triangle
  • Cylinder

Algorithmes utilisés

Illumination : Ombrage de Phong

Matrice : Élimination de Gauss-Jordan pour l'inversion

Fonctionnement du programme

Création de l'image dans la fonction render() de la classe Scene, utilise getImpactColor() de la classe Camera.

main() : gestion de la GUI, et appel à la fonction render() pour une scène donnée.

Les 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).

Répartition des tâches

Axel COCAT (robot0) : Classes maths (Ray, Point, Vector, Matrice, ...), GUI, multithread.

Yohann JERRAIN (Kryod) : Classes scène (Entity, Scene, Object, Square, Plane, Sphere, Camera, Light, ...), ombres, parsing scène -> yaml, readme.

Bibliothèques utilisées

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published