Skip to main content

Welcome to a Grasp lesson

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

Lesson 43

Débogage en temps réel avec Leva

Recommended resources

Bonjour ! Dans la leçon précédente, nous avons fait un grand pas en apprenant à piloter nos objets 3D depuis une interface utilisateur 2D externe, en utilisant les hooks useState et useEffect. C'est le principe de base pour créer des applications interactives.

Cependant, vous avez dû remarquer que pour ajuster finement une couleur, une position ou la vitesse d'une animation, le cycle "modifier le code -> sauvegarder -> attendre le rechargement" est assez lent et fastidieux. C'est un obstacle majeur à la créativité et à l'efficacité, surtout lorsqu'on cherche à obtenir un résultat visuel précis pour des applications professionnelles.

Aujourd'hui, nous allons résoudre ce problème en intégrant un outil essentiel dans la boîte à outils de tout développeur React Three Fiber : un panneau de contrôle. L'objectif est d'intégrer un panneau de contrôle Leva pour déboguer et modifier les paramètres de la scène en temps réel. Vous pourrez ainsi manipuler votre scène comme un artiste ajuste ses pinceaux, avec un retour visuel immédiat.

1. Qu'est-ce que Leva et pourquoi l'utiliser ?

Leva est une librairie qui ajoute une interface graphique (GUI) de contrôle directement dans votre application. Elle fait partie de l'écosystème pmndrs (Poimandres), le même collectif qui maintient React Three Fiber et Drei, ce qui garantit une intégration parfaite.

Plutôt que de longs discours, voyons Leva en action :

Leva Control Panel in Action
Cette animation montre comment Leva permet de modifier des valeurs (nombres, couleurs, positions) via des contrôles simples et de voir les changements se répercuter instantanément dans l'application.

L'avantage est clair : vous pouvez ajuster des dizaines de paramètres en quelques secondes pour trouver le réglage parfait, que ce soit pour la couleur d'un matériau, l'intensité d'une lumière ou la position d'une caméra. C'est un gain de temps considérable.


2. Mise en place : useControls

Intégrer Leva est incroyablement simple. Commençons par installer la librairie dans votre projet :

npm install leva

L'outil principal que Leva nous fournit est un hook React : useControls. Ce hook va remplacer les useState que nous utilisions pour les propriétés que nous souhaitons rendre modifiables.

Pour découvrir son fonctionnement, la vidéo suivante est un excellent point de départ.

Learn to debug your UI real time using LEVA

Regardons cette vidéo de la chaîne Threeveloper qui présente Leva et son fonctionnement de base. Elle est en anglais, mais les concepts visuels et le code sont universels.

Regardez les deux premières parties de la vidéo (de 00:00 à 01:55). Concentrez-vous sur : L'introduction qui explique pourquoi un outil comme Leva est utile (00:00 - 01:00). La mise en place de base : installation et première utilisation du hook useControls pour contrôler la propriété scale d'un objet (01:21 - 01:55).

Atelier : Votre premier contrôle

Prenons un exemple simple. Imaginez ce composant Cube :

// Avant Leva
import { useState } from 'react';

function MyScene() {
  const [color, setColor] = useState('orange');

  return (
    <mesh>
      <boxGeometry />
      <meshStandardMaterial color={color} />
    </mesh>
  );
}

Pour rendre la couleur contrôlable avec Leva, il suffit de remplacer useState par useControls :

// Après Leva
import { useControls } from 'leva';

function MyScene() {
  // 1. Appelez useControls avec un objet décrivant vos contrôles
  const { color } = useControls({
    color: 'orange', // Leva va créer un sélecteur de couleur
  });

  // 2. Utilisez la valeur retournée comme avant
  return (
    <mesh>
      <boxGeometry />
      <meshStandardMaterial color={color} />
    </mesh>
  );
}

C'est tout ! En rechargeant votre page, un panneau de contrôle apparaîtra automatiquement, vous permettant de changer la couleur du cube en temps réel.


3. Explorer les différents types de contrôles

La force de Leva est sa capacité à déduire le type de contrôle à afficher en fonction de la valeur que vous lui donnez.

  • Une chaîne de caractères au format hexadécimal ('#ff0000') devient un sélecteur de couleur.
  • Un booléen (true ou false) devient une case à cocher.
  • Un nombre (1.5) devient un curseur (slider) ou un champ numérique.
  • Un tableau de nombres ([x, y, z]) devient un contrôle de vecteur.

Pour plus de précision, vous pouvez passer un objet de configuration au lieu d'une simple valeur.

const { scale, visible, position } = useControls({
  // Curseur avec min, max et pas
  scale: { value: 1, min: 0.5, max: 2, step: 0.01 },
  // Case à cocher
  visible: true,
  // Contrôle de vecteur pour la position
  position: { value: [0, 1, -1], step: 0.1 }
});

