Undervisning: Morphing & Sequenced Animations

Skap mesmerizing formtransformasjoner og koreograferte multi-element animasjoner.

Tid: 20 minutter Difficulty: Avansert

Hva du vil lage

En dynamisk rekkefølge der figurer morf inn i hverandre mens teksten avslører med stagneret timing.

Shape morfing med stagged tekst avsløre

Funksjoner dekket

  • Shape morfing — jevne overganger mellom forskjellige former
  • Staggered animasjoner — sekvensert timing for flere elementer
  • Fargeoverganger — Animerte gradientfargeendringer
  • Mask avslører — Cinematisk tørke og iris effekter
  • Koreograferte sekvenser — Nøyaktig tidsstyrt flerelementdans

Del 1: Form Morphing

Trinn 1: Opprett kildeform

  1. Opprett en sirkel i sentrum:
    • Radius: 80
    • Farge: #3b82f6 (blå)
    • Position: (400, 300)
const circle = app.create('circle', {
  x: 400, y: 300,
  radius: 80,
  color: '#3b82f6'
});

Trinn 2: Opprett målform

  1. Opprette en stjerne (vil være det morf målet):
    • Poeng: 5
    • Radius: 100
    • Farge: #f59e0b (abber)
    • Position: (400, 300)
const star = app.create('star', {
  x: 400, y: 300,
  points: 5,
  radius1: 100,
  radius2: 40,
  color: '#f59e0b'
});

Trinn 3: Legg til Morph Relation

morphs_to-forholdet skaper jevne formoverganger:

app.addRelation(circle.data.id, star.data.id, 'morphs_to', {
  duration: 1.5,
  easing: 'easeInOut',
  morphColor: true,   // Also transition colors
  morphSize: true     // Also transition size
});

Trinn 4: Kjede Multiple Morphs

Lag en morfing sekvens: sirkel → stjerne → trekant → sirkel

const shapes = [];

// Circle
shapes.push(app.create('circle', {
  x: 400, y: 300, radius: 80, color: '#3b82f6'
}));

// Star
shapes.push(app.create('star', {
  x: 400, y: 300, points: 5, radius1: 100, radius2: 40,
  color: '#f59e0b', opacity: 0
}));

// Triangle
shapes.push(app.create('triangle', {
  x: 400, y: 300, radius: 90,
  color: '#10b981', opacity: 0
}));

// Hexagon (back to geometric)
shapes.push(app.create('polygon', {
  x: 400, y: 300, sides: 6, radius: 85,
  color: '#8b5cf6', opacity: 0
}));

// Chain morphs with delays
for (let i = 0; i < shapes.length - 1; i++) {
  app.addRelation(shapes[i].data.id, shapes[i + 1].data.id, 'morphs_to', {
    duration: 1.2,
    delay: i * 1.5,  // Stagger start times
    easing: 'easeInOut',
    morphColor: true
  });
}

// Loop back to first shape
app.addRelation(shapes[shapes.length - 1].data.id, shapes[0].data.id, 'morphs_to', {
  duration: 1.2,
  delay: (shapes.length - 1) * 1.5,
  easing: 'easeInOut',
  morphColor: true
});

Del 2: Staggered tekst åpenbar

Trinn 5: Opprett brev kollage

const collage = app.letterCollage.create('TRANSFORM', {
  style: 'gradient',
  gradientPalette: 'cyberpunk',
  gradientDirection: 'horizontal',
  fontSize: 64,
  x: 400, y: 500
});

Trinn 6: Påfør Staggered Animation

app.letterCollage.applyStaggeredAnimation(collage.collageId, {
  effect: 'fadeSlideUp',
  staggerDelay: 0.06,    // 60ms between letters
  duration: 0.5,
  sequence: 'center',     // Start from center, expand outward
  easing: 'easeOut'
});

Sekvensmønster

Mønster Effekt
linear Venstre til høyre
reverse Høyre til venstre
center Senter utover
random Tilfeldig rekkefølge
wave Sinusbølgetid
fibonacci Naturlig rytme

Del 3: Maskeavsløringer

Trinn 7: Legg til dramatisk åpenbaring

Avsløre morfformen med iriseffekt:

// Apply animated mask to the shape container
app.applyAnimatedMask(shapes[0], 'iris', {
  startTime: 0,
  duration: 0.8,
  easing: 'easeOut'
});

Trinn 8: Tørkeavsløring for tekst

// Reveal text with horizontal wipe
app.applyAnimatedMask(collage.group, 'wipeLeft', {
  startTime: 0.5,  // Start after shape reveals
  duration: 0.6,
  easing: 'easeInOut'
});

Tilgjengelige maskeforhåndsinnstillinger

Forhåndsinnstilling Effekt
iris Sirkel som utvides fra sentrum
wipeLeft Horisontal avsløring fra venstre
wipeUp Vertikal avsløring fra bunnen
star Stjerneformen utvides
heart Hjerneform utvides
curtainHorizontal Åpnes fra sentrum
diagonalWipe Angled avslører

Del 4: Komplett koreografi

