Publié le 18 septembre 2024

Créer des expériences immersives en 3D avec Three.js : Guide Complet

Le développement d'expériences 3D sur le web a considérablement évolué avec l'introduction de bibliothèques comme Three.js. Pour les développeurs souhaitant intégrer des graphiques 3D dans des navigateurs sans avoir à maîtriser les complexités de WebGL, Three.js s'est rapidement imposé comme une solution puissante, polyvalente et accessible. Cet article vous guidera à travers les fonctionnalités essentielles de Three.js, sa mise en œuvre, et la manière dont il transforme le développement 3D sur le web.

Histoire et Contexte

Three.js est une bibliothèque JavaScript créée en 2010 par Ricardo Cabello, également connu sous le pseudonyme "Mr.doob". Son objectif était de simplifier l'utilisation de WebGL, l'API graphique de bas niveau utilisée pour rendre des contenus 3D dans les navigateurs. Bien que WebGL soit extrêmement puissant, il peut être difficile à utiliser pour les développeurs novices ou ceux qui veulent des résultats rapides sans gérer directement les shaders et les buffers complexes. Three.js encapsule ces difficultés en une interface de plus haut niveau, permettant aux développeurs de créer des scènes 3D avec beaucoup moins de code et de complexité.

Fonctionnement de Three.js

Three.js permet de créer des scènes 3D interactives en combinant trois éléments fondamentaux : une scèneune caméra, et un moteur de rendu. Ces éléments forment la base sur laquelle toute expérience 3D est construite. En plus de ces éléments de base, Three.js propose également des fonctionnalités pour ajouter des objets 3D, des lumières, des matériaux et des textures afin d'obtenir des rendus réalistes.

Voici un résumé du fonctionnement de base de Three.js :

  1. Création d'une scène : La scène est l'espace virtuel où vous allez placer tous vos objets 3D.
  2. Ajout d'une caméra : La caméra détermine ce que l'utilisateur verra. Il existe plusieurs types de caméras dans Three.js (caméra perspective, caméra orthographique).
  3. Moteur de rendu : Le moteur de rendu (généralement WebGLRenderer) est responsable de prendre les informations de la scène et de la caméra et de les afficher sur l'écran.

WebGL vs Three.js

WebGL est une API bas-niveau qui permet de rendre des graphismes 3D dans un navigateur. Cependant, son utilisation requiert une bonne compréhension des concepts graphiques complexes, tels que la gestion de la mémoire graphique et les shaders. À l'inverse, Three.js agit comme une surcouche à WebGL, simplifiant le processus de création de scènes 3D. Cela permet aux développeurs de se concentrer sur l’aspect créatif plutôt que sur les aspects techniques de la gestion des graphismes.

En résumé, Three.js offre les avantages suivants par rapport à WebGL brut :

  • Moins de code à écrire pour obtenir des résultats convaincants.
  • Une gestion simplifiée des objets 3D.
  • Une communauté active avec de nombreux exemples et tutoriels.

Les Fondamentaux de Three.js

Les trois composants principaux d'une scène Three.js sont la scène, la caméra, et le moteur de rendu.

  1. La scène : Il s'agit de l'espace 3D virtuel où les objets (cubes, sphères, etc.) sont placés. Vous pouvez y ajouter des objets 3D, des lumières, et d'autres éléments.
  2. La caméra : Elle détermine l'angle de vue de la scène. Vous pouvez configurer différentes caméras selon vos besoins : des caméras de perspective pour un rendu réaliste ou des caméras orthographiques pour un rendu sans distorsion.
  3. Le moteur de rendu : Le moteur prend la scène et la caméra et les affiche à l'écran.

Scène (Scene)

Une scène dans Three.js est comme une scène de théâtre où tous les objets et éléments visuels sont positionnés. Dans une scène, vous pouvez ajouter divers objets, tels que des maillages (mesh), qui sont des représentations 3D d'objets, ainsi que des lumières et des caméras.

Par exemple, pour créer une simple scène dans Three.js, voici le code de base :

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

Caméras dans Three.js

Il existe différents types de caméras dans Three.js, mais les deux plus couramment utilisées sont :

  1. Caméra de perspective : Cette caméra imite la façon dont l'œil humain voit le monde. Elle est utilisée dans la plupart des scènes 3D réalistes.Exemple d'utilisation :

const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.z = 5;

  1. Caméra orthographique : Cette caméra élimine la distorsion de perspective et est utile pour les rendus techniques ou les jeux en 2D.

Les Lumières (Lights)

Dans Three.js, la lumière est un élément crucial pour rendre une scène 3D réaliste. Voici quelques types de lumières fréquemment utilisées :

  1. Lumière directionnelle : Elle simule une source de lumière infiniment éloignée, comme le soleil.
  2. Lumière ponctuelle : Simule une source de lumière émettant dans toutes les directions, telle qu'une ampoule.
  3. Lumière ambiante : Elle éclaire uniformément toutes les parties de la scène, sans créer d'ombres.

Matériaux et Textures

Pour rendre vos objets plus réalistes, vous pouvez appliquer des matériaux et des textures. Les matériaux déterminent la façon dont un objet réagit à la lumière, tandis que les textures ajoutent des détails visuels en appliquant des images sur les surfaces des objets.

Voici un exemple d'application de matériau sur un objet :

const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

Les Objets 3D (Mesh)

Un maillage (mesh) est la combinaison d'une géométrie (la forme de l'objet) et d'un matériau (son apparence). Dans Three.js, vous pouvez créer différents types d'objets 3D basiques comme des cubes, des sphères, des cylindres, et bien d'autres. Ces objets sont rendus en trois dimensions et peuvent être manipulés, animés, et texturés.

