Aller au contenu

DM — Lancer de rayons

Devoir maison en deux parties, mathématique puis informatique (classement provisoire : MP2I, année scolaire 2021-2022).

Préambule

Dans ce problème on se propose d'étudier les bases mathématiques nécessaires à réaliser des images par lancer de rayons.

Les données du problème sont :

  • une description géométrique d'un certain nombre d'objets, une scène
  • une caméra, caractérisée par sa position dans l'espace, la direction dans laquelle elle regarde et ses caractéristiques optiques (champ de vision, focale, largeur de pellicule).

Un tel problème est présenté dans la figure suivante où les objets sont des sphères.

Une scène de trois sphères et la caméra avec son champ de vision. Une scène de trois sphères et la caméra avec son champ de vision.
Une scène de trois sphères et la caméra avec son champ de vision.

La réalisation d'une image consiste à retracer à l'envers le trajet d'un photon atterrissant dans l'objectif de la caméra. Pour une direction donnée, on considère donc une demi-droite issue de la caméra, appelée un rayon et on cherche à décider :

  • si ce rayon intersecte un objet de la scène
  • si c'est le cas quel est l'objet effectivement vu, c'est-à-dire celui pour lequel l'intersection est la plus proche de la caméra.

Dans la première partie mathématique du problème on s'intéresse à une simplification dans le plan. Dans une seconde partie on étend les résultats à l'espace puis on s'intéresse à l'étude de l'éclairage et des réflexions.

La partie informatique reprend ces résultats et demande de les réaliser sous forme de programme.

Mathématiques

Dans le plan

On considère une simplification du problème où les objets sont des disques, et la caméra est donnée par sa position \(O\left|\begin{array}{l}x_0\\y_0\end{array}\right.\), la direction \(\overrightarrow{u}\left|\begin{array}{l}u_x\\u_y\end{array}\right.\), de norme \(1\), de son regard, l'angle \(\theta\) de son champ de vision, où \(\theta \in ]0,\pi[\), sa distance \(f\) à sa pellicule appelée la focale et la largeur \(l\) de sa pellicule. Cette définition est illustrée dans la figure suivante.

Caméra dans le plan : position O, direction vecu, angle theta, focale f, pellicule de largeur l. Caméra dans le plan : position O, direction vecu, angle theta, focale f, pellicule de largeur l.
Caméra dans le plan : position $O$, direction $\vec{u}$, angle $\theta$, focale $f$, pellicule de largeur $l$.

Expression des rayons

Question 1. Exprimer une relation liant \(l\), \(\theta\) et \(f\).

Traditionnellement, on fixe \(l\) à une valeur constante (liée à la taille des pellicules de cinéma) et on donne uniquement le champ de vision de la caméra.

Question 2. Exprimer les coordonnées des deux extrémités \(P_1\) et \(P_2\) de la pellicule.

Soit \(n \in \mathbb{N}^*\). On subdivise régulièrement la pellicule en \(n\) cases et on considère les rayons \(r_1, ..., r_n\) passant par les centres \(C_1, ..., C_n\) des cases. La figure suivante montre un exemple pour \(n=4\) cases. On appellera ces cases des pixels.

Pellicule subdivisée en n=4 pixels et rayons passant par leurs centres C_1,dots,C_4. Pellicule subdivisée en n=4 pixels et rayons passant par leurs centres C_1,dots,C_4.
Pellicule subdivisée en $n=4$ pixels et rayons passant par leurs centres $C_1,\dots,C_4$.

Question 3. Soit \(k \in \{1,\dots,n\}\), exprimer \(C_k\) comme barycentre de \(P_1\) et \(P_2\) et en déduire ses coordonnées ainsi que les coordonnées de la direction \(\overrightarrow{u_k}\) du rayon correspondant.

Réalisation d'une image de synthèse

On réalise une image unidimensionnelle en attribuant à chaque pixel la couleur du disque dont l'intersection avec le rayon correspondant est la plus proche de la caméra, si une telle intersection n'existe pas on lui attribue la couleur blanche.

Image unidimensionnelle

On est donc ramené à l'étude des intersections avec la scène d'un rayon.

Intersection avec la scène

