Skip to main content

Welcome to a Grasp lesson

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

Lesson 52

Interaction Utilisateur: Inspection Produit

Recommended resources

Bonjour !

Dans la leçon précédente, nous avons assemblé une superbe scène de présentation de produit. Elle est visuellement aboutie, avec un modèle détaillé, un éclairage de studio et un environnement réaliste. Cependant, elle reste statique. L'utilisateur peut tourner autour du produit, mais ne peut pas interagir avec lui.

Aujourd'hui, nous allons franchir l'étape décisive qui transforme un simple rendu en une véritable application web : l'interaction. L'objectif de cette leçon est d'implémenter la logique qui permettra à un utilisateur d'inspecter et de personnaliser le produit. Nous allons connecter une interface utilisateur 2D (des boutons HTML) à notre scène 3D, ce qui est au cœur de tout configurateur de produit ou showcase interactif.

1. L'architecture de l'interactivité : Gérer un état partagé

Le défi principal est le suivant : comment un clic sur un bouton HTML peut-il modifier la couleur ou une partie d'un modèle 3D qui vit dans un <Canvas> R3F ? Ces deux mondes, le DOM et WebGL, sont distincts.

La solution en React est de créer une source de vérité unique (Single Source of Truth) accessible par les deux parties. Nous allons utiliser l'API Context de React pour cela. Le Contexte nous permettra de créer un "état global" pour les options de personnalisation, que nos composants 2D et 3D pourront lire et modifier.

Cette approche est très puissante car elle sépare la logique (l'état de la personnalisation) de la présentation (l'UI et le modèle 3D).

3D Model Color Customizer App with React Three Fiber
Un configurateur de produit interactif, comme celui-ci, est exactement ce que nous cherchons à construire. Notez comment les options de l'interface (en bas) affectent directement le modèle 3D.

2. Mettre en place l'interface de configuration (UI)

Avant de gérer l'état, créons les boutons que l'utilisateur cliquera. Nous allons construire un panneau de configuration simple en HTML et CSS, qui sera positionné par-dessus notre canvas 3D.

React Three Fiber tutorial - 3D Product Configurator

La vidéo suivante montre comment créer l'interface utilisateur pour notre configurateur de chaise. L'approche est volontairement simple, utilisant du CSS classique directement dans le fichier index.css.

Regardez la section de 00:25:03 à 00:32:22. Concentrez-vous sur la structure HTML et la logique CSS. Observez comment le panneau est structuré en sections (configurator-section) contenant des options (item). C'est cette structure que nous rendrons dynamique à l'étape suivante.

À ce stade, vous devriez avoir un composant Configurator qui affiche des options statiques à l'écran. La prochaine étape est de leur donner vie.


3. Créer le Contexte de personnalisation

Nous allons maintenant créer notre "cerveau" : un Contexte React qui contiendra toutes les options de personnalisation (matériau, couleur, etc.) et les fonctions pour les modifier.

La structure habituelle pour un Contexte est :

  1. Un fichier context/Customization.jsx qui définit le contexte.
  2. Un CustomizationProvider qui utilise des useState pour gérer les données et les expose via le Contexte.
  3. Un hook personnalisé useCustomization pour accéder facilement à ces données depuis n'importe quel composant.

React Three Fiber tutorial - 3D Product Configurator

Continuons avec le même tutoriel. L'auteur met maintenant en place le Contexte React qui va piloter toute l'application.

Regardez attentivement le début de cette section, de 00:32:22 à 00:35:40. Observez comment il crée CustomizationContext, le CustomizationProvider avec les useState pour material, et le hook useCustomization. Notez l'étape cruciale où il enveloppe l'application entière (<App />) dans le <CustomizationProvider> pour que l'état soit accessible partout.

Voici un résumé du code pour le fournisseur de contexte :

// dans context/Customization.jsx
import { createContext, useContext, useState } from "react";

const CustomizationContext = createContext({});

export const CustomizationProvider = (props) => {
  const [material, setMaterial] = useState("leather");
  const [legs, setLegs] = useState(1);
  // ... autres états pour les couleurs, etc.

  return (
    <CustomizationContext.Provider value={{ material, setMaterial, legs, setLegs }}>
      {props.children}
    </CustomizationContext.Provider>
  );
};

export const useCustomization = () => {
  return useContext(CustomizationContext);
};

4. Connecter l'UI et le modèle 3D

