平塗動畫
每張圖稿維持3-4幀,動畫表現來自於圖稿切換與嘴型變化。對於簡單的電視卡通設計而言,這條路線能讓圖像模型維持最高的一致性。它不需要3D模型,也不需要影片模型。
腳本位於此技能scripts/檔案夾中,路徑相對於此SKILL.md。下方以$S代表該檔案夾。除了new_project.py之外,請在影片專案資料夾中執行這些腳本。如果遇到環境問題,請使用dula-start。
使用對方的語言與其溝通。
工作流程
python $S/new_project.py my_film && cd my_film
1. 故事與分鏡
撰寫story.md,然後設定config/film.json(請參閱 film.json 參考文件)。第一部影片請控制在20-30秒內,一句口白大約2-3秒,所以15秒約可容納3-5句台詞。僅使用原創角色。
針對每一句台詞,思考是誰說的、對誰說的,以及鏡頭要拍誰。笑話不應依賴觀眾聽不懂的詞彙。因果關係也需要畫出來(跑進來 → 抓住 → 物品飛出去)。不要用剪接跳過。
2. 角色設計(最重要的步驟)
將每個角色放入config/anchors.tsv(名稱<TAB>外觀描述),然後執行:
python $S/paint.py anchors config/anchors.tsv
請親自打開並檢查每一張產生的圖片。 有些檢視器會將透明區域顯示為黑色底上的有色光暈,看起來像失敗的去背。如有疑慮,請在步驟3後檢查build/check_alpha.png。然後將設計稿展示給對方,獲得批准後再繼續。後續的所有繪圖都以此為基礎,所以在這裡犯錯的修正成本最高。用文字修正比例,例如:「頭部佔全身高度三分之一,圓臉,黑色小圓珠眼睛,紅色吊帶褲」。
3. 背景與圖稿
填寫config/plates.tsv(名稱<TAB>描述)和config/cels.tsv(繪圖名稱<TAB>角色<TAB>姿勢)。繪圖名稱請以角色名稱開頭,例如hero_run_a。
python $S/paint.py plates config/plates.tsv
python $S/paint.py cels config/cels.tsv
python $S/prep_cels.py --bases-only # 在繪製嘴型前,檢查 build/check_alpha.png 中的去背狀況
每張圖片約需1-3分鐘,paint.py會即時回報進度。如果你的工具會中斷長時間執行的指令,請讓它在背景執行。重新執行時會跳過已完成的圖片。若要重做某張圖,請使用--only <名稱> --force。
為了保持圖稿與場景的連續性,可以多加一欄指定要跟隨的項目:
hero_run_a hero 向右跑,左腳在前。
hero_run_b hero 向右跑,右腳在前。 hero_run_a
meadow 灰色雨雲下的草地。
meadow_sun 雨停了,陽光穿過雲層。 meadow
規則:
- 每張圖片只畫一個角色。角色設計永遠是第一參考。切勿使用被拒絕的圖片作為參考。
- 先決定角色的面向。 一次只產生一張圖片時,每張都會自行選擇方向,所以對話中的兩個人很容易變成背對背。請一開始就指定方向,並使用
flip來修正錯誤。 - 動作循環中的每個繪圖都要跟隨前一個(上述的額外欄位),這樣方向、比例和形狀才能保持穩定。沒有這個設定,循環就會跳動。
- 若需改變一天中的時間,請重新繪製背景,並跟隨原始場景圖。疊加顏色效果無法隱藏藍天。
- 在每個鏡頭中檢查角色的比例。像「脖子向上伸」這樣的姿勢描述可能會變成不同的身體。
4. 嘴型與眨眼
每個有對話的繪圖都需要對同一張圖片進行局部編輯。在 config/variants.tsv 中:
hero_stand_m1 hero_stand 僅將嘴巴改為半開的小橢圓形。
hero_stand_m2 hero_stand 僅將嘴巴改為大開。
hero_stand_blink hero_stand 閉上雙眼,用簡單的弧線表示。其他不變。
命名規則:<基底>_m1 是半開,<基底>_m2 是大開。如果只有 _m1,嘴巴就有開與閉兩種狀態,這樣也行。基底繪圖本身嘴巴必須是閉合的。如果基底畫的是張開的嘴,請製作一個閉合的變體,並在 film.json 中用 talk 設定三種狀態。
每個有對話的角色都需要有自己的嘴型,包括走路循環中的每個繪圖。
python $S/paint.py variants config/variants.tsv
python $S/prep_cels.py
prep_cels.py 會將繪圖壓縮成真正的平塗色彩,並將每個變體鎖定到其基底。然後打開 build/check_alpha.png,在洋紅色背景上檢查去邊效果。重新繪製任何留有背景殘缺、缺少零件或眼睛被擦除的圖像。如果它警告有大面積改變,表示模型修改了身體。請在 variants.tsv 的第4欄添加一個視窗 x,y,w,h。
顏色偏移? 你可以添加 config/palette.json({"skin": [250, 220, 190]}),使用從角色設計中取樣的顏色。只有接近的顏色會對齊到它,而 prep_cels.py 會在你修改後再次套用它。
5. 聲音
選擇一種方式:
- 使用
dula-voice生成語音,需使用對方自己的 API 金鑰。 - 使用現有音檔:將其放在
audio/voice/<台詞ID>.wav,或在台詞上設定file屬性。mp3 和 wav 都支援。 - 製作無聲草稿:為台詞設定一個
seconds數值。
嘴型是根據這段音檔計算的,所以在製作測試版之前要先確定語音。
可選項目:ambience(環境音)、bgm(背景音樂)、sfx(音效)和 songs(歌曲)。僅使用對方擁有版權的素材。此專案不生成音樂。在沒有授權音樂的情況下,可以省略配樂,讓環境音和音效來支撐影片。
6. 測試
python $S/build_film.py
python $S/render.py --stills 1,3,5,8,12
python $S/render.py --range 0,20 -o output/pilot.mp4
當有可見角色說話但嘴巴無法移動時,build_film.py 會報錯並停止,這是最容易忽略的錯誤。在展示測試版之前,請檢查每一張靜止畫面。 不要等到整部影片完成才給任何人看。
要讓角色接觸地面:猜測 ground 值,渲染一張靜止畫面,然後調整。這比計算快多了。
不要讓鏡頭靜止不動。除非某個節拍刻意要靜止,否則每個鏡頭都要有一個動態元素:背景平移、bob(晃動)或 shake(震動)、圖稿切換,或疊加效果(如雨)。影片的最後一個鏡頭要以 fade_out(淡出)結束。
7. 完整影片與最終檢查
python $S/render.py
python $S/check_mouths.py
在交付前確認以下每一項,如果無法做到,請坦誠告知:
- 你已親自查看每個鏡頭的實際幀
-
check_mouths.py未回報任何嘴型凍結 - 每個角色在不同鏡頭中看起來仍是同一個人(臉部和比例比顏色更重要)
- 對話中的人們面向彼此
- 單張繪圖在螢幕上移動時有
bob效果或更多圖稿,否則看起來像滑動 - 你已經聽過聲音。如果你無法聽,請說明音檔未經人耳檢查
完整範例
此倉庫中的 examples/rainy-slide 包含一部完成的15秒影片的提示詞和鏡頭清單,docs/tutorial.md 則有說明。從此檔案可找到位於 ../../examples/rainy-slide 和 ../../docs/tutorial.md 的內容。當有人要求範例時,請將它們作為模型使用。
節奏
經驗法則:鏡頭平均3-5秒,角色每個繪圖維持3-4幀(約每秒7張圖稿),多使用特寫和誇張的表情。hold 是每個繪圖的幀數。
常見問題
| 症狀 | 原因與修正 |
|---|---|
| 切換嘴型時身體顏色閃爍 | 變體未經過 prep_cels.py 處理 |
| 走路或跑步動作忽高忽低 | 不要分別調整繪圖尺寸。同一個角色會自動共享一個比例。也可以加上 align_head |
| 道具顏色錯誤 | 調色盤條目太接近。移除它或降低 SNAP 值 |
| 說話時嘴巴保持張開 | 二態嘴型使用0.5的閾值。檢查音訊是否模糊不清 |
| 安靜的字詞嘴巴保持閉合 | 一個大聲的字詞會設定該句台詞的縮放比例。添加 _m2,或降低該句的 mouth_open_at 值 |
| 聽不到雨聲或風聲 | 環境音預設較小聲。為它設定 level_db 值,例如 -35 |
| 持續的嘶嘶聲 | 環境音素材只是噪音。替換它。增益已上限,所以不會再被放大 |
| Codex 說參考圖像遺失 | 圖像生成必須是它的第一個動作。paint.py 會處理這個問題,所以重新執行它 |
限制
此路線不適合複雜的打鬥、長時間的連續動作或寫實風格的繪畫。