Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 25

Application de textures sur les matériaux

Recommended resources

Bonjour !

Dans la leçon précédente, vous avez appris à affiner la qualité des ombres en ajustant la résolution de la shadow map. Vous maîtrisez maintenant les principaux aspects de l'éclairage et de l'ombrage pour créer des scènes avec de la profondeur et du réalisme. Nos objets sont bien éclairés, mais leur surface est encore uniforme, définie par une simple couleur.

Aujourd'hui, nous allons franchir une étape décisive pour rendre nos objets plus crédibles. L'objectif de cette leçon est de vous apprendre à charger et appliquer des textures d'image sur les matériaux. Au lieu d'un cube rouge, vous pourrez avoir un cube en bois. Au lieu d'une sphère bleue, une planète Terre. Cette compétence est fondamentale pour créer les scènes de qualité professionnelle qui vous intéressent.

Qu'est-ce qu'une texture ?

En 3D, une texture est le plus souvent une simple image 2D que l'on "enveloppe" autour d'un objet 3D pour lui donner une apparence de surface détaillée. C'est ce qui permet de simuler des matériaux comme la brique, le métal, le tissu ou la roche sans avoir à modéliser chaque petit détail.

3D Texture from Image in Three.js
Cette image illustre parfaitement le concept : une image 2D d'un mur de briques (`brick.jpg`) est appliquée sur une géométrie simple (un plan ou un cube) pour créer l'illusion d'un mur en 3D.

Pour que la carte graphique sache comment appliquer l'image sur la géométrie, chaque sommet (vertex) du modèle 3D possède, en plus de ses coordonnées 3D (x, y, z), des coordonnées 2D spéciales appelées coordonnées UV. Ces coordonnées indiquent quel point de l'image 2D correspond à ce sommet.

Pour une introduction plus détaillée, je vous suggère de lire la première partie du document suivant.

Les matériaux — JavaScript avancé

Cet extrait de la documentation de David Gayerie explique le concept de texture et d'UV mapping de manière claire et concise.

Lisez la section intitulée « Textures et Maps ». Concentrez-vous sur la définition d'une texture et la signification des coordonnées UV. Notez le passage important : les géométries de base de Three.js (Cube, Sphère, etc.) ont déjà des coordonnées UV, nous n'avons donc pas à nous en soucier pour l'instant.


Charger et Appliquer une Texture avec Three.js

Le processus pour appliquer une texture se déroule en deux étapes principales :

  1. Charger l'image en mémoire à l'aide de la classe THREE.TextureLoader.
  2. Appliquer la texture chargée à la propriété map d'un matériau.

La vidéo suivante, tirée d'un tutoriel par Grafikart.fr, montre ce processus de manière très concrète.

Tutoriel JavaScript : Panorama 360°

Cette vidéo explique comment créer un panorama 360°. La partie qui nous intéresse est celle où l'auteur charge une image pour la plaquer à l'intérieur d'une sphère.

Regardez la séquence de 00:13:28 à 00:15:13. Observez bien comment il utilise THREE.TextureLoader pour charger l'image, puis comment il assigne le résultat à la propriété map du MeshBasicMaterial.

Synthétisons le code que vous venez de voir :

  1. Créer un TextureLoader : C'est l'objet qui va s'occuper du chargement de notre image. On n'en a besoin que d'un seul pour toute l'application.

    const textureLoader = new THREE.TextureLoader();
    
  2. Charger la texture : On utilise la méthode .load() du loader, en lui passant en argument le chemin vers notre fichier image. Cette méthode retourne immédiatement un objet Texture. Le chargement de l'image se fait en arrière-plan.

    const maTexture = textureLoader.load('/chemin/vers/mon_image.jpg');
    
  3. Appliquer au matériau : On assigne simplement l'objet Texture à la propriété map de notre matériau. Il est important de noter qu'on ne doit généralement pas utiliser color et map en même temps. La map remplace la couleur de base.

    const monMateriau = new THREE.MeshStandardMaterial({
        map: maTexture
    });
    

Le document textuel que vous avez consulté précédemment propose également un exemple de code complet et quelques remarques importantes.

Les matériaux — JavaScript avancé

Revenons à l'article de David Gayerie pour consolider nos connaissances avec un exemple de code et des informations techniques utiles.

