azosi · 2026.7.30 00:13 · 조회 1

Motion Canvas 애니메이션 & 디자인

Motion Canvas의 애니메이션 시스템 — Scenes, 노드 트리, signal, tween, layout — 의 핵심 개념과 API를 다룬다.


🎬 Scene = 최상위 단위

Motion Canvas의 모든 애니메이션은 Scene 함수 안에 있다. makeScene2D()로 정의하고 yield*로 시간을 제어한다.

import {makeScene2D, Circle} from '@motion-canvas/2d';

export default makeScene2D(function* (view) {
  const circle = createRef<Circle>();
  view.add(
    <Circle ref={circle} size={200} fill={'#3b82f6'} />,
  );

  yield* circle().size(400, 1);      // 1초 동안 크기 200→400
  yield* circle().fill('#ef4444', 1); // 1초 동안 색 변경
  yield* waitFor(0.5);                // 0.5초 대기
});

함수가 곧 애니메이션 — JSX로 노드 트리를 만들고, yield*로 시간 흐름을 정의한다.


🌳 노드 트리 (Hierarchy)

모든 시각 요소는 노드고, 부모-자식 관계로 트리를 이룬다:

<Layout direction={'column'} gap={20} alignItems={'center'}>
  <Txt text={'Title'} fontSize={64} />
  <Rect width={400} height={200} fill={'#1e40af'} radius={20}>
    <Circle size={100} fill={'#fbbf24'} />
  </Rect>
</Layout>
노드역할
LayoutFlexbox 자식 정렬
Rect사각형 (배경/박스)
Circle
Txt텍스트 (FontFamily/fontSize)
Img이미지 (src URL)
Video비디오 (선택)
Polygon, Line, Spline도형
Node모든 노드의 베이스

자식 노드는 부모의 position, scale, opacity 등을 상속한다.


📐 좌표계 (Cartesian)

Motion Canvas는 수학 좌표계 (Y축 위가 +):

        +y
         │
         │
   ──────┼──────  +x
         │
         │
  • 중심: (0, 0)
  • 위 = 양수 y, 오른쪽 = 양수 x
  • 회전: 시계 반대 방향이 양수 (수학 관습)
circle().position(300, 200);  // 우상단으로 이동
circle().rotation(45);        // 45° 반시계 회전
circle().scale(1.5);          // 1.5배 확대

🎚️ Signal — 시간에 따라 변하는 값

Signal은 0차원적인 시점 값. createSignal(0)로 만들고 yield*로 시간에 따라 변형:

import {createSignal} from '@motion-canvas/core';

const opacity = createSignal(0);
view.add(<Circle opacity={opacity} />);

yield* opacity(1, 1);   // 1초에 걸쳐 0→1
yield* opacity(0, 1);   // 1초에 걸쳐 1→0

Signal을 노드 속성에 직접 바인딩하면 자동으로 보간(tween).

Signal의 3가지 보간 모드

메서드의미
signal.to(value, duration)value까지 duration초에 걸쳐 보간
signal.to(value, duration, easing)easing 함수 함께
signal(value, duration)짧은 표기 (to와 동일)

🎨 Tweening — 보간 패턴

시간 기반

yield* circle().position.x(300, 1);  // 1초에 걸쳐 이동
yield* circle().fill('#ef4444', 0.5);

Easing

import {easeInOutCubic, easeOutBack, linear} from '@motion-canvas/core';

yield* circle().position.x(300, 1, easeInOutCubic);
yield* circle().size(400, 1, easeOutBack);  // 살짝 오버슈팅
Easing용도
linear기계적 움직임
easeInOutCubic부드러운 가속/감속
easeOutBack오버슈팅 (탄성)
easeOutElastic진동
easeInBounce바운스

다중 동시 애니메이션

yield* all(
  circle().position.x(300, 1),
  circle().fill('#ef4444', 1),
  txt.opacity(1, 0.5),
);

all(), sequence(), waitFor() 조합으로 복잡한 시퀀스 구성.


📏 Layouts (Flexbox)

Layout 노드는 자식을 Flexbox처럼 배치:

<Layout direction={'row'} gap={40} alignItems={'center'} padding={20}>
  <Circle size={100} fill={'#3b82f6'} />
  <Circle size={100} fill={'#ef4444'} />
  <Circle size={100} fill={'#22c55e'} />
</Layout>
속성기본
directionrow | columnrow
gap숫자0
alignItemsstart | center | endstart
justifyContentstart | center | end | space-betweenstart
padding숫자0
wrapwrap | nowrapnowrap

🔗 노드 참조 (Refs)

createRef<T>()로 노드를 잡아두면 yield*로 제어 가능:

import {createRef} from '@motion-canvas/core';

const circle = createRef<Circle>();
view.add(<Circle ref={circle} size={100} fill={'#3b82f6'} />);
yield* circle().size(300, 1);

ref 없이도 인덱스/이름으로 접근 가능하지만, ref가 가장 직관적.


🚀 다음 단계

작업가이드
렌더링 (export)Motion Canvas 렌더링
에디터 디버깅Motion Canvas 에디터 워크플로우
Lottie/Rive 통합Motion Canvas 확장 & 통합

🔗 공식 리소스

상위 문서: ← Motion Canvas 사용 가이드 출처: Motion Canvas 공식 문서 — Animations 카테고리 한글화 (2026-07-30) 공급사: Motion Canvas (motion-canvas 조직)

변경 이력

날짜변경
2026-07-30초안 작성 — Scene/노드/Signal/Tween/Layout 핵심 API 표

댓글

아직 댓글이 없습니다.

댓글을 작성하려면 로그인이 필요합니다.