Communitygithub.com

三十九種畫風

用三十九種純程式畫風之一做一支無聲短片,從白板、木刻到黏土、像素和彩色玻璃。

三十九種畫風 是什麼?

三十九種畫風用 Remotion 把短片完全畫在程式裡,不呼叫影像或影片模型。同一個點子可以落成白板、黑板、鉛筆、水彩、賽璐璐、剪紙、木刻、浮世繪、孟菲斯、貼紙解說、低多邊形、黏土、像素、新聞片、全像介面,或清單裡的其他樣子。交付的是一支畫面被畫出來的 MP4。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/deenukhan/animation-styles/tree/HEAD

在你喜歡的 AI 中提問

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

說明文件

動畫風格

一個包含 39 種手工打造動畫風格的 Remotion 專案。每種風格都會重新繪製一個固定的故事,因此可以並排比較並作為模板重複使用:一個水壺進來、傾斜、將奶茶倒入一個 kulhad(陶杯)中、杯子裝滿、水壺離開、蒸汽升起。 150 幀、30 fps、1080×1350 (4:5)、無聲。以 --scale=2 渲染時為 2160×2700。

所有內容皆以程式碼繪製:使用 SVG 搭配篩選器,或逐幀繪製的 <canvas>。不涉及任何影像模型、影片模型或素材片段,因此輸出內容原創且可重現。

專案位於此技能的文件夾(即存放此檔案的文件夾,以下簡稱 <skill>)。請在該資料夾中執行命令。

0. 初次使用

  1. cd <skill> 並檢查 node_modules/ 是否存在。如果不存在,請執行 npm install(約需一分鐘,需要 Node 18+)。
  2. npm run list 會列出所有 39 種風格,包含其編號、代號以及一行簡介。
  3. 首次渲染會下載一次無頭 Chrome(約 100 MB),需要網路連線。

常見請求:「製作一個 5 秒的 <想法> 並採用 <風格> 風格」

這是主要任務(也是引導使用者前來的提示)。請一氣呵成完成,除非想法不明確,否則不要中途提問:

  1. 工作資料夾: 在使用者目前的工作資料夾內使用 animation-films/。如果該資料夾不存在,請從目前資料夾執行 node <skill>/scripts/new-project.mjs animation-films 來建立,然後 cd animation-films && npm install(第一次之後會很快)。如果已存在(後續操作),則直接重複使用。
  2. 選擇風格 從請求中選取(第 1 節)。如果沒有指定風格名稱?建議三種適合該想法的風格並詢問。
  3. 規劃故事 用一個簡短的表格,根據六個節拍(第 3 節)來規劃。在一個訊息中顯示並繼續;除非有不明確之處,否則無需等待。
  4. 先繪製形狀: 將使用者的物件(主角、容器、流動物、上升物)放入 src/films/<idea>-shapes.ts 中,作為 SVG 路徑,座標系統與 story.ts 中的 P 相同,並在頂端以註解方式加入節拍表格。這個想法的每種風格版本都會從此檔案匯入。
  5. 建構 src/films/<idea>-<style>.tsx,使用該風格的元件(第 3 節),引用形狀檔案,並在 src/films/index.ts 中以 id <idea>-<style> 註冊。
  6. 檢查: 執行 npm run render -- <idea>-<style> --frames 並查看所有六個幀(第 5 節)。修正並重複。
  7. 交付: 執行 npm run render -- <idea>-<style> --final 並提供使用者 out/<idea>-<style>.mp4 的完整路徑。告知他們可以要求另一種風格(「現在改用像素藝術」)。

重新風格化後續操作(「現在改用像素藝術」、「試試水彩風格」、「用木刻做同一個」): 停留在同一個 animation-films/ 資料夾中,保留相同想法、節拍表和形狀檔案,並從新風格的元件建構新的 src/films/<idea>-<new-style>.tsx。與先前的版本一起註冊(切勿覆蓋),檢查幀、渲染最終版本並提供新路徑。如果使用者模糊地命名風格(「8-bit」、「老電影」、「粉筆」),請對應第 1 節。3D 外觀風格(57、58、59、62、80)將物件建構為 3D 網格,因此在那裡替換新物件需要更多工作:使用 src/styles/3d/mesh.ts 中的輔助工具將形狀轉換為簡單的車削或盒狀網格。

1. 選擇風格

如果使用者尚未指定,請詢問他們想要的風格。如果他們不確定,請按系列顯示 npm run list 以及 README.md 中的圖庫(每種風格在 media/thumbs/ 中都有動態預覽,在 media/videos/ 中則有 720×900 的 MP4)。寬鬆比對:「日本版畫」→ 33 浮世繪、「粉筆」→ 02 黑板、「8-bit」或「復古遊戲」→ 64 像素藝術 RPG、「黏土」→ 62 黏土動畫、「樂高風格」→ 58 積木玩具(切勿在螢幕上稱之為樂高)、「老電影」→ 70 默片或 71 新聞影片、「科幻螢幕」→ 84 全像 HUD。

