Créer une Animation de Boids Sensible à la Profondeur avec React : Flocking avec Style (et Parallaxe !)
Bienvenue, ornithologues numériques et développeurs React curieux ! 🪶 Aujourd'hui, nous allons plonger avec plaisir et profondeur dans la création d’une animation de Boids sensible à la profondeur et à la vitesse parallaxe en utilisant React et Framer Motion. Ce n’est pas la soupe de boids habituelle sur <canvas>
— cette volée est vivante, réactive au toucher, et parfaitement intégrée à votre prochain projet React moderne.
Cet article s’adresse aux développeurs qui adorent les animations, recherchent de l’interactivité, ou souhaitent simplement que leur page d’accueil murmure : « Ouais, je sais coder. »
Que sont les Boids ?
Les Boids sont de petits agents simulés inventés par Craig Reynolds en 1986 pour reproduire le mouvement des oiseaux, poissons et autres groupes mobiles. La magie vient de trois règles :
- Séparation : Ne vous entassez pas avec vos voisins.
- Alignement : Volez dans la même direction que vos amis.
- Cohésion : Restez proche du groupe.
Le résultat ? Un comportement d’essaim émergent et réaliste, adoré par les codeurs créatifs du monde entier.

Pourquoi React pour les Boids ?
Traditionnellement, les simulations de boids s’exécutent dans un <canvas>
ou WebGL. Mais avec les interfaces utilisateurs d’aujourd’hui et des outils comme Framer Motion, nous pouvons animer efficacement des nœuds DOM tout en obtenant une intégration facile à React, de l’interactivité, et même des effets liés au scroll en bonus.
Conseil SEO : Cette approche est idéale pour les sites et applications où le SEO et l’accessibilité comptent — plus besoin de cacher vos plus belles animations dans un
<canvas>
inaccessible !
Structure du composant
Nous encapsulons notre logique de vol en groupe dans un seul composant React, <FlockingAnimation />
. Le code est modulaire et personnalisable via des props, supportant :
- Taille de la volée (calculée automatiquement ou fixe)
- Vitesse et force maximales
- Poids des règles
- Classes personnalisées pour un stylage facile
Props :
export type Props = {
className?: string;
initialCount?: number;
maxSpeed?: number;
maxForce?: number;
weights?: Partial<Weights>;
};
Comportements des Boids : L’algorithme
Chaque Boid est une instance de classe, conservant sa position, sa vélocité, son accélération et — surtout — sa profondeur pour gérer la parallaxe.
La logique centrale imite le comportement de vol réel :
flock(boids, weights, maxSpeed, maxForce) {
// 1. Calculer les vecteurs séparation, alignement, cohésion
// 2. Les pondérer et les sommer
// 3. Appliquer à l’accélération
// 4. Limiter l’accélération à maxForce
}
Chaque règle examine les boids voisins dans un certain rayon et calcule un vecteur de direction :
- Séparation : Repousse les boids trop proches.
- Alignement : Moyenne les vitesses pour correspondre à la direction.
- Cohésion : Oriente vers la position moyenne.
Profondeur et Parallaxe : Ajouter l’effet Wahou
Chaque boid reçoit une profondeur aléatoire (entre 0 et 1) à sa création. La profondeur impacte trois aspects :
- Vitesse parallaxe : Les boids éloignés bougent plus lentement, les plus proches plus vite.
- Échelle : Les boids au premier plan sont plus grands.
- Opacité : Les boids en arrière-plan sont atténués, les plus proches sont éclatants.
Cela s’applique dans la boucle de mise à jour :
const speedFactor = 1 + (1 - this.depth) * PARALLAX_FACTOR;
const dtScalar = dtBase * speedFactor;
Lors du rendu, chaque boid voit son échelle et son opacité mappées à sa profondeur, donnant à l’essaimage un aspect réellement 3D. Toute l’immersion de la VR, sans les maux de tête.
Rendre cela réactif (et amusant !)
- Fondu basé sur le scroll : Avec
useScroll()
etuseTransform()
, l’animation s’estompe lors du défilement, pour ne jamais être envahissante. - Interaction au pointeur : Glissez avec votre souris ou doigt, et vous créez un nouveau boid à la position du curseur. Parce que qui ne veut pas être le Maître de la Volée ?
- Distribution aléatoire du groupe : Au montage, des groupes de boids apparaissent autour de centres aléatoires, s’étalant naturellement.
Exemple d’apparition des boids :
for (let j = 0; j < groupSize; j++) {
const ang = Math.random() * Math.PI * 2;
const rad = Math.random() * SPAWN_RADIUS;
boidsRef.current.push(
new Boid(center.x + Math.cos(ang) * rad, center.y + Math.sin(ang) * rad)
);
}
Optimisations et conseils pour développeurs
- Rendu conscient de la visibilité : Un Intersection Observer met en pause les mises à jour lorsque le composant n’est pas visible, économisant cycles CPU et batterie pour vos utilisateurs mobiles (ou les ventilateurs de votre ordinateur portable).
- Mises à jour d’état efficaces : L’état React est modifié uniquement quand nécessaire, minimisant les rendus.
- Valeurs motion : En utilisant
motionValue
et<motion.div>
s animés de Framer Motion, nous obtenons des transformations DOM fluides comme du beurre.
Code source complet
Retrouvez le code complet prêt à brancher ci-dessous ! (Pensez juste à configurer Framer Motion et Tailwind CSS.)
Conclusion
Créer des boids en essaim avec React peut sembler un choix atypique, mais avec les bibliothèques d’animation modernes, vous obtenez interactivité, performances, et cette précieuse expérience développeur — tout simplement.