Tutorial: Morphing & Sequenced Animations

Skapa mesmerizing form transformationer och koreograferade multi-element animationer.

Tid: 20 minuter Svårighet:* Avancerad

Vad du skapar

En dynamisk sekvens där formar morph i varandra medan texten avslöjar med staggered timing.

Shape morphing med staggered text avslöja

Funktioner täckta

  • Shape morphing – Smidig övergång mellan olika former
  • Staggered animationer* - Sequenced timing för flera element
  • Färgövergångar - Animerad gradient färgförändringar
  • Mask avslöjar - filmisk torka och iriseffekter
  • Koreograferade sekvenser – Justerat multielementsdans

Del 1: Shape Morphing

Steg 1: Skapa källform

  1. Skapa en cirkel i mitten:
    • Radius: 80*******************************************************************************************************************************************************************************************************************************************************
    • Färg: #3b82f6 (blå)
    • Position: (400, 300)
const circle = app.create('circle', {
  x: 400, y: 300,
  radius: 80,
  color: '#3b82f6'
});

Steg 2: Skapa målform

  1. Skapa en stjärna (kommer att vara morfmålet):
    • Poäng: 5**
    • Radius: 100*******************************************************************************************************************************************************************************************************************************************************
    • Färg: #f59e0b (amber)
    • Position: (400, 300)
const star = app.create('star', {
  x: 400, y: 300,
  points: 5,
  radius1: 100,
  radius2: 40,
  color: '#f59e0b'
});

Steg 3: Lägg till Morph Relation

morphs_to-relationen skapar smidiga formövergångar:

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
});

Steg 4: Chain Multiple Morphs

Skapa en morphing-sekvens: Circle → Star → Triangle

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 Text Reveal

Steg 5: Skapa brev collage

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

Steg 6: Applicera 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 Vänster till höger
reverse Höger till vänster
center Center utåt
random Random order
wave Sine våg timing
fibonacci Naturlig rytm

Del 3: Mask avslöjanden

Steg 7: Lägg till dramatisk avslöjande

Avslöja morphing form med en iris effekt:

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

Steg 8: Wipe Reveal för text

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

Tillgängliga Mask Presets

Preset Effekt
iris Circle expanderar från centrum
wipeLeft Horizontal avslöja från vänster
wipeUp Vertikalt avslöjande från botten
star Star shape expanding
heart Hjärtform expanderar
curtainHorizontal Öppnar från centrum
diagonalWipe Angled avslöja

Del 4: Fullständig koreografi

Full animation Script

// === 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);

Exportinställningar

För bästa resultat med morphing animationer:

Inställning Värde Reason
Format WebM Bästa kvalitet för gradienter
Frame Rate 60 fps Smoother morphs
Varaktighet 6 sekunder Full loop cykel
Kvalitet kvalitet Hög Bevara färgövergångar

Pro Tips

Overlap timing - Starta nästa animation 0,1-0,2 innan föregående ändar för sömlöst flöde.

Använd kompletterande färger* Formmorphs ser bäst ut när övergången mellan färger som fungerar bra tillsammans.

Center sequence for impact* – center stagger mönster uppmärksammar mitt i texten.

Match avslöjar innehåll - Använd iris för cirkulära former, wipeLeft för text.


Variationer

Data Visualization 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' }
  ]);
});

Nästa steg

  • [Fysik Animation] (/tutorials/physics-animation) - Bounce och elastiska effekter
  • [Map Animations] (/tutorials/map-animation) - Geografisk databerättelse
  • Masking System - Avancerad avslöja tekniker