系列風格 (編號、代號)
板上繪製01 白板 · 02 黑板 · 05 記事本塗鴉 · 06 藍圖
手繪與水彩08 手繪 · 09 城市速寫 · 10 蠟筆書本 · 11 水彩 · 13 一筆畫 · 16 賽璐珞線條抖動
卡通17 扁平向量 · 21 80年代賽璐珞動畫 · 22 火柴人
紙張與玩偶23 剪紙 · 24 紅色剪紙 · 25 立體紙雕 · 27 皮影戲
版畫與工藝28 木刻 · 29 版畫 · 31 絹印海報 · 33 浮世繪 · 34 裝飾藝術 · 35 彩繪玻璃
圖形與解說39 孟菲斯立體模型 · 51 貼紙解說 · 52 數學圖表
3D 外觀57 低多邊形島嶼 · 58 積木玩具 · 59 玻璃製品 · 62 黏土動畫 · 80 雷射雷達測量
電影時代70 默片 · 71 新聞影片
螢幕與科學64 像素藝術 RPG · 81 顯微鏡 · 84 全像 HUD · 85 電路板
抽象87 液體動畫 · 89 生成式抽象

src/catalog.ts 是單一列表:編號、組合 id (33-ukiyo-e)、名稱、系列、外觀、風格顯示的螢幕文字,以及其程式碼所在檔案。

2. 直接展示內建風格

npm run render -- 33            # 720x900 預覽 -> out/33-ukiyo-e_preview.mp4  (數秒至一分鐘)
npm run render -- 33 --final    # 2160x2700 主檔 -> out/33-ukiyo-e.mp4          (crf 16)
npm run render -- 33 --frames   # 6 個檢查幀 -> out/33-ukiyo-e_frames/ (+ 如果已安裝 ffmpeg,則會產生聯絡表)
npm run render -- 33 --still 75 # 第 75 幀的一張 PNG

風格可以透過編號、id、代號或名稱的一部分來指定(ukiyo、pixel、stained)。現成的 720×900 影片已位於 media/videos/ 中,完整的 2160×2700 主檔則在 GitHub 發布頁面上,因此僅需展示一種風格時,完全不需要渲染。

3. 用使用者的故事或物件重新演繹

故事已在 src/story.ts 中固定。保留其時間點,並更改繪製的內容。這就是讓新影片第一次就能正確輸出的關鍵:每種風格都已經知道如何呈現這些節拍。

節拍 (30 fps 的幀,對於 5 秒的影片絕不移動它們):

幀節拍storyAt(f) 的值
0–24主角從右側進入kx, ky
24–42主角準備好(傾斜)tilt (0 → −38°)
42–96主要動作(倒出)streaming, stream (從 tip 進入杯中的 SVG 路徑)
44–100結果成長(杯子裝滿)level 0 → 1, surface (奶茶橢圓)
96–126完成並離開tilt 回到 0, kx 滑出
104–150後續效果(蒸汽升起)steam[0..2] 0 → 1, 使用 steamPath(i, p, t0) 繪製

story.ts 中的 P 儲存了杯子 (kulhadBody, kulhadOutline, rim) 和水壺 (kettleBody, kettleLid, kettleSpout, kettleHandle, kettleBand, 加上 KNOB) 的 SVG 路徑。水壺以其自身原點繪製,並使用 translate(kx, ky) rotate(tilt) 放置。

首先將使用者的故事映射到相同的六個節拍,以一個簡短表格呈現給他們。範例:

使用者的想法主角(水壺)動作(倒出)結果(裝滿)後續效果(蒸汽)
咖啡倒入馬克杯咖啡壺咖啡流馬克杯裝滿蒸汽
給植物澆水澆水壺水滴土壤變暗,隨著 level 長出新芽兩片葉子展開
存錢拿著硬幣的手硬幣掉落小豬撲滿裝滿 (level → 硬幣堆疊)閃光
顏料倒入罐中顏料罐濃稠顏料罐子裝滿一滴顏料沉降
資料上傳(抽象或資訊風格)一朵雲資料包沿著 stream 移動條形圖或儀表隨著 level 裝滿刻度標記升起

然後建構它:

  1. 在單獨的專案中工作,以保持已安裝的技能乾淨:預設情況下,在使用者目前資料夾中的 animation-films/ 內(參見上方「常見請求」),使用 node <skill>/scripts/new-project.mjs <folder> 建立,然後在該資料夾內執行 npm install。切勿在使用者的影片專案中建構 <skill> 本身。
  2. 從其檔案(參見 src/catalog.ts)複製所選風格的元件到 src/films/<film-name>.tsx,以及它匯入的輔助工具。切勿就地編輯那 39 個原始檔案:它們是參考基準。
  3. 替換形狀,而非時間點:將水壺和杯子的路徑替換為使用者的物件(保持大約相同的大小和位置:杯子居中於 x 540,杯緣於 y ≈ 800;主角靜止時約為 (796, 324),其「壺嘴」位於局部點 (−251, −62)),重新著色液體,更改上升的物體。保留風格自身的材質、調色盤邏輯、篩選器、紋理和動態特性(手工媒介為兩格或三格步進,數位為平滑,電影為閃爍)。
  4. 如果風格會顯示文字(目錄的 text 欄位列出:51、52、64、70、71、84 和 85 會顯示文字),請為新故事改寫:簡短、純英文、僅關於該故事。
  5. 在 src/films/index.ts 中註冊該影片並渲染(第 4 節)。