Voici un exemple de création d’un cube simple :

const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

Dans cet exemple, BoxGeometry définit un cube de taille 1x1x1, et MeshBasicMaterial colore ce cube en vert. Une fois que le maillage est créé, il est ajouté à la scène avec la méthode scene.add().

Animations dans Three.js

Une des grandes forces de Three.js est la possibilité de créer des animations fluides et interactives en 3D. Grâce à sa fonction de boucle de rendu, vous pouvez mettre à jour les éléments d'une scène à chaque image, ce qui permet d'animer des objets. Une animation typique dans Three.js implique des transformations d'objets (comme la rotation ou la translation) au fil du temps.

Exemple simple d'animation d'un cube qui tourne 

function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();

Dans cet exemple, la fonction animate() est appelée à chaque image grâce à la méthode requestAnimationFrame(). Le cube tourne continuellement autour des axes X et Y, créant un effet d'animation.

Interactivité avec Three.js

Three.js permet non seulement de créer des scènes 3D statiques, mais aussi de les rendre interactives. Vous pouvez ajouter des événements tels que les clics de souris, les survols, ou même des interactions avec le clavier pour rendre l'expérience utilisateur plus engageante.

L’interaction de base passe souvent par l’utilisation de Raycaster, qui permet de détecter les objets avec lesquels l’utilisateur interagit dans la scène.

Voici un exemple de détection d'un clic sur un objet :

const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();

window.addEventListener('click', (event) => {
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

raycaster.setFromCamera(mouse, camera);
const intersects = raycaster.intersectObjects(scene.children);

if (intersects.length > 0) {
intersects[0].object.material.color.set(0xff0000);
}
});

Dans cet exemple, chaque fois que l'utilisateur clique, un rayon est projeté depuis la caméra vers la scène pour détecter les objets sur lesquels la souris survole. Si un objet est détecté, sa couleur change.

Importation de Modèles 3D

Three.js permet également d'importer des modèles 3D complexes créés dans des logiciels comme Blender, Maya, ou 3ds Max. Les formats couramment utilisés incluent GLTFOBJ, et FBX. L'un des formats les plus populaires pour les projets Web est le GLTF, car il est optimisé pour la diffusion en ligne.

Voici un exemple d'importation d'un modèle GLTF dans une scène Three.js :

const loader = new THREE.GLTFLoader();

loader.load('path/to/model.gltf', (gltf) => {
scene.add(gltf.scene);
}, undefined, (error) => {
console.error('An error occurred while loading the model:', error);
});

Avec cette méthode, il est possible d'incorporer des personnages, des véhicules, ou des environnements entiers dans une scène Three.js pour des applications plus complexes comme des jeux ou des visualisations architecturales.

Performance et Optimisation

Les scènes 3D peuvent devenir très gourmandes en ressources, notamment en termes de GPU (processeur graphique). Three.js offre plusieurs techniques pour optimiser les performances :

  1. Réduction du nombre de polygones : Utilisez des géométries avec un nombre de polygones réduit, particulièrement pour les objets qui ne nécessitent pas beaucoup de détails.
  2. Mise en cache des textures : Réduisez la taille et la résolution des textures, et utilisez des formats de texture compressés.
  3. Occlusion et culling : Activez le frustum culling pour que les objets en dehors du champ de vision de la caméra ne soient pas rendus.
  4. Lod (Level of Detail) : Implémentez des niveaux de détail, où des objets éloignés utilisent des géométries plus simples que ceux plus proches.

Exemples d'Utilisation Réelle

Three.js est utilisé dans de nombreux projets commerciaux et open source pour créer des jeux, des visualisations de données, des tours virtuels, et bien plus encore. Voici quelques exemples d'applications populaires développées avec Three.js :

  1. Google Art & Culture : Google utilise Three.js pour rendre des modèles 3D d'œuvres d'art et d'objets historiques, permettant aux utilisateurs de les explorer en détail.
  2. Sketchfab : Une plateforme pour publier, partager et découvrir des modèles 3D interactifs, largement basée sur Three.js.
  3. NASA : Utilise Three.js pour des visualisations spatiales interactives, permettant aux utilisateurs de visualiser des sondes spatiales et d'autres objets en 3D.

Travail Réel avec Three.js

Chez S3D ENGINEERING, nous travaillons régulièrement avec Three.js pour développer des projets en 3D de haute qualité. Notre équipe d'experts maîtrise l'ensemble des aspects techniques de Three.js, que ce soit la création de scènes complexes, l'importation de modèles 3D, ou l'optimisation des performances pour garantir une expérience fluide sur le web.

Nous avons développé plusieurs projets allant des visualisations interactives pour des clients industriels, des applications éducatives en 3D, aux applications web immersives. Notre expertise en Three.js nous permet de créer des expériences utilisateur uniques et engageantes qui répondent aux besoins spécifiques de chaque projet.

Que vous ayez besoin d'un simple visualiseur 3D ou d'une expérience immersive complète, nous pouvons vous aider à réaliser vos idées avec Three.js.


Synthèse

Three.js a révolutionné le développement 3D sur le web en simplifiant l'accès à WebGL et en rendant possible la création d'expériences interactives immersives sans une connaissance approfondie des langages bas-niveau de rendu graphique. Avec des fonctionnalités robustes telles que la gestion des caméras, des lumières, des matériaux, et des animations, ainsi que des capacités d'importation de modèles 3D, Three.js continue de faciliter la création de projets 3D de haute qualité.

Nous travaillons régulièrement avec Three.js pour développer des applications visuelles innovantes et performantes, et nous sommes prêts à vous accompagner dans la réalisation de vos projets 3D sur le web.