← The Power of SVG · prototype pĂ©dagogique

Morphing de formes avec Flubber.js

Deux formes extrĂȘmes, une seule interpolation. Flubber calcule automatiquement les Ă©tats intermĂ©diaires entre shapeA et shapeB — mĂȘme si les tracĂ©s n'ont ni le mĂȘme nombre de points, ni la mĂȘme structure. Testez les quatre façons de piloter la valeur t ci-dessous.

déplacez le curseur horizontalement

Le survol horizontal de la zone pilote directement la forme.

vitesse
t = 0.000

Comment ça marche

flubber.interpolate() prend deux tracĂ©s SVG (deux path d="...") et renvoie une fonction : on lui passe un nombre entre 0 et 1, elle renvoie le tracĂ© intermĂ©diaire correspondant. Tout le travail — triangulation, correspondance des points, gestion des formes de complexitĂ© diffĂ©rente — se fait sous le capot. Ensuite, n'importe quel type d'entrĂ©e (souris, drag, slider, boucle d'animation) peut piloter cette mĂȘme valeur t.

voir le code essentiel
// 1. deux formes extrĂȘmes, en tant que chaĂźnes "d" de path SVG
const shapeA = "M200,55 C275,55 345,100..."; // le blob
const shapeB = "M200,50 L235,151 L342,153..."; // l'étoile

// 2. Flubber construit l'interpolateur une seule fois
const interpolator = flubber.interpolate(shapeA, shapeB, {
  maxSegmentLength: 2 // plus la valeur est basse, plus c'est lisse
});

// 3. n'importe quel input peut piloter t (0 Ă  1)
function setT(t) {
  path.setAttribute("d", interpolator(t));
}

// exemple : le curseur pilote t
stage.addEventListener("mousemove", (e) => {
  const rect = stage.getBoundingClientRect();
  const t = (e.clientX - rect.left) / rect.width;
  setT(Math.min(1, Math.max(0, t)));
});

Pour l'atelier : remplacez shapeA et shapeB par les deux extrĂȘmes de votre propre illustration (exportĂ©es en SVG depuis Figma ou Illustrator). Contrairement Ă  une interpolation classique de points d'ancrage, Flubber n'exige pas que les deux tracĂ©s aient la mĂȘme structure — c'est ce qui le rend beaucoup plus rapide Ă  prendre en main qu'une vraie police variable pour prototyper l'idĂ©e.