On considère maintenant un rayon fixé \(r\) de départ \(A\left|\begin{array}{l}x_a\\y_a\end{array}\right.\) et de direction \(\overrightarrow{v}\left|\begin{array}{l}\alpha\\\beta\end{array}\right.\) et on cherche la plus proche intersection entre la demi-droite correspondante et la scène courante.

On considère donc l'équation paramétrique donnée par \(\overrightarrow{AM} = t \overrightarrow{v}\) où \(t \in \mathbb{R}^+\).

Question 4. Si \(M\left|\begin{array}{l}x\\y\end{array}\right.\), en déduire \(x\) et \(y\) en fonction de \(x_a, y_a, \alpha, \beta\) et \(t\).

On identifie maintenant une intersection entre un rayon et un objet au \(t_0 \in \mathbb{R}^+\) correspondant à ce point.

Question 5. Si on trouve deux intersections pour \(t_1\) et \(t_2\), comment peut-on caractériser celle qui est la plus proche de \(A\) ?

Question 6. Déterminer, en séparant les différents cas de figure, l'intersection entre \(r\) et le disque de centre \(C\left|\begin{array}{l}x_c\\y_c\end{array}\right.\) et de rayon \(R\) la plus proche de \(A\).

Dans l'espace

On revient au problème initial où la scène est constituée de sphères dans l'espace. Ici la caméra est donnée avec deux paramètres supplémentaires : son vecteur \(\overrightarrow{v}\left|\begin{array}{l}v_x\\v_y\\v_z\end{array}\right.\) unitaire déterminant la direction verticale de la pellicule et son facteur d'aspect \(a\) déterminant la hauteur \(h\) de la pellicule en fonction de sa largeur \(l\). Par exemple un facteur d'aspect de \(\frac{16}{9}\) signifie que \(l = \frac{16}{9} h\). Un autre facteur d'aspect courant est le \(\frac{4}{3}\).

Caméra dans l'espace : pellicule de dimensions ltimes h, vecteurs vecu et vecv. Caméra dans l'espace : pellicule de dimensions ltimes h, vecteurs vecu et vecv.
Caméra dans l'espace : pellicule de dimensions $l\times h$, vecteurs $\vec{u}$ et $\vec{v}$.

Rappels

On rappelle que le produit scalaire dans \(\R^3\) s'exprime ainsi : \(\left|\begin{array}{l}x\\y\\z\end{array}\right. \cdot \left|\begin{array}{l}x'\\y'\\z'\end{array}\right. = xx' + yy' + zz'\). De même la norme est \(||\overrightarrow{v}|| = \sqrt{x^2+y^2+z^2}\) où \(\overrightarrow{v}\left|\begin{array}{l}x\\y\\z\end{array}\right.\).

