Bonjour !
Dans la leçon précédente, nous avons appris à créer des animations fluides et indépendantes de la performance de l'ordinateur en utilisant delta time. C'est une méthode puissante, mais qui peut vite devenir complexe lorsqu'on veut chorégraphier plusieurs animations à la suite : "d'abord, déplace cet objet, puis fais-lui faire une rotation, puis change sa couleur". Gérer cette logique dans la boucle de rendu animate demanderait un suivi d'état assez fastidieux.
Aujourd'hui, nous allons découvrir une solution beaucoup plus élégante et puissante. Cette leçon a pour objectif de vous apprendre à intégrer la librairie GSAP pour créer des animations complexes et contrôlées, en utilisant des "timelines" et des fonctions d'"easing".
GSAP (GreenSock Animation Platform) est le standard de l'industrie pour l'animation en JavaScript. En tant que développeur web, vous avez probablement déjà vu des sites web avec des animations d'interface très fluides et complexes ; beaucoup d'entre elles sont créées avec GSAP. Nous allons maintenant appliquer cette même puissance à nos objets 3D dans Three.js.

1. Qu'est-ce que GSAP et pourquoi l'utiliser ?
GSAP nous permet de décrire nos animations de manière déclarative. Au lieu de dire "à chaque image, ajoute un petit peu à la position de l'objet", nous dirons simplement "anime la position de cet objet jusqu'à la valeur X, en 2 secondes".
Les avantages sont considérables :
- Code plus lisible et maintenable : La description de l'animation est séparée de la logique de rendu.
- Contrôle total : Mettre en pause, reprendre, inverser, ou enchaîner des animations devient trivial.
- Séquençage facile : Créer des chorégraphies complexes avec les timelines.
- "Easing" avancé : Contrôler l'accélération et la décélération des animations pour un rendu plus naturel et dynamique (effets de rebond, d'élasticité, etc.).
2. Installation et concept de base : le "Tween"
Comme pour Three.js, nous allons installer GSAP via npm. C'est la méthode standard pour un projet moderne.
Dans votre terminal, à la racine de votre projet, lancez :npm install gsap
Ensuite, au début de votre fichier JavaScript, vous pouvez l'importer :
import gsap from 'gsap';
Le concept fondamental de GSAP est le "tween". Un tween est une animation unique qui fait passer une ou plusieurs propriétés d'un objet d'un état à un autre sur une durée définie.
La fonction la plus utilisée est gsap.to(). Sa syntaxe est : gsap.to(cible, { ...variables }).
cible: L'objet que l'on veut animer. Pour nous, ce sera une propriété de notreMesh, commecube.positionoucube.rotation.variables: Un objet JavaScript définissant les propriétés à animer et les paramètres de l'animation.
Exemple très simple :
// Déplace le cube sur l'axe X jusqu'à la position 2, en 1.5 secondes.
gsap.to(cube.position, { duration: 1.5, x: 2 });
Point crucial : Ce code ne va PAS dans la boucle animate(). On l'exécute une seule fois (par exemple, au chargement de la page ou au clic sur un bouton). GSAP gère sa propre boucle interne (ticker) pour mettre à jour les propriétés de l'objet à chaque frame. Votre boucle animate() continue simplement de faire le rendu de la scène avec renderer.render(scene, camera), qui affichera les valeurs mises à jour par GSAP.
Pour bien comprendre les bases, je vous propose de visionner les premières minutes de cette excellente vidéo en français.
Tuto | Les bases de l'animation avec GSAP en 10 minutes
Cette vidéo, "Tuto | Les bases de l'animation avec GSAP en 10 minutes" par front-end, est un excellent résumé des concepts fondamentaux. Regardez ces deux extraits pour maîtriser les tweens et leurs propriétés.
Regardez les deux sections suivantes : De 00:07 à 02:05 : Cette partie introduit les 4 méthodes de base (to, from, fromTo, set). De 03:40 à 05:20 : Cette section est très importante. Elle couvre les propriétés de contrôle comme duration, delay, repeat, yoyo et surtout ease, qui permet de donner du caractère à vos animations.
Comme vous l'avez vu, la propriété ease est particulièrement intéressante. Elle définit le "rythme" de l'animation. Au lieu d'une vitesse linéaire constante, vous pouvez avoir une accélération douce, un rebond à la fin, etc. GSAP fournit un visualiseur d'easing qui est un outil fantastique pour choisir l'effet désiré.
3. Le pouvoir des Timelines
Créer des tweens individuels, c'est bien, mais la véritable puissance de GSAP pour les animations complexes réside dans les timelines.
Imaginez que vous vouliez qu'un cube :
- Avance de 2 unités sur l'axe X (durée : 1s).
- Puis, fasse une rotation de 90° sur Y (durée : 1s).
- Puis, revienne à sa position d'origine (durée : 1s).
Sans timeline, vous devriez écrire :
// Approche SANS timeline : difficile à maintenir
gsap.to(cube.position, { duration: 1, x: 2 });
gsap.to(cube.rotation, { duration: 1, y: Math.PI / 2, delay: 1 }); // delay = durée de l'anim précédente
gsap.to(cube.position, { duration: 1, x: 0, delay: 2 }); // delay = durée des 2 anims précédentes
C'est fastidieux et fragile. Si vous changez la durée de la première animation, vous devez recalculer tous les delay suivants.
Une timeline est un conteneur qui vous permet d'enchaîner des tweens de manière séquentielle.
// Approche AVEC timeline : propre et flexible
const tl = gsap.timeline();
tl.to(cube.position, { duration: 1, x: 2 })
.to(cube.rotation, { duration: 1, y: Math.PI / 2 })
.to(cube.position, { duration: 1, x: 0 });
Le code est plus clair, et les animations se jouent les unes après les autres par défaut. C'est exactement ce dont nous avons besoin pour des "animations complexes et contrôlées".
Retournons à notre vidéo pour voir une démonstration pratique des timelines.
Tuto | Les bases de l'animation avec GSAP en 10 minutes
Cette dernière section de la vidéo montre comment construire une timeline pour séquencer plusieurs mouvements.
Regardez la section de 07:03 à 08:50, qui explique et met en pratique gsap.timeline().
Pour compléter, vous pouvez aussi parcourir rapidement ce document qui résume bien les concepts.
L'article "GSAP 3, les bases" de jenseign.com est une bonne référence textuelle. Il résume de manière concise ce que nous venons de voir.
Lisez rapidement les sections sur les fonctions de base (gsap.to, etc.) et surtout la partie "Animation complexe (timeline)" qui vous montre la syntaxe de création d'une timeline.
4. Atelier : Chorégraphier notre cube
Mettons tout cela en pratique ! Voici le code de base d'une scène avec un cube. Votre mission est de créer une animation complexe en utilisant une timeline GSAP.
Code de départ :
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
import gsap from 'gsap';
// Scène, Caméra, Renderer
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100);
camera.position.z = 5;
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// Contrôles
const controls = new OrbitControls(camera, renderer.domElement);
// Objet
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);
// ----- DÉBUT DE LA ZONE À MODIFIER -----
// Votre code GSAP vient ici !
// ----- FIN DE LA ZONE À MODIFIER -----
// Boucle de rendu (ne pas modifier)
function animate() {
requestAnimationFrame(animate);
controls.update();
renderer.render(scene, camera);
}
animate();
Votre mission :
Créez une timeline GSAP qui s'exécute au chargement de la page et qui effectue la séquence suivante sur le cube :
- Déplacement latéral : Déplacez le cube de 2 unités vers la droite en 1 seconde, avec un effet de rebond à la fin (
ease: 'bounce.out'). - Rotation : Ensuite, faites tourner le cube de 180 degrés ( radians) sur son axe Y en 1 seconde.
- Mise à l'échelle : Simultanément à la rotation, doublez sa taille (passez
scaleà 2 sur tous les axes) en utilisant la même durée de 1 seconde. - Retour : Enfin, remettez le
scaleà 1 et laposition.xà 0 en même temps, en 1 seconde.
Indice : Pour que deux animations (comme la rotation et la mise à l'échelle) se jouent en même temps dans une timeline, vous pouvez utiliser un paramètre de position spécial. tl.to(...).to(..., "<") indique que le deuxième to() doit démarrer en même temps (<) que le début de l'animation précédente.
Cliquez ici pour voir la solution
// ----- SOLUTION -----
const tl = gsap.timeline({ repeat: -1, yoyo: true, repeatDelay: 1 }); // La timeline se répètera en boucle
tl.to(cube.position, {
duration: 1,
x: 2,
ease: 'bounce.out'
})
.to(cube.rotation, {
duration: 1,
y: Math.PI
}, "<") // Démarre en même temps que l'animation précédente
.to(cube.scale, {
duration: 1,
x: 2,
y: 2,
z: 2
}, "<") // Démarre aussi en même temps
.to(cube.scale, {
duration: 1,
x: 1,
y: 1,
z: 1,
})
.to(cube.position, {
duration: 1,
x: 0,
}, "<"); // Le retour à la position 0 se fait en même temps que le retour à l'échelle 1
// ----- FIN DE LA SOLUTION -----
Analyse de la solution :
- Nous créons une
timelineet y enchaînons nos animations avec la syntaxe.(chaining). - L'effet de rebond est appliqué avec
ease: 'bounce.out'. - Le paramètre de position
"<"est utilisé pour faire démarrer la rotation et la mise à l'échelle en même temps. Il est réutilisé pour la phase de retour. - J'ai ajouté des options
repeat: -1etyoyo: trueà la timeline elle-même pour qu'elle se répète à l'infini en faisant l'aller-retour, ce qui est très pratique pour le débogage.
Conclusion
Félicitations ! Vous avez fait un grand pas en passant des animations manuelles dans la boucle de rendu à des animations déclaratives et contrôlées avec GSAP. C'est une compétence extrêmement précieuse dans le développement web moderne, que ce soit en 2D ou en 3D.
Les points clés à retenir :
- GSAP est une librairie spécialisée pour créer des animations performantes et complexes.
- Un
tween(gsap.to()) est une animation unique sur un objet. Il s'écrit en dehors de la boucleanimate. - La propriété
easeest essentielle pour donner un rendu naturel et stylé à vos animations. - Une
timeline(gsap.timeline()) est l'outil ultime pour séquencer et contrôler des chorégraphies d'animations.
Aperçu de la prochaine leçon :
Nous avons bien exploré les bases de Three.js de manière "impérative" (en donnant des ordres : "crée une scène", "ajoute un cube", "anime-le"). Dans le prochain module, nous allons entrer dans le monde de React Three Fiber (R3F). Vous découvrirez comment décrire une scène 3D de manière déclarative avec des composants React, ce qui s'aligne parfaitement avec votre expérience de développeur web et la philosophie que nous venons de voir avec GSAP. La première étape sera d'initialiser une application R3F avec le composant <Canvas>. Préparez-vous, c'est un changement de paradigme très puissant