Bonjour !
Dans la leçon précédente, nous avons appris à charger des modèles 3D complexes avec useGLTF et gltfjsx. C'est une étape cruciale, mais vous avez peut-être remarqué que même le plus beau des modèles peut paraître terne et peu convaincant avec un éclairage basique.
Aujourd'hui, nous allons faire briller nos créations. L'objectif est d'apprendre à mettre en place un éclairage et des reflets réalistes en quelques lignes avec le composant <Environment>. Cette technique, appelée Image-Based Lighting (IBL), est l'un des secrets les mieux gardés pour obtenir rapidement un rendu de qualité professionnelle dans vos scènes 3D.
1. Qu'est-ce qu'un environnement et pourquoi est-ce si important ?
Imaginez que vous preniez une photo à 360° d'un lieu, comme une plage ensoleillée ou un studio photo. Cette image panoramique est ce que l'on appelle une carte d'environnement (ou environment map), souvent stockée dans un format spécial appelé HDRI (High Dynamic Range Image).
En 3D, ces cartes ont deux fonctions essentielles :
- Éclairage : La scène 3D utilise les informations de couleur et de luminosité de l'image pour éclairer les objets. Un ciel bleu vif dans l'HDRI éclairera vos objets avec une lumière bleue venant du dessus.
- Reflets : Les surfaces réfléchissantes de vos modèles (comme le métal ou le verre) refléteront cette image à 360°, les intégrant de manière crédible dans leur environnement.
La courte vidéo suivante explique très bien ce concept.
Generated Environment Maps in React Three Fiber and Three.js
Cette vidéo de la chaîne Threeveloper introduit parfaitement le concept des cartes d'environnement et leurs deux usages principaux.
Regardez l'introduction de 0:00 à 0:51. Concentrez-vous sur la définition d'une carte d'environnement et ses deux utilités : afficher un environnement distant et fournir des reflets.
Le résultat ? Vos objets 3D ne flottent plus dans le vide, mais semblent réellement appartenir à un monde.