Si \(\overrightarrow{u}\left|\begin{array}{l}x\\y\\z\end{array}\right.\) et \(\overrightarrow{v}\left|\begin{array}{l}x'\\y'\\z'\end{array}\right.\) sont des vecteurs de l'espace leur produit vectoriel \(\overrightarrow{w} = \overrightarrow{u} \wedge \overrightarrow{v}\) a pour coordonnées \(\overrightarrow{w}\left|\begin{array}{l}yz'-y'z\\zx'-z'x\\xy'-x'y\end{array}\right.\). Si \(\overrightarrow{u}\) et \(\overrightarrow{v}\) ne sont pas colinéaires, alors \(\overrightarrow{u},\overrightarrow{v},\overrightarrow{w}\) est une base de \(\R^3\). De plus, si \(\overrightarrow{u}\) et \(\overrightarrow{v}\) sont unitaires et orthogonaux, alors \(\overrightarrow{w}\) est unitaire et le repère est orthonormé (direct si \((\overrightarrow{u},\overrightarrow{v}) \equiv \frac{\pi}{2} [2\pi]\)).

La sphère de centre \(C\) et de rayon \(R\) est constituée des points situés exactement à distance \(R\) de \(C\). I.e. les points qui vérifient

\[(x-x_c)^2+(y-y_c)^2+(z-z_c)^2=R^2\]

où \(C\left|\begin{array}{l}x_c\\y_c\\z_c\end{array}\right.\).

Expression des rayons

On exprimera ici les expressions en fonction de \(f\), \(l\), \(a\), \(C\left|\begin{array}{l}x_0\\y_0\\z_0\end{array}\right.\), \(\overrightarrow{u}\left|\begin{array}{l}u_x\\u_y\\u_z\end{array}\right.\) et \(\overrightarrow{v}\left|\begin{array}{l}v_x\\v_y\\v_z\end{array}\right.\).

Question 7. Déterminer les coordonnées du point \(P\) en bas à gauche de la pellicule, ainsi que celles du vecteur \(\overrightarrow{w}\) unitaire et dans la direction horizontale, vers la droite, de la pellicule.

Soit \(w, h \in \mathbb{N}^*\). On subdivise régulièrement la pellicule en une grille de \(w\) cases horizontales et \(h\) cases verticales et on considère les rayons \(r_{i,j}\) passant par les centres \(C_{i,j}\) des cases. Une telle case est encore appelée un pixel, et le couple \((i,j)\) représente les coordonnées du pixel.

Question 8. Soit \((i,j)\) les coordonnées d'un pixel, exprimer les coordonnées de \(C_{i,j}\) et du vecteur direction \(\overrightarrow{u_{i,j}}\) correspondant.

Réalisation d'une image de synthèse

On réalise une image bidimensionnelle en attribuant à chaque pixel la couleur de la sphère comme dans le cas plan. Pour rendre les images plus réalistes, on ombre la couleur à l'aide d'un modèle rudimentaire d'éclairage, de plus les sphères sont considérées comme étant semi-réfléchissantes. L'image suivante a été réalisée avec cette méthode :

Image de synthèse

Intersection avec la scène

Comme précédemment, on considère un rayon fixé \(r\) de départ \(A\left|\begin{array}{l}x_a\\y_a\\z_a\end{array}\right.\) et de direction \(\overrightarrow{v}\left|\begin{array}{l}\alpha\\\beta\\\gamma\end{array}\right.\) et on cherche la plus proche intersection entre la demi-droite correspondante et la scène courante.

Question 9. Déterminer, en séparant les différents cas de figure, l'intersection entre \(r\) et la sphère de centre \(C\left|\begin{array}{l}x_c\\y_c\\z_c\end{array}\right.\) et de rayon \(R\) la plus proche de \(A\).

On se ramènera comme pour les disques à une équation du second degré en \(t\).

Modèle d'éclairage de Phong

On considère une source lumineuse ponctuelle située en \(L\left|\begin{array}{l}x_l\\y_l\\z_l\end{array}\right.\) et émettant de manière isotrope (dans toutes les directions). Pour déterminer si un point \(M\left|\begin{array}{l}x\\y\\z\end{array}\right.\) est éclairé par \(L\) on lance un rayon issu de \(M\) en direction de \(L\), appelé un rayon d'ombrage, et on teste s'il intersecte la scène.

Question 10. Déterminer les coordonnées du vecteur \(\overrightarrow{u_s}\left|\begin{array}{l}x_s\\y_s\\z_s\end{array}\right.\) direction unitaire du rayon d'ombrage.

Lorsque le rayon n'intersecte rien, le modèle de Phong permet d'exprimer l'intensité lumineuse reçue en \(M\) si la normale à la surface sur laquelle il se situe admet pour vecteur unitaire \(\overrightarrow{n}\left|\begin{array}{l}x_n\\y_n\\z_n\end{array}\right.\).

La formule, n'ayant aucune validité physique, est \(I = \frac{\overrightarrow{AL}}{||\overrightarrow{AL}||} \cdot \overrightarrow{n}\).

Question 11. Déterminer pour un point \(A\left|\begin{array}{l}x_a\\y_a\\z_a\end{array}\right.\) d'une sphère de centre \(C\left|\begin{array}{l}x_c\\y_c\\z_c\end{array}\right.\), les coordonnées de \(\overrightarrow{n}\left|\begin{array}{l}n_x\\n_y\\n_z\end{array}\right.\) et en déduire une expression de \(I\).

Ce qui suit n'est utile que pour la partie informatique.

De plus on rajoute souvent une composante ambiante permettant d'exprimer qu'un objet non éclairé directement n'est pas entièrement sombre. Ici nous supposerons que l'on a une couleur ambiante grise.

Pour le calcul explicite de la couleur, on suppose que notre objet a une couleur déterminée par trois composantes \((c_r,c_v,c_b)\) pour rouge, vert et bleu comprises entre \(0\) et \(1\).

La couleur ambiante est alors \((a_r,a_v,a_b)\).

On suppose que si l'objet voit la lumière, il reçoit un minimum de 0.2 en lumière même si \(I\) vaut moins. On pose donc \(I_+ = \left\{ \begin{array}{l} 0.2 \text{ si } I < 0.2 \\ I \text{ sinon.} \end{array} \right.\)

Si l'objet est éclairé on aura alors comme couleur au point \(M\) :

\[(a_r + (1-a_r) I_+ c_r, a_v + (1-a_v) I_+ c_v, a_b + (1-a_b) I_+ c_b)\]

Sinon il n'aura que la couleur \((a_r,a_v,a_b)\).

Réflexion

On considère un rayon \(r\) de départ \(A\) et de direction \(\overrightarrow{u}\) unitaire, intersectant une sphère de centre \(C\) et de rayon \(R\) en un point \(B\) de normale \(\overrightarrow{n}\). On cherche à déterminer la direction \(\overrightarrow{u_r}\) du rayon réfléchi par la sphère. Pour obtenir la couleur d'une sphère réfléchissante il suffira alors de déterminer la couleur du rayon issu de \(B\) et de direction \(\overrightarrow{u_r}\) (en fait il faut considérer tous les rebonds possibles car une seule direction de réflexion c'est une très grosse approximation).

