Tutorial: Animasi Morfing & Terurut

Buatlah transformasi bentuk yang memukau dan mengkoreograferkan animasi multi-elemen.

*Waktu: 20 menit Difficulty: Lanjutan

Apa yang Akan Anda Ciptakan

Urutan dinamis di mana bentuk berubah menjadi satu sama lain sementara teks mengungkapkan dengan waktu mengejutkan.

Shape berubah-ubah dengan penyingkapan teks tersengat

Fitur - Fitur yang Tertutup

  • Berbentuk shape — Peralihan halus antara bentuk yang berbeda
  • *Animasi berperingkat — Waktu terurut untuk beberapa unsur
  • *Color transisis — Animasikan perubahan warna gradien
  • *Mask ungkap — Hapus dan efek iris dan cinematik
  • Urutan yang diaransemen — tepat waktu tarian multi-elemen

Bagian 1: Bentuk Morfing

Langkah 1: Cipta Bentuk Sumber

  1. Buat lingkaran di tengah:
    • 80
    • Warna: #3b82f6 (biru)
    • Position: (400, 300)
const circle = app.create('circle', {
  x: 400, y: 300,
  radius: 80,
  color: '#3b82f6'
});

Langkah ke - 2: Wujudkan Bentuk Target

  1. Buat sebuah bintang (akan menjadi target morfologi):
    • 5
    • 100
    • Warna: #f59e0b (amber)
    • Position: (400, 300)
const star = app.create('star', {
  x: 400, y: 300,
  points: 5,
  radius1: 100,
  radius2: 40,
  color: '#f59e0b'
});

Langkah 3: Tambah Hubungan Morf

Hubungan morphs_to menciptakan transisi bentuk halus:

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

Langkah 4: Rantai Multi Morf

→ Bintang → Segitiga → Lingkaran

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

Pengungkapan Teks Tertagger

Langkah 5: Cipta Kumpul Surat

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

Langkah 6: Terapkan Animasi Tertantang

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

Pola Jujukan

Corak Kesan
linear Kiri ke kanan
reverse Kanan ke kiri
center Pusat Pusat outward
random Urutan Rawak
wave Sinus sinus waktu gelombang
fibonacci Hiasan alami

[ Gambar di hlm

Langkah 7: Tambahkan Pengungkapan Dramatis

Tunjukkan bentuk yang berubah dengan efek iris:

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

Langkah ke - 8 : Bersihkan Penampakan untuk Teks

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

Praset Topeng Ada padanya

Preset Kesan
iris Kisaran lingkaran dari tengah
wipeLeft Pengungkapan horizontal dari kiri
wipeUp Pengungkapan vertikal dari bawah
star Bentuk bintang mengembang
heart Perkembangan bentuk hati
curtainHorizontal Buka dari tengah
diagonalWipe Tersingkap secara bersudut

Bagian 4: Koreografi Lengkap

Skrip Animasi Penuh

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

Seting Eksport

Untuk hasil terbaik dengan animasi berubah:

Meratakan Nilai Alasan
Format WebM Kualitas terbaik untuk gradien
Frame Rate 60 fps Morphs pelicin bermover
Durasi 6 detik Siklus lingkaran penuh
Kualitas Yahmon SMA Kekalkan transisi warna

Tips Pro

******** — Mulai animasi berikutnya 0.1-0.2s sebelum ujung sebelumnya untuk aliran tak berair.

** Gunakan warna pelengkap* — Bentuk morfologi terlihat terbaik ketika transisi antara warna yang bekerja sama dengan baik.

*Center urutan untuk impact — Pola stagger center menarik perhatian ke tengah teks.

*Match ungkap ke isi — Gunakan iris untuk bentuk melingkar, wipeLeft untuk teks.


Variasi

Morf Pengvisualan Data Data

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

Jujukan Logo Animasi

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

Langkah - Langkah Berikutnya