Maintenant que notre état est centralisé, il ne reste plus qu'à le "brancher" à nos composants.

  1. Dans le composant UI (Configurator.jsx) : Nous allons utiliser useCustomization pour lire l'état actuel (afin de savoir quel bouton est actif) et pour obtenir les fonctions de mise à jour (à appeler sur onClick).
  2. Dans le composant 3D (Chair.jsx) : Nous utiliserons également useCustomization pour lire l'état et ajuster l'apparence du modèle en conséquence (changer un matériau, la couleur, ou la visibilité d'une pièce).

C'est là que la magie opère. L'UI et le modèle 3D sont découplés, mais ils réagissent tous les deux aux mêmes changements d'état.

React Three Fiber tutorial - 3D Product Configurator

Cette dernière partie de la vidéo est la plus importante. Elle montre comment connecter le contexte à la fois à l'interface et au modèle 3D pour créer une expérience interactive complète.

Regardez le reste de la section, de 00:35:40 à 00:50:11. Suivez attentivement ces étapes clés : UI : Comment les événements onClick des boutons appellent setMaterial, setLegs, et setChairColor. UI : Comment la classe .item--active est appliquée dynamiquement en comparant l'état actuel du contexte. Modèle 3D : Comment le composant <Chair> utilise l'état legs pour conditionner la propriété visible des différentes parties du maillage (<mesh visible={legs === 1} />). Modèle 3D : Comment la propriété color du <meshStandardMaterial> est directement liée à l'état chairColor.color du contexte.

L'interaction est maintenant fonctionnelle ! Un clic sur un bouton dans l'UI met à jour le contexte, ce qui provoque un nouveau rendu du composant 3D avec les bonnes propriétés.


5. Aller plus loin : L'interaction directe avec les objets

Une autre façon d'inspecter un produit est de cliquer directement sur ses différentes parties. React Three Fiber rend cela aussi simple que d'ajouter un gestionnaire d'événements au DOM.

Vous pouvez attacher des gestionnaires d'événements comme onClick, onPointerOver (survol), onPointerOut, etc., directement sur vos balises <mesh>.

Events - React Three Fiber

Pour comprendre la théorie derrière ces événements, je vous suggère de parcourir rapidement la documentation officielle de R3F sur les événements.

Lisez la section d'introduction qui liste les événements disponibles. Ensuite, portez une attention particulière à la section sur event.stopPropagation(). C'est un concept crucial en 3D pour éviter que les clics ne "traversent" les objets.

Voici un exemple pratique. Dans votre composant de chaise, vous pourriez faire en sorte que cliquer sur le coussin affiche son nom dans la console :

<mesh
  geometry={nodes.cushion.geometry}
  onClick={(event) => {
    // Empêche le clic de se propager aux objets derrière le coussin
    event.stopPropagation();
    console.log("Coussin cliqué !");
    // On pourrait ici mettre à jour un état pour zoomer sur cette partie
  }}
>
  <meshStandardMaterial {...materialProps} color={cushionColor.color} />
</mesh>

Cette méthode est parfaite pour des interactions comme la sélection d'une partie du produit pour en afficher les détails.


Conclusion

Félicitations ! Vous avez transformé une scène statique en une expérience interactive et dynamique. C'est une compétence fondamentale pour la création de showcases de produits, de configurateurs, ou de toute application 3D où l'utilisateur a le contrôle.

Les points clés de cette leçon sont :

  • L'état partagé avec React Context : C'est la solution architecturale pour faire communiquer une UI 2D et une scène 3D.
  • Le flux de données unidirectionnel : L'UI met à jour l'état, et la scène 3D réagit à cet état. C'est le principe fondamental de React appliqué à la 3D.
  • Rendu conditionnel en 3D : Nous avons utilisé des propriétés comme visible et color de manière dynamique, basées sur l'état de l'application.
  • Événements R3F : Nous avons découvert comment gérer les clics directement sur les objets 3D, ouvrant la porte à d'autres types d'interactions.

Aperçu de la prochaine leçon :

Notre application est maintenant presque complète ! La dernière étape majeure avant le déploiement est de s'assurer qu'elle fonctionne bien sur tous les écrans. Dans la prochaine leçon, "Assurer un affichage adaptatif (responsive) de la scène sur différentes tailles d'écran", nous apprendrons les techniques pour que notre expérience 3D soit aussi belle sur mobile que sur ordinateur.