La figure suivante présente un plan de coupe de la situation :

Plan de coupe : réflexion du rayon overrightarrowu en B selon la normale overrightarrown. Plan de coupe : réflexion du rayon overrightarrowu en B selon la normale overrightarrown.
Plan de coupe : réflexion du rayon $\overrightarrow{u}$ en $B$ selon la normale $\overrightarrow{n}$.

Question 12. Déterminer \(\overrightarrow{u_r}\) en fonction de \(\overrightarrow{u}\) et \(\overrightarrow{n}\).

Informatique

On trouvera différents fichiers à l'adresse http://marc.de-falco.fr/dmray.

  • dm2d.ml reprend les résultats de la partie 2.1 sous la forme d'une interface. Vous pouvez étudier son code pour comprendre le fonctionnement et la mise en place de ces algorithmes.
  • dm3d.ml présente un squelette de programme de calcul d'image par cette technique. Le but est de remplir les fonctions factices. Chaque fonction correspond à une des questions traitées dans la partie mathématique, celle-ci est indiquée en commentaires.

Voici quelques consignes pratiques :

  • La note de votre DM sera fonction des résultats de votre programme.
  • Vous pouvez vous mettre en groupe de 2 maximum.
  • Vous présenterez votre programme lors d'une séance de TP. Vous ne pourrez pas faire illusion en prenant le code de quelqu'un d'autre, ce n'est même pas la peine d'essayer.

On procédera de manière incrémentale pour le calcul final de la couleur d'un rayon (c'est de loin la fonction la plus complexe).

Voici les étapes que je préconise : …

Voici des propositions d'extensions qui augmenteront votre note :

  • Rajouter des plans infinis, par exemple pour faire un sol.
  • Rajouter des triangles. En déduire une manière de faire des formes standards : cubes, pyramides, …
  • Rajouter des motifs types quadrillage en plus des couleurs.
  • Implémenter la loi de Descartes de la réfraction sur le modèle de la réflexion. Et, oui, on pourra avoir des matériaux semi-transparents et semi-réfléchissants. Au hasard, la vitre de votre chambre…
  • Rajouter la possibilité de tracer des surfaces définies par une fonction : l'ensemble des points \(M\left|\begin{array}{l}x\\y\\z\end{array}\right.\) tels que \(f(x,y,z) = 0\). Pour une sphère on aurait \(x^2+y^2+z^2-R^2=0\) par exemple.
  • Essayez de faire en sorte que le ciel soit réaliste.
  • Rajouter des Mandelbulbs (20/20 garanti pour la personne qui le fait).

La première échéance est la semaine du 19 mai. La version finale qui sera notée définitivement sera évaluée juste avant le conseil de classe.