更長或不同的故事(更多節拍、兩個主角、鏡頭移動):在 story.ts 旁邊撰寫一個新的故事檔案(例如 src/films/my-story.ts),其中包含自己的 storyAt(f),該函數回傳繪圖所需的所有值,在頂端以表格列出新節拍,在影片上設定 durationInFrames,並遵守規則「故事檔案掌管所有時間點,風格檔案掌管所有外觀」。僅在風格旨在呈現手工製作外觀時,才對幀進行量化(Math.floor(f / 2) * 2)。

程式碼規則:僅使用確定性函數(無 Math.random()、無 Date;使用幀或索引的種子函數)、唯一的 filter 和 clipPath id、僅透過 @remotion/google-fonts/<Font> 使用字型並在模組層級使用 loadFont(),以及不安裝 package.json 之外的任何東西。

4. 渲染

需求命令
快速查看npm run render -- <film-or-style> (720×900, crf 23)
最終輸出npm run render -- <film-or-style> --final (2160×2700, crf 16)
來自 src/films 的影片npm run render -- <film-id> --final (同樣支援 --frames、--still 75)
即時編輯npm run studio 在瀏覽器中開啟 Remotion Studio

3D 外觀風格(57、58、59、62、80)以 1080 寬度的 1.5 倍(80 為 1.25 倍)在 Canvas 上繪製軟體渲染場景,然後拉伸至 2160,因此它們比其它風格稍微柔和且較慢。若要獲得清晰的輸出,請提高 src/catalog.ts 中 glView(...) 的第二個引數(2 = 原生 4K,速度約慢兩倍)。

5. 交付前檢查輸出

執行 npm run render -- <id> --frames 並查看每個幀(讀取 PNG)。然後修正並重新渲染。允許兩到三次迭代。

  • 可讀的故事: 在第 50 幀時,明顯有東西在倒出;在第 75 幀時,容器明顯在裝滿;在第 149 幀時,後續效果清晰可見。
  • 無剪裁: 內容未超出幀邊緣;主角完全進入並完全離開。
  • 分層: 液體保持在容器內部,流進入容器(而非在近側邊緣前方),蒸汽從表面開始。
  • 風格可識別: 從單一幀就能判斷風格。兩種風格絕不應看起來像是彼此的重新著色。
  • 對比度: 液體和流在背景下清晰可見,無模糊。
  • 動態特性: 手工媒介為步進式,數位為平滑;沒有非預期的閃爍。
  • 文字: 僅有預期的文字,拼寫正確,且在幀內。
  • 內容規則(下方)全部通過。 最後從頭到尾觀看一次預覽 MP4,然後渲染最終版本。

6. 內容規則(始終遵守)

  • 無真實品牌、標誌、產品、人物、頻道名稱或電視網路,螢幕上無商標名稱。「積木玩具」是通用的玩具積木,絕非指名品牌。
  • 無真實地圖、地點或國界,以及無旗幟或政治符號/口號。如有風景,則為虛構且無可辨識的地理特徵。
  • 無複製特定的電影、節目、片頭序列、遊戲、角色或已知角色的輪廓/精靈圖。 風格或類型可以,特定的現有作品不行。
  • 無虛構事實: 無偽造的統計數據、價格、日期、引言或來源。資料風格僅繪製故事自身的值(如填充水平),別無其他。
  • 僅在風格為字體排印、廣播或遊戲 UI 時才顯示文字,且文字為關於故事本身的簡短英文。
  • 保持原創:使用者的故事、您自己的繪圖、作為一種技術的風格。

檔案

路徑說明
src/story.ts故事:大小、時間點、節拍、物件路徑、storyAt(f) 和 steamPath()
src/kit.tsx共用輔助工具:Stage (SVG 舞台)、Paper (紙張紋理)、Rough (抖動位移)、region
src/catalog.ts39 種風格:編號、id、名稱、系列、外觀、螢幕文字、檔案、元件
src/styles/<family>/繪圖程式碼,按技術分組
src/films/使用者自己的影片
src/Root.tsx、src/index.ts將每種風格和影片註冊為 Remotion 組合
scripts/render.mjsnpm run list / npm run render
scripts/new-project.mjsnpm run new -- <folder> 將程式碼複製到新專案
media/videos/、media/thumbs/每種風格的 720×900 MP4 和動態 WebP

相關技能