Communitygithub.com

phido0410/motion-canvas

Motion Canvas — 在 TypeScript 中使用 generator 場景(makeScene2D、yield*、refs、訊號、all/chain/sequence/waitUntil)製作程式驅動的 2D 解說/動畫影片,提供即時編輯器,並可渲染為影像序列或 MP4(@motion-canvas/ffmpeg)。當使用者詢問 Motion Canvas 或需要與 Remotion 分開的、搭配旁白同步的解說動畫時使用。

motion-canvas 是什麼?

Motion Canvas 是一個開源的動畫工具,讓開發者使用 TypeScript 與 generator 函式(例如 `yield*`)來建立 2D 解說或動畫影片。與 Remotion 的 React 框架不同,Motion Canvas 採用命令式的時間軸設計,透過 `yield*` 逐步執行場景步驟,並內建編輯器,可將動畫時間點與旁白或音訊事件(透過 `waitUntil` 標記)精確對齊。它支援常見的幾何圖形(Circle、Rect、Line、Txt、Code、Latex 等)與屬性補間(tween),並提供 `all`、`chain`、`sequence` 等流程控制函式來組合動畫。專案透過 `npm init @motion-canvas/latest` 初始化,開發時執行 `npm run serve` 啟動編輯器,最終可輸出為影像序列或透過 FFmpeg 外掛輸出為含音訊的 MP4。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/phido0410/claude-video-skills/tree/HEAD/skills/motion-canvas

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Motion Canvas

檢查日期 2026-10:@motion-canvas/core、/2d、/ffmpeg 3.17 版。需要 Node 16+。

Remotion 與 Motion Canvas 的比較:Remotion = React,將影格對應到 UI,適合資料驅動/範本化的影片與伺服器端渲染。Motion Canvas = 命令式時間軸(yield* 逐步執行),搭配編輯器來對齊旁白。每個影片請選擇其中一個,不要混用。

設定

npm init @motion-canvas/latest   # 輸入名稱、選擇 TypeScript、選擇「Video (FFmpeg)」匯出器
npm install
npm run serve                    # 編輯器位於 http://localhost:9000
src/project.ts        # makeProject({ scenes: [...] })
src/scenes/*.tsx      # 每個場景一個檔案
// src/project.ts
import {makeProject} from '@motion-canvas/core';
import intro from './scenes/intro?scene';   // 必須加上 ?scene 後綴
export default makeProject({scenes: [intro]});

場景

import {Circle, Rect, Txt, makeScene2D} from '@motion-canvas/2d';
import {all, chain, createRef, easeInOutCubic, sequence, waitFor, waitUntil} from '@motion-canvas/core';

export default makeScene2D(function* (view) {
  const circle = createRef<Circle>();
  view.add(<Circle ref={circle} x={-300} size={240} fill="#e13238" />);

  yield* all(                                   // 平行執行,等待全部完成
    circle().position.x(300, 1).to(-300, 1),     // 補間:prop(值, 秒數),可用 .to() 串接
    circle().fill('#e6a700', 1).to('#e13238', 1),
  );
  yield* waitUntil('title');                    // 命名的時間事件,可在編輯器時間軸上拖曳
  yield* circle().scale(2, 0.6, easeInOutCubic);
});
  • 座標:原點在畫面中心;x、y、size、width、height、rotation、scale、opacity、fill、stroke、lineWidth。
  • 元件:Rect(radius 可設定圓角)、Circle、Line / Spline(points、end 可實現繪製效果)、Txt、Img、Video、Layout(flexbox:layout direction gap)、Code、Latex。
  • 屬性用法:帶入值時為設定;帶入 (值,秒數[,緩動函式]) 時為補間,且必須用 yield*;不帶參數時則為讀取。

流程控制

呼叫效果
all(...t)平行執行,等待全部完成
any(...t)平行執行,等待第一個完成
chain(...t)依序執行上一個完成後才執行下一個
sequence(0.2, ...t)每個相隔 0.2 秒開始(不等待前一個完成)
delay(0.5, t)延遲 0.5 秒後開始
loop(3, () => t)重複執行
waitFor(1.5)暫停 1.5 秒
waitUntil('event')暫停直到編輯器中的命名事件 — 用於旁白同步
useDuration('event')取得命名事件的長度,作為補間持續時間

渲染

  • 編輯器 → 渲染面板:解析度、影格率(24/30/60)、範圍、匯出器。點擊 RENDER。
  • 輸出檔案位於 /output 目錄。預設匯出器會輸出影像序列;若要輸出含音訊的 MP4,請安裝 FFmpeg 匯出器:
npm install --save @motion-canvas/ffmpeg
// vite.config.ts
import {defineConfig} from 'vite';
import motionCanvas from '@motion-canvas/vite-plugin';
import ffmpeg from '@motion-canvas/ffmpeg';
export default defineConfig({plugins: [motionCanvas(), ffmpeg()]});

接著在影片設定中選擇 Video (FFmpeg)。

  • 解析度變更不會縮放佈局;請在開始排版前決定最終解析度(例如 1920×1080 或 1080×1920)。

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相關技能