Full animasjonsskript

// === SETUP ===
app.setCanvasSize({ width: 800, height: 600 });
app.setBackgroundColor('#0f172a');

// === MORPHING SHAPES ===
const shapeColors = ['#3b82f6', '#f59e0b', '#10b981', '#8b5cf6'];
const shapeTypes = ['circle', 'star', 'triangle', 'polygon'];

const mainShape = app.create('circle', {
  x: 400, y: 250,
  radius: 80,
  color: shapeColors[0]
});

// Keyframe the shape through color transitions
app.addAnimation(mainShape.data.id, [
  { time: 0, properties: { fillColor: '#3b82f6', scale: 1 } },
  { time: 1.5, properties: { fillColor: '#f59e0b', scale: 1.2 }, easing: 'easeInOut' },
  { time: 3, properties: { fillColor: '#10b981', scale: 0.9 }, easing: 'easeInOut' },
  { time: 4.5, properties: { fillColor: '#8b5cf6', scale: 1.1 }, easing: 'easeInOut' },
  { time: 6, properties: { fillColor: '#3b82f6', scale: 1 }, easing: 'easeInOut' }
]);

// Add rotation for visual interest
app.addAnimation(mainShape.data.id, [
  { time: 0, properties: { rotation: 0 } },
  { time: 6, properties: { rotation: 360 }, easing: 'linear' }
]);

// === IRIS REVEAL FOR SHAPE ===
app.applyAnimatedMask(mainShape, 'iris', {
  startTime: 0,
  duration: 0.6,
  easing: 'easeOut'
});

// === STAGGERED TEXT ===
const title = app.letterCollage.create('TRANSFORM', {
  style: 'tile',
  palette: 'neon',
  fontSize: 56,
  x: 400, y: 480
});

app.letterCollage.applyStaggeredAnimation(title.collageId, {
  effect: 'popIn',
  staggerDelay: 0.05,
  duration: 0.4,
  sequence: 'center',
  easing: 'elastic'
});

// === ORBITING ACCENTS ===
const orbitColors = ['#f472b6', '#34d399', '#fbbf24'];
orbitColors.forEach((color, i) => {
  const dot = app.create('circle', {
    x: 400, y: 250,
    radius: 6,
    color: color
  });

  app.addRelation(dot.data.id, mainShape.data.id, 'orbits', {
    radius: 120 + i * 25,
    speed: 0.4 - i * 0.1,
    phase: i * (Math.PI * 2 / 3)
  });

  // Fade in the orbiting dots
  app.addAnimation(dot.data.id, [
    { time: 0.8 + i * 0.2, properties: { opacity: 0, scale: 0 } },
    { time: 1.2 + i * 0.2, properties: { opacity: 1, scale: 1 }, easing: 'elastic' }
  ]);
});

// === CAMERA MOVEMENT ===
app.addRelation('camera', null, 'camera_animates', {
  duration: 6,
  loop: true,
  keyframes: [
    { time: 0, zoom: 1, center: [400, 300] },
    { time: 1.5, zoom: 1.15, center: [400, 280], easing: 'easeOut' },
    { time: 3, zoom: 1.05, center: [400, 320], easing: 'easeInOut' },
    { time: 4.5, zoom: 1.1, center: [400, 300], easing: 'easeInOut' },
    { time: 6, zoom: 1, center: [400, 300], easing: 'easeOut' }
  ]
});

// === PLAY ===
app.playKeyframeTimeline(6, true);

Eksporter innstillinger

For beste resultat med morferende animasjoner:

Innstilling Verdi Grunn
Format WebM Beste kvalitet for gradienter
Rammerate 60 fps Smoother morfs
Varighet 6 sekunder Full loop syklus
Kvalitet Høy Bevar fargeoverganger

Pro Tips

Overlap timing — Start neste animasjon 0.1-0.2s før de forrige endene for sømløs flyt.

Bruk komplementære farger — Shape morfs ser best ut når overgangen mellom farger som fungerer godt sammen.

Sentrer sekvensen for slag - center stager mønsteret trekker oppmerksomhet til midten av teksten.

Match avslører til innhold — Bruk iris for sirkulære former, wipeLeft for tekst.


Variasjoner

Data Visualisering Morph

// Bar chart to pie chart transition
const bars = createBarChart(data);
const pie = createPieChart(data);

app.addRelation(bars.data.id, pie.data.id, 'morphs_to', {
  duration: 2,
  easing: 'easeInOut'
});

Logo Animation Sequence

// Logo parts appear in sequence
const logoParts = [shape1, shape2, shape3, text];

logoParts.forEach((part, i) => {
  app.addAnimation(part.data.id, [
    { time: i * 0.3, properties: { opacity: 0, scale: 0.5 } },
    { time: i * 0.3 + 0.4, properties: { opacity: 1, scale: 1 }, easing: 'elastic' }
  ]);
});

Neste trinn

  • Physics Animation — Bounce og elastiske effekter
  • Kart Animasjoner — Geografisk datahistorie
  • [Masking System] (/features/masking) - Avansert avsløringsteknikker