Lisez les sections « Chargement d’une texture » et « Un texture comme color map ». Portez une attention particulière à la note sur les dimensions des images (puissances de 2) pour l'optimisation, et sur le caractère asynchrone du chargement.


Atelier : Texturons notre scène

Il est temps de mettre cela en pratique. Nous allons reprendre une scène simple (par exemple, celle avec le TorusKnot et l'éclairage à trois points) et remplacer sa couleur par une texture.

Vous pouvez utiliser n'importe quelle image, mais pour un bon résultat, cherchez sur internet une "seamless texture" (texture raccordable) d'un matériau qui vous plaît (bois, métal, roche...). Par exemple, cette texture de métal.

Voici les étapes :

  1. Placez l'image que vous avez choisie dans le dossier public de votre projet Vite. Par exemple : public/textures/metal.jpg.

  2. Dans votre fichier main.js, juste avant de créer vos matériaux, instanciez le TextureLoader.

    const textureLoader = new THREE.TextureLoader();
    
  3. Chargez votre texture. Le chemin doit être relatif au dossier public, donc il commence par /.

    const metalTexture = textureLoader.load('/textures/metal.jpg');
    
  4. Modifiez le matériau de votre TorusKnot (ou de l'objet de votre choix). Supprimez la propriété color et ajoutez la propriété map.

    // Avant
    // const material = new THREE.MeshStandardMaterial({ color: 0xffffff, roughness: 0.5, metalness: 0.7 });
    
    // Après
    const material = new THREE.MeshStandardMaterial({
        map: metalTexture,
        roughness: 0.5,
        metalness: 0.7
    });
    
  5. Lancez votre application. Votre objet devrait maintenant être recouvert de la texture que vous avez choisie, tout en réagissant correctement à la lumière que vous aviez mise en place !


Un aperçu du futur : les textures avec React Three Fiber

Comme votre objectif est de travailler avec React Three Fiber (R3F), il est intéressant de voir comment ce que vous venez d'apprendre s'y traduit. La logique reste la même, mais la syntaxe devient déclarative, ce qui est souvent plus simple.

L'exemple de code ci-dessous montre comment créer une Terre en rotation avec R3F. Regardez attentivement les lignes concernant la texture.

Ingénieur en animation 3D | AI Agent... - LobeHub

Cet exemple, tiré d'une conversation avec un agent IA, illustre la création d'une scène 3D avec React Three Fiber. C'est un excellent aperçu de ce qui vous attend.

Concentrez-vous sur le bloc de code JSX. Repérez la ligne const texture = new THREE.TextureLoader().load(...) qui est identique à ce que nous avons fait. Puis, voyez comment la texture est passée à <meshStandardMaterial> via une prop : map={texture}. C'est la magie de R3F : du Three.js natif dans du JSX.

Comme vous pouvez le voir, les connaissances que vous acquérez en Three.js "pur" sont directement transposables à R3F.


Conclusion

Félicitations ! Vous savez maintenant comment donner vie à vos objets en leur appliquant des textures. C'est une compétence fondamentale qui change radicalement la qualité visuelle de vos créations.

Points clés à retenir :

  • Une texture est une image 2D appliquée à un objet 3D via des coordonnées UV.
  • On utilise THREE.TextureLoader pour charger les images de manière asynchrone.
  • La texture chargée est assignée à la propriété map du matériau pour définir sa couleur de base.
  • Pour des performances optimales, il est préférable d'utiliser des images dont les dimensions sont des puissances de 2 (ex: 1024x1024).

Aperçu de la prochaine leçon :
La map de couleur est la texture la plus basique. Pour atteindre un réalisme encore plus poussé, les moteurs de rendu modernes utilisent plusieurs autres types de textures qui simulent des propriétés de surface complexes. Dans la prochaine leçon, nous explorerons les textures PBR essentielles : la normalMap (pour simuler du relief), la roughnessMap (pour contrôler la rugosité) et l' aoMap (pour les ombres de contact).

Comparaison de Différentes Textures PBR
Aperçu des différentes textures que nous aborderons : la couleur (map), le relief (normalMap), le déplacement (displacementMap) et la rugosité (roughnessMap).