WebGL · React · 3D temps réel

Premiers pas en WebGL : afficher un objet 3D avec React

WebGL permet de transformer un composant React en véritable scène interactive. Voici une méthode progressive pour créer une caméra, charger une géométrie et préparer une expérience 3D performante.

Publié le 12 février 2026 Lecture : 8 min Par l’équipe GraphHub
Objet 3D lumineux rendu en WebGL dans une interface React
Une scène WebGL devient un composant d’interface lorsqu’elle est pilotée par l’état de React.

Ajouter de la 3D à une interface ne consiste pas simplement à déposer un modèle dans une page. Il faut organiser une scène, définir un moteur de rendu, gérer le cycle de vie du canvas et relier les interactions utilisateur à l’état applicatif. React s’occupe de la structure et des données ; WebGL prend en charge le dessin accéléré par le GPU.

Comprendre la chaîne de rendu

WebGL est une API JavaScript qui expose le rendu graphique directement dans un élément <canvas>. En pratique, on utilise souvent une bibliothèque comme Three.js afin de ne pas manipuler manuellement les shaders, les buffers et les matrices. Dans un projet React, React Three Fiber fournit une couche déclarative particulièrement adaptée : une scène 3D peut être décrite comme un arbre de composants.

Une scène minimale rassemble quatre éléments :

Installer une base React 3D

Dans une application Vite ou un projet React existant, installez les dépendances suivantes :

npm install three @react-three/fiber @react-three/drei

Le composant Canvas crée le contexte WebGL et configure un rendu adapté à la taille de son conteneur. L’exemple ci-dessous affiche une boîte éclairée et la fait pivoter à chaque image.

import { Canvas, useFrame } from "@react-three/fiber";
import { OrbitControls } from "@react-three/drei";
import { useRef } from "react";

function Cube() {
  const mesh = useRef();

  useFrame((_, delta) => {
    mesh.current.rotation.x += delta * 0.45;
    mesh.current.rotation.y += delta * 0.7;
  });

  return (
    <mesh ref={mesh}>
      <boxGeometry args={[1.5, 1.5, 1.5]} />
      <meshStandardMaterial color="#6366f1" roughness={0.28} />
    </mesh>
  );
}

export default function Scene3D() {
  return (
    <div style={{ height: "420px" }}>
      <Canvas camera={{ position: [3, 2, 4], fov: 45 }}>
        <color attach="background" args={["#0f172a"]} />
        <ambientLight intensity={0.7} />
        <directionalLight position={[3, 4, 5]} intensity={2} />
        <Cube />
        <OrbitControls enableDamping />
      </Canvas>
    </div>
  );
}

Pourquoi utiliser useFrame ?

useFrame s’exécute dans la boucle de rendu de la scène. Il convient aux animations continues, comme une rotation ou un déplacement de caméra. Évitez toutefois d’y appeler setState à chaque image : cela provoquerait des re-rendus React inutiles. Pour une animation fluide, modifiez directement les propriétés Three.js, puis réservez l’état React aux changements fonctionnels de l’interface.

Point d’attention : le canvas doit disposer d’une hauteur explicite. Sans hauteur sur son parent, il peut être correctement monté mais rester invisible, car son conteneur mesure zéro pixel.

Passer d’un cube à un modèle 3D

Pour un produit, un portfolio ou une démonstration interactive, vous chargerez généralement un fichier GLB ou glTF. Le hook useGLTF de Drei simplifie cette étape et met en cache les ressources déjà demandées.

import { useGLTF } from "@react-three/drei";

function ProductModel() {
  const { scene } = useGLTF("/assets/objet.glb");
  return <primitive object={scene} scale={1.8} />;
}

useGLTF.preload("/assets/objet.glb");

Optimisez le fichier avant sa mise en production : textures compressées, maillage simplifié et suppression des matériaux inutilisés. Un CDN dédié aux assets 3D, comme l’infrastructure proposée par GraphHub, réduit aussi la latence et permet de servir les variantes adaptées au contexte, notamment mobile ou desktop.

Cette logique de chargement peut s’intégrer à une bibliothèque de composants partagée entre designers et développeurs. Une variante de matériau, une couleur ou une caméra peuvent alors être exposées comme propriétés, tandis que le modèle reste maintenu dans l’outil de conception. Pour découvrir l’approche globale, consultez la page d’accueil de GraphHub et ses ressources dédiées aux expériences immersives.

Concevoir une expérience agréable

La qualité perçue ne dépend pas uniquement du nombre de polygones. Une interaction lisible, une lumière cohérente et un temps de chargement maîtrisé ont souvent davantage d’impact qu’un modèle très détaillé.

Dans les interfaces de bien-être, de cosmétique ou de décoration, la 3D peut aussi accompagner un moment de découverte calme : rotation lente d’un objet, transitions douces et absence de mouvements brusques. Les contenus éditoriaux consacrés aux rituels de soin et à la relaxation, comme ceux publiés par Oceame, rappellent l’intérêt d’une expérience numérique qui respecte le rythme et l’attention de l’utilisateur.

Prévoyez toujours un mode de consultation alternatif. Une image fixe, une description textuelle et des contrôles clavier rendent l’expérience plus inclusive. Le mouvement automatique doit pouvoir être réduit, voire désactivé avec la préférence système prefers-reduced-motion.

Optimiser le rendu WebGL

Une scène qui fonctionne sur un ordinateur puissant peut ralentir sur un téléphone. Avant d’ajouter des effets avancés, mesurez le coût réel du rendu et surveillez la mémoire dédiée aux textures.

Pour des scènes plus complexes, une architecture de rastérisation hybride peut combiner rendu temps réel et images précalculées. Le ray-tracing reste pertinent pour certaines visualisations haut de gamme, mais il ne doit pas devenir une contrainte pour les appareils qui ne le prennent pas en charge.

Préparer un composant réellement exploitable

Un bon composant 3D ne devrait pas imposer son contexte à toute l’application. Exposez plutôt des propriétés comme modelUrl, accentColor, autoRotate ou onSelect. Vous pourrez ainsi l’utiliser dans un catalogue e-commerce, un dashboard ou un portfolio sans dupliquer la logique de scène.

Ajoutez également des états de chargement et d’erreur. Un utilisateur doit comprendre qu’un asset est en cours de téléchargement, et recevoir un contenu de remplacement si le WebGL est indisponible. Cette robustesse est essentielle dans un produit réel, tout comme la synchronisation entre les composants React, Vue ou Svelte et les outils de design.

À retenir

Afficher un objet 3D avec React devient accessible dès lors que les responsabilités sont bien séparées : React orchestre l’interface, React Three Fiber décrit la scène et Three.js communique avec WebGL. Commencez par une géométrie simple, contrôlez le cycle de vie, optimisez les assets, puis enrichissez progressivement l’interaction.

Cette méthode constitue une base solide pour construire des interfaces visuelles plus ambitieuses, qu’il s’agisse d’un configurateur produit, d’une visualisation de données ou d’une landing page immersive. Explorez l’accueil de graphhub.fr pour prolonger cette découverte avec des exemples techniques et des ressources de production.