Creative
Coding
Three.js
2025 - 2026
La troisième dimension
Comment ?
On sait déjà comment manipuler des pixels dans un context en 2D :
const canvas = document.createElement( 'canvas' ),
ctx = canvas.getContext( '2d' );
Mais si on se voulait du mal, on pourrait utiliser un contexte 3D:
const ctx = canvas.getContext( 'webgl2' );
Contrairement à un contexte en 2D, coder dans un contexte en 3D peut être très compliqué sans notions approfondies de WebGL et GLSL.
Three.js
Over here, stranger !
Three.js est une librairie complexe, c'est pourquoi je vous recommande de faire de ces liens vos nouveaux meilleurs amis:
Se tenir à jour
Cette librairie évolue constamment, il est toujours bon de savoir où regarder pour voir les derniers changements.
Hello³
Prérequis
- Moteur de rendu
- Au moins une caméra
- Une scene
- Un objet 3d
- Du courage (ça va bien se passer)
Installation
Il existe plusieurs façon d'importer three.js à votre projet, mais cela dépend en partie de votre workflow. La recommandation est de passer par un import depuis npm, et d'utiliser un bundler (webpack, esbuild, rollup, etc.).
Codepen
Pour nous faciliter la tâche on va commencer sur codepen, nous reviendrons sur l'installation pour le projet ultérieurement.
WebGL Renderer
La première étape est de mettre en place le moteur de rendu. Ce dernier calculera comment afficher nos objets en 3D. Par défaut il crée une balise canvas, mais on peut aussi lui en fournir une existante pour plus de flexibilité.
const myCanvas = document.querySelector( '.my-canvas' ),
renderer = new THREE.WebGLRenderer( { canvas: myCanvas } );
Camera
Sans caméra pas de rendu. Il existe plusieurs types de caméras, la plus utilisée et celle qui se rapproche le plus de l'œil humain: la PerspectiveCamera.
Perspective Camera
const camera = new THREE.PerspectiveCamera( verticalFov, aspectRatio, near, far );
Scene
Il nous manque un endroit où placer nos objets 3D: une Scene.
Avec la méthode add on va pouvoir y ajouter nos éléments (objets 3d, cameras, lumières, etc.).
const scene = new THREE.Scene();
scene.add( camera );
Coordonnées
Par défaut, chaque élément créé (camera, objet 3D, etc.) se positionne au centre d'une scene (x: 0, y: 0, z :0). Les valeurs n'ont pas d'unité, c'est à vous de créer une échelle de valeur de sorte que votre scene soit crédible.
Premier rendu
Pour lancer un rendu de votre scene, il faut appeler la méthode render de notre renderer. Il faut lui passer 2 arguments: la scene à rendre et la caméra active.
renderer.render( scene, camera );
Le fond noir prouve que notre setup fonctionne. Pour le moment, la caméra ne voir rien à afficher et donc afficher la couleur de fond par défaut.
Mesh
Un objet en 3d est appelé Mesh, il est composé d'une forme (geometry) et d'une apparence (material).
Geometry
Créons un cube de taille 1 avec la méthode BoxGeometry:
const geometrie = new THREE.BoxGeometry( 1, 1, 1 );
Material
Avec la méthode MeshBasicMaterial nous pouvons définir une apparence simple et sans gestion de lumière pour notre géométrie:
const material = new THREE.MeshBasicMaterial(
{
color: 'gold'
// Si true, permet de voir uniquement
// les arêtes de notre forme.
wireframe: false
}
);
Fuuuuuusion
Une fois qu'on a défini la forme et l'aspect de notre objet, nous allons les combiner pour lui donner vie avec la méthode Mesh.
const geomtry = […],
material = […],
mesh = new THREE.Mesh( geometry, material );
// on ajoute notre objet dans la scene
scene.add( mesh );
Une dernière chose: notre camera se situe en {x:0, y: 0, z: 0}, comme notre cube. Reculons là pour enfin voir quelque chose.
camera.position.z = 5;
Your turn
Lights &
Materials
Les lumières et les matériaux sont liés et interagissent entre eux. Pour l'instant ne n'avons pas eu besoin d'une source lumineuse pour voir notre materiel car MeshBasicMaterial affiche une couleur en aplat quoi qu'il arrive.
Ce materiel est donc très performant, mais très limité en terme de rendu. Il est pratique pour définir les positions de vos éléments ou pour faire du debugging.Lumière d'ambiance
Illuminons uniformémemnt notre scene avec une lumière globale: AmbientLight. Il y a 2 arguments, le premier pour la couleur et le second pour l'intensité (0 > 1+).
const globalLight = new THREE.AmbientLight( 0xffffff, 0.5 );
scene.add( globalLight );
Cette lumière n'a pas de direction et donc ne projette pas d'ombre dans votre scene.
Matériel réfléchissant
Pour que des lumières puissent avoir un impact sur notre scene, il faut des objets avec des surfaces réfléchissantes.
MeshPhongMaterial est un bon compromis entre réalisme et performance.
const material = new THREE.MeshPhongMaterial( {
color: 'gold',
});
Lumière directionnelle
DirectionalLight est souvent utilisé pour imité la lumière venant du soleil, car elle projette des rayons de lumières parallèles. Comme l'AmbientLight, il y a 2 arguments: la couleur et l'intensité.
const sunLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
scene.add( sunLight );
Light helper
DirectionalLightHelper permet de visualiser une lumière directionnel. Pour cela il suffit de lui passer une lumière et d'ensuite l'ajouter à la scene.
const sunLightHelper = new THREE.DirectionalLightHelper( sunLight );
scene.add( sunLightHelper );
Textures
Chargement
Avant de pouvoir utiliser une image (= texture) il faut la charger et la passer dans un matériel. Cela se fait en modifiant la propriété map de notre matériel.
const material = new THREE.MeshBasicMaterial( { color: "red" } );
const loadTexture = () => {
const loader = new THREE.TextureLoader();
loader.load( 'path/to/image.jpg', ( texture ) => {
material.map = texture;
} );
};
Texture & lumière
En remplaçant notre MeshBasicMaterial par un MeshPhongMaterial on pourra jouer avec la lumière et notre texture.
Bump &
displacement map
En utilisant la même image en noir et blanc, nous pouvons donner l'illusion de profondeur dans notre objet texture. Le bump donne l'illusion de texture via la lumière, tandis que le displacement map permet de déformer notre objet physiquement.
Matcap
M pour Magic (c'est faux, mais presque)
Three.js peut être très gourmant en perfomance. Surtout si on veut avoir un rendu réaliste (réflexion de la lumière, effet métallique, raytracing, etc.).
MeshStandardMaterial est un matériel conçu pour se rapprocher d'un rendu photo-réalistique mais qui a un coût.
À moins d'avoir une carte graphique dédiée à ce type de rendu, vous allez vite mettre à genoux la plus part des machines.
Une texture intelligente
MeshMatcapMaterial est un matériel spécial, il embarque une texture contenant de multiples informations pré-calculées.
Workout