TP5: Insertion d'objets virtuels
Par Pierre-Marc Levasseur
![](images/result-tp5.jpg)
Description
L'objectif de ce travail était d'insérer des objets virtuels de manière réaliste dans une photos. Le processus pour réaliser une telle tâche est étonnamment assez simple. Dans les prochaines section, j'explique comment j'ai réaliser le travail. Vous pourrez aussi voir quelques résultats que j'ai obtenu avec mon approche.
Vous pouvez cliquer sur toutes les images de cette page pour les voir en plein écran.
Carte de radiance HDR
La première étape du travail est de construire une carte de radiance HDR (à hautre plage dynamique). Pour ce faire, j'ai implanté l'algorithme expliqué dans cet article de Paul E. Debevec et de Jitendra Malik. J'ai donc utilisé plusieurs photos d'un miroir sphérique à plusieurs temps d'exposition différent. Voici une série d'image que j'ai utilisé pour construire une carte de radiance:
![](images/1-400.jpg)
![](images/1-200.jpg)
![](images/1-100.jpg)
![](images/1-50.jpg)
![](images/1-25.jpg)
![](images/1-10.jpg)
![](images/1-4.jpg)
![](images/1-2.jpg)
![](images/1-1.jpg)
![](images/2-1.jpg)
Pour obtenir de bons résultats pour ces photos, j'ai utilisé un trépied extrêmement solide qui m'a permis de changer les paramètre de l'appareil sans le déplacer et qui m'a permis de stabiliser l'appareil lors des longues expositions. Ces détails peuvent sembler sans importance, mais les formules présentées prochainement dépendent beaucoup du fait que les différentes photos soient bien aligné et représente une scène à la même position.
![](images/trepied.jpg)
Avec ces images, j'ai choisis une centaine de position aléatoire et j'ai pris les valeurs des pixels correspondant dans chaque canal de chaque image (Zij, pixel i d'une image j). La valeur de ces pixels est le résultats d'une fonction f qui dépend la radiance de la scène à cette position (Ei) et du temps d'exposition (Δt). Donc,
Zij = f(Ei X Δt)
Pour rendre le problème linéaire, nous allons chercher une fonction g=ln(f-1) qui prend les valeurs possible d'un pixel (de 0 à 255) sur le lg des valeurs d'exposition:
g(Zij) = ln(Ei) + ln(Δt)
Il est important de noter que nous pouvons uniquement retrouver g jusqu'à un facteur d'échelle. L'algorithme pour résoudre ce problème est disponible à la fin de l'article de Debevec. J'ai donc utiliser cet algorithme avec les pixels choisis et les temps d'exposition de chacune de mes images pour récupérer une fonction g pour chaque canal de couleur (RGB). Voici les fonctions g que j'ai obtenu pour les images précédentes:
![](images/fonctionG_table.jpg)
Ayant les fonctions g en main, j'ai donc construit la carte de radiance HDR en implémentant l'équation 6 de l'article de Debevec pour chaque canal de couleur. En utilisant la transformation linéaire de Reinhard avec un facteur d'échelle de 0.3, j'obtiens donc l'image suivante:
![](images/tableHDR_normalized.jpg)
Rendu d'objets synthétiques
Pour finalement insérer des objets virtuels dans les différentes scène que j'ai photographié, j'ai utilisé le logiciel gratuit Blender pour modéliser et faire le rendu de ces objets. La première est donc de modéliser la surface sur laquelle on veut mettre les objets virtuels. J'ai donc pris le temps de correctement positionner les surfaces par rapport à la camera virtuelle dans Blender pour que les effets d'illumination et de perspective soient fidèlement rendus. Ensuite, J'ai travaillé sur la texture de celles-ci pour qu'elles aient les mêmes caractéristiques que les surfaces réelles (réflexivité, couleur, texture, etc.) Finalement, j'ai inséré les objets à différents endroits sur les surfaces pour créer des scènes intéressantes. Finalement, pour avoir une illumination similaire à celle des scènes réelles, j'ai utilisé la carte de radiance HDR comme image d'arrière plan dans Blender. Voici les résultats du processus:
Four de la cuisine
![](images/fourResults.jpg)
Pour obtenir ce résultat, j'ai utilisé une texture de type "Glossy" sur la surface pour imiter la surface réflichissante de mon four. Ensuite, j'ai inséré les objets fournis avec l'énoncé de ce travail sur toute la surface et j'ai gardé leur texture déjà configurée. Voici une capture d'écran de la configuration de la scène dans Blender et le masque que j'ai généré pour cette scène:
![](images/maskFour.png)
Bureau
![](images/emptyResizedBureau.jpg)
![](images/result-tp5.jpg)
Pour cette scène, j'ai créer des textures "custom" en utilisant l'éditeur de matériaux dans Blender. J'ai aussi ajouté le panneau arrière du bureaud dans la scène pour avoir l'effet d'ombrage sur celui-ci. Voici une capture d'écran de l'éditeur de texture de Blender pour le P :
Crédits supplémentaires
Voici quelques scènes supplémentaires:
Comment faire peur à sa colloc!
![](images/spiderChambre.jpg)
Pour faire peur à ma colloc, j'ai pris un modèle 3D d'araignée sur TurboSquid et je l'ai ajouté à l'entrée de sa chambre virtuellement. Malheureusment, Blender n'a pas été en mesure de correctement importé les textures du modèle original. J'ai donc fait une texture noir et j'ai utilisé le système de particule pour ajouter des poiles sur toute la surface du modèle. Bref, je me suis arrangé pour que les araignées ressemble à des tarentules :) Voici un gros plan d'une des araignées :
Dés animés
Pour cette scène, j'ai décidé d'animer un peu ma table de cuisine avec des dés. J'ai donc utilisé ce petit tutoriel pour modéliser les dés et leur donner une texture réaliste. Ensuite, j'ai utilisé le système de physique dans Blender pour simuler une gravité, faire en sorte que la table soit un objet solide et statique dans l'espace et faire en sorte que les dés sont des objets actif, solide et rebondissant. Un autre détail, vous pouvez voir dans la capture d'écran suivante que la surface de la table n'est pas coplanaire avec le plan X Y et il est important de noter que par défaut, la gravité est perpendiculaire à ce plan. Alors, pour obtenir l'effet rechercher, j'ai dû imposer une rotation à la gravité de Blender pour qu'elle soit perpendiculaire à la surface de la table. Ce n'est pas tous les jours qu'on a ce genre de pouvoir! Voici aussi l'animation des masques que j'ai utilisé pour composer les différentes images du vidéo:
Fluide animé
Pour être honnête, je suis vraiment deçu du résultat pour cette animation. J'ai encore une fois utilisé le système de physique dans blender pour simuler un fluide métallique comme du mercure dans une scène, mais malgré plus de 6 heures de calculs et deux heures de rendu graphique, on voit assez clairement les arêtes dans le fluide. De plus, pour une raison que j'ignore, Blender a généré des particules supplémentaires lorsque j'ai fait le rendu graphique des masques. Donc, il y a du bruit de type poivre et sel dans plus de la moitié des images du vidéo. Bref, voici le résultat:
Puisque le fluide peu se déplacer un peu partout dans la scène, j'ai dû modéliser une plus grande partie de la scène par rapport aux autres. Voici ma construction dans Blender: