การเคลื่อนไหว:

สร้างการปรับเปลี่ยนรูปร่าง และการออกแบบแอนิเมชันหลายแบบ.

เวลา: ~ 20 นาที

~ ความแตกต่าง:~ เพิ่มเติม

สิ่งที่คุณจะสร้าง

ลําดับความผันผวน ที่รูปร่างรูปร่างเป็นกันและกัน ในขณะที่ข้อความเปิดเผย.

Shape Morphing พร้อมข้อความที่ถูกเลื่อนออกไป indow

ภาพ หน้า ปก

  • ~การปลุกให้ตื่น~ — การเปลี่ยนแปลงที่ราบรื่นระหว่างรูปทรงที่แตกต่างกัน
  • ~แอนิเมชันที่ถูกสับทิ้ง~ — การนับจังหวะของธาตุต่าง ๆ
  • ~ การแปลงสี~ — การเปลี่ยนสีแบบไม่ตายตัว
  • ~หน้ากากเผยให้เห็น ~ - การเช็ดปากและผลกระทบที่ร้ายแรง~
  • ~จัดอันดับการเต้นรําตามเวลาที่เหมาะสม~

ตอน 1: รูป ร่าง

ขั้น ที่ 1: สร้าง รูป แบบ ต้น กําเนิด

  1. สร้างวงกลมที่ศูนย์:
    • รัศมี: ~80~
    • สี: #3b82f6 (สีน้ําเงิน)
    • Position: (400, 300)
const circle = app.create('circle', {
  x: 400, y: 300,
  radius: 80,
  color: '#3b82f6'
});

ขั้นที่ 2: สร้างรูปทรงเป้าหมาย

  1. สร้างดาว (จะเป็นเป้าหมายของมอร์ฟ):
    • จุด: ~5~
    • รัศมี: ~100~
    • สี: #f59e0b (amber)
    • Position: (400, 300)
const star = app.create('star', {
  x: 400, y: 300,
  points: 5,
  radius1: 100,
  radius2: 40,
  color: '#f59e0b'
});

ขั้น ที่ 3: เพิ่ม ความ สัมพันธ์

ความสัมพันธ์ของ morphs_to ทําให้เกิดการแปลงรูปร่างได้เรียบ:

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

ขั้น ที่ 4: หลัก ฐาน หลาย อย่าง

สร้าง ลําดับ การ ฟื้น ตัว: วง กลม

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

ตอน 2: เปิด เผย ข้อ ความ

ขั้น ที่ 5

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

ขั้น ที่ 6: นํา สิ่ง แปลก ปลอม มา ใช้

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

เพิ่มลวดลาย…

รูปแบบ ลูกเล่น
linear จากซ้ายไปขวา
reverse จากขวาไปซ้าย
center ตรงกลาง
random สุ่ม
wave เวลาคลื่นไซน์
fibonacci จังหวะธรรมชาติ

ตอน 3: การ เปิด เผย ของ หน้ากาก

เผยรูปร่างการศพที่มีผลกระทบที่:

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

ขั้น ที่ 8: ปิด การ เปิด เผย สําหรับ ข้อ ความ

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

ชุดสําเร็จของหน้ากากที่มีอยู่

ชุดสําเร็จ ลูกเล่น
iris ขยายจากตรงกลาง
wipeLeft แสดงทางแนวนอนจากด้านซ้าย
wipeUp เปิดทางแนวตั้งจากด้านล่าง
star การขยายรูปดาว
heart การขยายรูปหัวใจ
curtainHorizontal เปิดจากตรงกลาง
diagonalWipe แสดงมุม

ตอน 4: ชีวประวัติ ครบ ถ้วน

สคริปต์แบบเคลื่อนไหวเต็มที่

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

ตั้งค่า

สําหรับผลลัพธ์ที่ดีที่สุดกับภาพเคลื่อนไหว:

ตั้งค่า ค่า เหตุผล
รูปแบบ WebM คุณภาพสูงสุดสําหรับการไล่ระดับสี
อัตราเฟรมภาพ 60 fps ความแหลม:
ความยาว 6 วินาที วงจรการวนเต็ม
คุณภาพ สูง รักษาการเปลี่ยนสี

ข้อ แนะ

“Outlack time” — เริ่มต้นการแอนิเมชันถัดไป 0.1.0.2s ก่อนปลายก่อนหน้านี้สําหรับการไหลไม่ไหล.

♪ ใช้สีเติม ♪ — รูปกายดูดีที่สุดเมื่อเปลี่ยนสีที่เข้ากันได้ดี.

** ลําดับเลขศูนย์สําหรับผลกระทบ* — รูปแบบ center ที่เลื่อนลอย ดึงความสนใจมาอยู่ตรงกลางของข้อความ.

เปิดให้เข้ากับเนื้อหา — ใช้ iris สําหรับรูปทรงวงกลม wipeLeft สําหรับข้อความ.


ความแตกต่าง

ภาพประกอบข้อมูล 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 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' }
  ]);
});

ขั้นถัดไป

  • [Physicals April] (/tutorials/physics-animation) — เสียงสะท้อนและเสียงยืดหยุ่น
  • [Map Expressions] (/tutorials/map-animation) — ข้อมูลเชิงภูมิศาสตร์
  • [masking System] (/features/masking) — เทคนิคการเปิดเผยขั้นสูง