紙偶分鏡
分鏡是每個場景建構的藍圖。它為每個場景指定了攝影機運鏡和切換方式,以免場景代理自行發明不連貫的運鏡。一份指令中若只寫「CameraPush 或你自訂的變換」,則每個場景都會得到一個平淡的推鏡或手動縮放,而工具組中的攝影機運鏡將被閒置。
前置準備
- 安裝:最小安裝即可。若使用函式庫,請檢查
style/$MOTION_STYLE/remotion/CATALOG.md(「paper/camera.tsx」和「paper/transitions.tsx」章節)以了解每個運鏡的屬性和適用時機。如果該檔案遺失或過時,請執行python3 $MOTION_LIB/core/tools/catalog.py。請從環境變數中解析$MOTION_LIB,否則從~/.config/motion-explainer/config.env中的MOTION_LIB=行讀取,再不然就詢問使用者。 - 需要
narration/script.json和video/STORYBOARD.md,後者需包含 HOOK 區塊與舞台表(每行分別為:橫幅、佈景、道具、UI 時刻、吉祥物、笑點)。若缺少,請執行motion-hook和motion-script。 - 背景板用於選擇佈景:
style/$MOTION_STYLE/remotion/public/bg/backdrops/_sheet.jpg。只開啟步驟所需的內容。
1. 全域規則
將這些規則放在 STORYBOARD.md 頂部、HOOK 區塊下方。依據角色設定色板(依佈景輪換背景顏色):參見 $MOTION_LIB/style/$MOTION_STYLE/docs/style-guide.md 第 5 節。字型:第 6 節。畫布與區域:第 4 節。若需要一個適合單一延伸隱喻的功能解鎖,可使用第 12 節。
- 解析度 1080x1920,30 fps。橫幅位於高度 14-21%,標題區塊位於 68-80%(它會隨場景移動以避開人臉),底部 20% 保持清晰。
- 光線來自左上角。僅對角色、標題和訊號使用飽和度。
2. 攝影機 / 切換表
在場景區塊之前,每個場景一行。每一行都指定一個來自工具組 paper/camera.tsx 的元件,以及用於切入該場景的 CutSeries 種類(來自 paper/transitions.tsx)。
| 場景 | 攝影機 (paper/camera.tsx) | 切入方式 (CutSeries 種類) |
|---|---|---|
| S01Hook | OrbitCamera + Depth, SnapZoom 在「<詞語>」上 | 無 |
| S04Name | Crane 上升至 <焦點道具> | tearAway |
| S09Peak | CrabTrack 沿著 <排列> | whip |
| S10CTA | RackFocus <道具> 至手機 | tapePull |
- 攝影機選項:
OrbitCamera+Depth、SnapZoom、Crane、CrabTrack、DollyZoom、RackFocus、ForegroundPass、DutchTilt、FocusPulse、FreezeFrame、PullBack、PovMask、TimeRamp、TiltShift、FocusHunt、Handheld和CameraPush(來自paper/kit.tsx)。目錄的paper/camera.tsx章節會說明每個運鏡的適用時機。 - 切換選項:
hard、whip、zoomThrough、pageTurn、tearAway、tapePull、stampCut、infiniteZoom、popUpBook、keyhole、burnAway。 - 純
CameraPush最多只能在三分之一場景中使用。 - 將表中每一行的攝影機複製到其場景區塊的標頭中。切換欄位會作為
"cuts": {"S04Name": {"kind": "tearAway"}}填入episode.json(無條目表示硬切),motion-build會負責填入。
3. 場景區塊
每個場景一個區塊,持續 1.5-5 秒,在句子邊界切換:
## S03:<節拍> (5.6-8.2 秒, 78 影格) 橫幅:<大寫的關鍵訊息>
位置/背景:<世界位置 + 背景顏色> 攝影機:<camera.tsx 元件 + 參數,來自表格> 切入方式:<種類>
角色:<誰,配件> 標題區塊:y=0.76
| 旁白詞語 (加重音) | 影格 | 事件 | 動作規範 |
| "<詞語>" | +6 | <道具進入 / 狀態切換 / 動作> | <spring/slide/swap + 影格> |
環境:<LED 閃爍, 閒置搖擺, 星星, 螢幕波形>
搖晃:橫幅 + 標籤,每 2 影格 ±1.5 像素
音效:<跳躍聲, 叮噹聲, 點擊聲...>
- 將舞台表的每一行擴展為影格級事件:每個加重音旁白對應一個事件(每 0.4-0.8 秒一個),環境動畫始終開啟。影格是相對於該詞語的偏移量,稍後會透過
cueOf(ID)(word, n)讀取。 - 產品 UI 是在紙製顯示器或筆記型電腦螢幕上的粗略重建,包含偽造的互動(游標點擊、打字、進度條、波形、列表滾動)。
- 證明: 每個片段一次,將來源頁面的真實截圖(透過
$MOTION_LIB/core/tools/capture.mjs進行瀏覽器截圖,非重新繪製)貼在一張紙卡上,並用一支紅色麥克筆在關鍵句子周圍畫出一個自動繪製的圓圈。其他所有內容保持粗略的紙偶重建。 - 在號召性用語 (CTA) 之前,有一次對先前佈景的回呼。
4. 攝影機與切換規則
- 每個場景只有一個運鏡。緩慢推鏡是基線。在明亮的佈景上加入視差環繞以增加深度,在加重音的詞語上(用於數字和笑點)加入推進或快照縮放,加入前景穿越(一個模糊的紙製物體經過鏡頭)或拉焦,加入拉遠鏡頭以揭示規模,並在掙扎的吉祥物節拍處加入帶有標籤的定格畫面。
- 大部分在橫幅變換時使用硬切。在 2-3 個主題變換時使用帶有動態模糊的甩鏡,在「進入」螢幕、門或鏡子內部時使用穿越縮放,每個片段最多一次翻頁或撕紙(用於接住或前後對比),以及用於進入 CTA 的膠帶拉開(一個樸素的牛皮紙條,可選用
label屬性來印上一個詞)。 - 從鉤子場景切出時需帶著動作延續。將
motion-hook的規則應用於 S01 和 S02。 - 轉場持續 6-12 影格,每個轉場帶有其音效(甩動、縮放、翻頁、撕裂、剝膠帶)。
- 在函式庫專案中,使用工具組的轉場系列來串聯場景,這可以確保每個場景的起始點都落在其
plan.json的影格上,使語音保持同步。
5. 音效計畫
- 空氣音(呼嘯聲、滑動聲、甩動聲、縮放聲)合計:在每 2.5 秒的片段中最多一個。
cues.py會在超出限制時印出提示。例如,在 33 秒內有 12 個是可以接受的,但 26 秒內有 24 個就會分散注意力。 - 進場使用接觸音(爆裂聲、重擊聲、戳印聲)或靜音。在音訊渲染之前,將它們計入
tools/cues.json。 - 從
$MOTION_LIB/core/audio/CATALOG.md中選取音效名稱,放在每個區塊的音效:行中。場景代理會將實際的資料行寫入tools/cue_sheet.d/<Scene>.json。 - 選擇背景音樂預設 (
episode.json中的 "bed"),並設定cutSfx以匹配切換種類:tearAway對應撕裂聲,tapePull對應剝膠帶聲。
檢查清單
-
每個場景都有攝影機和切入方式,且純
CameraPush最多使用在三分之一場景中。 -
每個加重音詞語都有一個事件;環境動畫已列出。
-
包含一個證明節拍、一個回呼,以及進入 CTA 的膠帶拉開或甩鏡。
-
最多一次翻頁或撕紙;空氣音在預算內。
-
在每個場景區塊的事件表中,標記出期待感以及一個誇張的節拍。12 項動畫原則(映射至工具組元件)請參閱
$MOTION_LIB/style/$MOTION_STYLE/docs/motion-principles.md。
交接
下一步是 motion-build,它會建立專案架構,並將攝影機/切換表和場景邊界轉換為 episode.json。它會讀取 STORYBOARD.md 和 narration/script.json。STORYBOARD.md 的時間部分會在之後(語音處理完成後)才生成,因此請將其留空。