La vidéo suivante illustre parfaitement la création de ces différents types de contrôles.

Learn to debug your UI real time using LEVA

Continuons avec la vidéo de Threeveloper pour voir comment Leva gère intelligemment ces différents types de données.

Regardez de 02:16 à 03:13. Observez comment : On configure un nombre avec min, max et step (02:16 - 02:33). Leva reconnaît une chaîne hexadécimale comme une couleur (02:33 - 02:46). Une valeur booléenne génère une case à cocher (02:46 - 02:52). Un tableau de trois nombres est interprété comme un contrôle de vecteur (02:56 - 03:13).

Leva Control Panel in a 3D Scene with Performance Monitor
Exemple d'une scène 3D avec un panneau Leva affichant un sélecteur de couleur, un champ de position, une case à cocher et un bouton, illustrant la polyvalence de l'outil.

4. Organiser le panneau et ajouter des actions

Lorsque le nombre de paramètres augmente, votre panneau peut vite devenir désordonné. Leva permet de les organiser dans des dossiers. De plus, vous pouvez ajouter des boutons pour déclencher des actions spécifiques, comme réinitialiser une position.

Cela se fait en important folder et button depuis la librairie leva.

r3f-fundamentals - LobeHub

Pour garder votre panneau de contrôle propre et y ajouter des actions, nous utilisons folder et button. Ce document de référence vous montre la syntaxe exacte avec des exemples de code clairs.

Consultez les sections "Organized Folders" et "Button Actions". Notez comment la fonction folder est utilisée pour regrouper des contrôles sous des titres (ex: "Lighting", "Camera"). Regardez comment button permet de déclencher une fonction. L'exemple est très pertinent : il utilise une ref pour accéder à l'objet 3D et appeler sa méthode position.set(), un concept que nous maîtrisons.

Voici un exemple qui combine ces concepts :

import { useRef } from 'react';
import { useControls, folder, button } from 'leva';

function ControllableCube() {
  const meshRef = useRef();

  const { scale, color } = useControls({
    'Cube Transform': folder({
      scale: { value: 1, min: 0.5, max: 2 },
    }),
    'Cube Material': folder({
      color: 'orange',
    }),
    'Actions': folder({
      // Un bouton qui utilise une ref pour agir sur l'objet
      Reset: button(() => {
        meshRef.current.position.set(0, 0, 0);
        meshRef.current.rotation.set(0, 0, 0);
      }),
    }),
  });

  return (
    <mesh ref={meshRef} scale={scale}>
      <boxGeometry />
      <meshStandardMaterial color={color} />
    </mesh>
  );
}

5. Une pratique professionnelle : Cacher Leva en production

Leva est un outil de développement. Il ne doit pas être visible pour l'utilisateur final de votre application. Heureusement, il est très simple de le cacher pour le build de production.

Il suffit d'importer le composant <Leva /> et de le rendre conditionnellement en fonction de l'environnement.

// Dans votre fichier principal, par exemple App.js
import { Leva } from 'leva';

export default function App() {
  return (
    <>
      {/* Leva ne sera affiché qu'en mode développement */}
      <Leva collapsed hidden={process.env.NODE_ENV === 'production'} />

      <Canvas>{/* ... votre scène ... */}</Canvas>
    </>
  );
}

L'option collapsed est également utile pour que le panneau ne prenne pas toute la place au chargement.


Conclusion

Vous venez d'ajouter un des outils les plus puissants à votre arsenal de développeur 3D. Leva transforme le processus de réglage et de débogage d'une corvée en une activité créative et instantanée.

Points clés à retenir :

  • Leva fournit une interface graphique pour modifier les paramètres de votre scène en temps réel.
  • Le hook useControls est le point d'entrée principal. Il remplace useState pour les valeurs que vous souhaitez contrôler.
  • Leva déduit intelligemment le type de contrôle (slider, couleur, case à cocher) à partir de la valeur fournie.
  • Utilisez folder pour organiser vos contrôles et button pour déclencher des actions (souvent avec une ref).
  • Pensez toujours à cacher Leva en production avec le composant <Leva hidden={process.env.NODE_ENV === 'production'} />.

Aperçu de la prochaine leçon :
Maintenant que nous savons contrôler notre scène depuis le code (leçon précédente) et la déboguer en temps réel avec Leva (cette leçon), nous allons nous pencher sur une communication plus poussée entre la 3D et la 2D. Dans la prochaine leçon, nous verrons comment faire en sorte que des actions dans la scène 3D (comme cliquer sur un objet) puissent mettre à jour l'interface utilisateur 2D (par exemple, afficher des informations sur l'objet cliqué dans un panneau latéral HTML).