Programmation Objet : Devoir 2015


(Cherchez aussi "ray tracing" (ou "tracer"), "lancer de rayon", etc. sur Internet. Vous y trouverez TOUT, et il est possible également une réalisation en Python , mais ne confondez pas l'inspiration avec le clonage...)

Ceci est un projet en synthèse d'images.

Ou plutôt : en création d'un dispositif du rendu des images à partir des modèles 3D.
Il vous faudra écrire en Python un programme orienté-objets, qui modélise – en tant qu'équations des surfaces – quelques objets 3D, comme sphères, cylindres ou polyèdres (cubes, pyramides, etc.), qui introduit une "caméra" (aussi un objet) qui "voit" ces objets dans l'espace, et qui en construit une image qui peut être rendue sur l'écran, stockée comme un bitmap JPEG, etc. [Le lanceur le plus populaire au monde est gratuit : POV-Ray.] POV-Ray dispose de son propre langage de description des scènes, vous pourrez regarder les exemples afin de vous inspirer. Le projet n'est pas difficile, mais laborieux. Il a déjà été offert comme devoir en L2. Vous aurez toute aide indispensable.

Plusieurs questions m'ont été posées au sujet de la géométrie du RT. Je commence à préparer un mini-tutoriel avec quelques détails, mais je n'envisage pas de vous moralement libérer de la nécessité de lire la documentation sur cette technique !

Introduction. Un peu de théorie

La technologie du ray-tracing peut être décrite en quelques phrases. La "physique" est le contraire du processus qui se déroule dans la nature, car ici, c'est la caméra qui "projète les rayons"...


Quelques détails. Implémentation basique.

Objets et rayons.

Les surfaces doivent avoir la forme permettant de trouver l'intersection avec le rayon. Ce qui est typique, est la représentation mathématique ci-dessous. Le texte suivant suppose que vous connaissez l'essentiel du calcul vectoriel.

Couleurs et lumière. Essentiel !

La couleur du pixel/point d'intersection dépend des propriétés de la surface. On peut tout simplement attribuer une couleur fixe "silhouette" (ou "couleur ambiante" ; pas mauvais pour les premiers tests, mais irréaliste et difficilement interprétable). Le standard (sans transparence et les réflexions miroir) est la combinaison de deux contributions :

Bien sûr, les deux composantes prennent encore des coefficients qui donnent leurs "forces". En présence de plusieurs sources de lumière, il faut ajouter toutes les contributions.

La vraie puissance d'un lanceur de rayons est la possibilité de gérer la transparence et les réflexions entre objets (miroirs), par la projection des rayons secondaires, mais ceci n'est pas demandé, sauf si quelqu'un veut un bonus très conséquent, avec la note 20/20 en perspective.

Attention. Il faudra ajouter une petite contribution ambiante à l'éclairage de tout point (entre 0.01 et 0.15 si 1.0 signifie très clair).


Caméra

Le rôle principal de cet objet est d'établir la relation entre le pixel \(xy\) sur l'écran - tampon, et la direction \(\vec{u}\) du rayon dans l'espace. Par exemple, si le point focal de la caméra est placé à \(\vec{x}_c=\vec{0} = (0,0,0)\), et l'écran virtuel se trouve à la distance \(p\) le long de l'axe \(Z\), alors le pixel \(xy\) a la position \((x,y,p)\), et la normalisation de ce vecteur donne \(\vec{u}\). Pour d'autres orientations de la caméra, le calcul serait un peu plus long.

Faites le calcul de manière vectorielle, c'est plus facile, plaçant la caméra (son point focal) au centre du répère : \(\vec{x}_c = \vec{0}\). Toute translation peut se faire plus tard. UN paramètre supplémentaire, s'ajoute à la position et la direction de l'"axe de vision", la direction du pixel \((0,0)\) : la focale, ou l'"ouverture" de la caméra. Ceci peut être aussi compris comme la distance \(p\) entre le point focal (zéro), et l'écran-tampon.


Structure du système.

Tout doit être par excellence orienté-objet, avec l'héritage, l'encapsulation, et la réutilisation des utilitaires disponibles publiquement. La caméra est un objet qui projète les rayons, et récupère les couleurs des pixels dans le tampon. Une solution sans objets sera rejetée sans avertissement.

Les objets 3D (surfaces) sont des objets Python, parametrés par leurs positions et orientation. Chacun possède la méthode permettant de trouver l'intersection avec le rayon ; cette méthode opérera avec l'équation de la surface. Chaque objet se voit attribué une couleur globale. Un vrai lanceur sait traiter des textures arbitraires, mais ceci serai trop long pour vous. On voit que certaines propriétés sont communes, l'héritage peut s'avérer utile.

Une source de lumière possède sa position et sa couleur (la teinte et la force d'éclairage). Pas besoin de définir des sources plus sophistiquées, la lumière éclaire l'espace uniformément.

La totalité de la scène : les objets et lumières, doit (de préférence) constituer un objet composite, facilement remplaçable par un autre.

L'interface utilisateur peut rester austère, pas besoin des widgets. L'image doit être affichée après la génération, et lors de l'initialisation, l'utilisateur pourra préciser le nom du fichier (de préférence : .png) pour la sauvegarde de l'image par imsave.


Modalités du devoir

Exigences concernant la réalisation

  1. Votre programme doit être modulaire : la description de la scène doit être séparée du "moteur" du lanceur (la boucle qui projète les rayons, le stockages des pixels dans un tableau), et on pourra facilement changer de scène et faire un autre test.
  2. Un minimum de paramétrisation globale est indispensable, en particulier les dimensions du tableau tampon (de l'écran virtuel). Le système doit être capable de gérer les images jusqu'à la taille 1024 × 768 (voire plus...).
  3. Vous devez implémenter les surfaces suivantes : plans et parallélepipèdes (cubes), sphères, cylindres et cônes. Plans, sphères et cylindres infinis sont obligatoires pour la validation du devoir, car ceci demande moins de 30 minutes de travail.

    L'éclairage ambient doit être réglable, l'éclairage diffus et l'éclairage spéculaire doivent être implémentés correctement [[le bug TYPIQUE est l'éclairage des zones "derrière" la lumière...]].
  4. Il faut faire au minimum 4 tests différents. Chaque test doit rendre une scène de plusieurs (entre 2 et 5) objets, de couleurs différentes, qui se recouvrent partiellement, et projètent des ombres sur les autres : Si un point de la surface "ne voit pas" la lumière, il se trouve dans l'ombre. Au moins deux tests doivent opérer avec des sources de lumière multiples (entre 2 et 3, n'exagérez pas, ceci ralentit fort le rendu, car il faut calculer l'éclairage pour chaque lumière et chaque pixel).

Modalités administratives

Vous avez le temps jusqu'au DATE À PRÉCISER

Vous travaillerez en binômes.

Vous enverrez par mail à votre enseignant de groupe le paquetage qui contient :



Retour