2. Le composant <Environment> : la magie de drei
Heureusement, React Three Fiber et l'écosystème drei rendent l'implémentation de l'IBL incroyablement simple grâce au composant <Environment>.
Il existe deux manières principales de l'utiliser.
Approche 1 : Les pré-réglages (presets)
Pour un résultat immédiat sans avoir à chercher de fichiers, drei fournit une collection de presets (pré-réglages) de haute qualité.
React Three Fiber (react-three-fiber... - LobeHub
Cette documentation de référence est une sorte de "pense-bête" très utile. Jetez un coup d'œil aux options disponibles pour le composant <Environment>.
Dans la section "Common Drei Components", trouvez la ligne concernant // Environment lighting (HDR). Notez la syntaxe simple <Environment preset="sunset" background /> et la liste des pré-réglages disponibles (apartment, city, dawn, etc.).
Pour l'utiliser, il suffit d'ajouter le composant à votre <Canvas> :
import { Canvas } from '@react-three/fiber'
import { Environment, OrbitControls } from '@react-three/drei'
import { YourModel } from './YourModel' // Le modèle de la leçon précédente
function App() {
return (
<Canvas>
<Suspense fallback={null}>
<YourModel />
{/* Ajoute un éclairage et un arrière-plan basés sur un pré-réglage */}
<Environment preset="city" background />
</Suspense>
<OrbitControls />
</Canvas>
)
}
La prop background indique à <Environment> d'utiliser également l'image comme arrière-plan de la scène. Sans cette prop, l'environnement éclairera vos objets mais le fond restera transparent ou de la couleur par défaut.
Approche 2 : Votre propre fichier HDRI
Pour un contrôle artistique total, vous utiliserez vos propres fichiers HDRI. Une excellente ressource gratuite est Poly Haven.
Pour voir l'effet des reflets, il nous faut d'abord un objet réfléchissant. La vidéo suivante montre comment créer une sphère métallique parfaite pour ce test.
Generated Environment Maps in React Three Fiber and Three.js
Avant d'appliquer notre environnement, voyons comment créer un objet qui pourra le refléter. Cette vidéo prépare une sphère avec un matériau métallique.
Regardez la section de 01:22 à 03:43. L'auteur crée une sphère avec un MeshStandardMaterial. Portez une attention particulière aux propriétés metalness={1} (très métallique) et roughness={0.1} (très lisse). Ce sont ces propriétés qui rendent un objet réfléchissant.
Maintenant que nous avons notre objet test, nous pouvons lui appliquer notre propre fichier HDRI.
- Téléchargez un fichier
.hdrdepuis Poly Haven. - Placez-le dans votre dossier
public. - Utilisez la prop
filesdu composant<Environment>.
La vidéo continue et montre exactement comment faire.
Generated Environment Maps in React Three Fiber and Three.js
Voyons maintenant comment remplacer le pré-réglage par notre propre fichier HDRI et l'appliquer à toute la scène.
Regardez la section de 03:43 à 06:22. Notez les points clés suivants : L'auteur montre d'abord comment appliquer l'environnement à un seul objet, mais cela ne change pas l'arrière-plan de la scène. La meilleure méthode consiste à utiliser le composant <Environment> qui applique l'éclairage à tous les objets. Il utilise la prop files pour charger le fichier .hdr. Il ajoute la prop background pour que les reflets correspondent à l'arrière-plan visible.
Le code résultant est d'une grande simplicité :
import { Environment } from '@react-three/drei'
// ... dans votre composant de scène
<Environment files="/my-hdri.hdr" background />
3. Environnements dynamiques et performance
Que se passe-t-il si votre environnement n'est pas statique ? Par exemple, si vous voulez animer les couleurs de l'arrière-plan en fonction du scroll de l'utilisateur.
Par défaut, pour des raisons de performance, <Environment> ne calcule l'éclairage qu'une seule fois, au premier rendu. Si l'environnement change, les lumières et les reflets ne se mettront pas à jour.
Pour forcer la mise à jour à chaque image, on utilise la prop frames={Infinity}.
Reproduce Atmos Awwwards 3D Website with React Three Fiber
Cette vidéo de Wawa Sensei montre un cas pratique très parlant : un arrière-plan dont les couleurs changent, et comment s'assurer que l'éclairage de la scène s'adapte en temps réel.
Regardez d'abord la section de 00:11:40 à 00:12:23 qui explique comment un arrière-plan peut être utilisé comme source de lumière via <Environment>. Puis, regardez la section clé de 00:18:29 à 00:19:08. L'auteur anime les couleurs du fond, mais constate que l'éclairage du modèle ne suit pas. L'ajout de frames={Infinity} au composant <Environment> résout le problème instantanément.
Attention, cette option est plus gourmande en ressources. Ne l'utilisez que lorsque votre environnement est réellement dynamique. Pour optimiser, vous pouvez aussi baisser la résolution de la carte d'environnement avec la prop resolution (par exemple, resolution={256}).
4. Atelier : Illuminez votre modèle
Il est temps de mettre en pratique ce que vous avez appris. Reprenons le projet de la leçon précédente, où vous avez chargé un modèle 3D avec gltfjsx.
- Récupérez votre projet : Ouvrez le code de la leçon précédente avec votre modèle 3D affiché.
- Trouvez un HDRI : Allez sur Poly Haven, choisissez un environnement qui vous plaît (un studio, un extérieur, etc.), et téléchargez la version 1k au format
.hdr. - Ajoutez le fichier : Placez le fichier
.hdrtéléchargé dans le dossierpublicde votre projet. - Implémentez
<Environment>:- Dans votre composant principal (
App.jsx), importezEnvironmentdepuis@react-three/drei. - Ajoutez
<Environment files="/votre-fichier.hdr" background />à l'intérieur de votre<Canvas>(et de<Suspense>). - Supprimez les lumières que vous aviez ajoutées manuellement (
<ambientLight>,<directionalLight>) pour bien voir l'effet de l'environnement seul.
- Dans votre composant principal (
- Observez et ajustez :
- Lancez votre application. Votre modèle devrait maintenant être éclairé de manière beaucoup plus réaliste et présenter des reflets de l'environnement.
- Bonus : Si votre modèle n'est pas très réfléchissant, ouvrez le composant généré par
gltfjsx. Cherchez les balises<meshStandardMaterial>et essayez de diminuer leurroughness(proche de 0 pour un effet miroir) et d'augmenter leurmetalness(proche de 1 pour un effet métallique).
Votre code final pourrait ressembler à ceci :
import { Suspense } from 'react';
import { Canvas } from '@react-three/fiber';
import { OrbitControls, Environment } from '@react-three/drei';
import { VotreModele } from './components/VotreModele';
export default function App() {
return (
<Canvas camera={{ position: [0, 1, 5], fov: 50 }}>
<Suspense fallback={null}>
<VotreModele />
{/* La seule ligne qui change tout ! */}
<Environment files="/votre-hdri.hdr" background />
</Suspense>
<OrbitControls autoRotate />
</Canvas>
);
}
Conclusion
Félicitations ! Vous maîtrisez maintenant l'une des techniques les plus efficaces pour améliorer considérablement la qualité visuelle de vos scènes 3D. Un bon éclairage est ce qui sépare une scène amateur d'une expérience professionnelle.
Points clés à retenir :
- L'éclairage basé sur l'image (IBL) utilise une image à 360° (HDRI) pour éclairer une scène et créer des reflets réalistes.
- Le composant
<Environment>dedreiest l'outil le plus simple pour implémenter l'IBL. - Vous pouvez utiliser des
presetspour des résultats rapides ou des fichiers.hdrpersonnalisés pour un contrôle total. - La prop
backgroundpermet d'afficher l'environnement en tant que fond de scène. - Pour les environnements animés, la prop
frames={Infinity}force la mise à jour continue, au prix d'une performance moindre.
Aperçu de la prochaine leçon :
L'éclairage d'environnement est fantastique pour le réalisme global, mais que faire si nous voulons ajouter des sources de lumière plus artistiques et contrôlées, comme des néons ou des projecteurs virtuels ? Dans la prochaine leçon, nous explorerons le composant <Lightformer>, qui nous permettra de "peindre avec la lumière" à l'intérieur de notre environnement.