運動法則(入門守則) 是做什麼的?
在編寫任何動畫之前,請先閱讀此份文件。它決定了每個接縫處會發生什麼事,以及每個場景如何表現;技術技能只是實現它的工具。這些規則凌駕於通用/上游的運動指導之上。此舉旨在防止的失敗模式:場景各自獨立創作——觀眾視線的動量在每個剪輯點中斷,而場景在進場和退場之間原地擺動。
路由地圖
| 決策(此技能) | 實作技能 |
|---|---|
| 接縫過渡選擇 + 參數 + 代碼 | cut-the-curve §1–5(目錄) |
| 文字/元素進場級聯 | cut-the-curve §6(瀑布式進場) |
| 場景內群組重新定位(無剪輯) | cut-the-curve §7(微調曲線) |
| 游標引導的動作/場景啟動/變形觸發 | oversized-cursor |
| 接縫渲染機制/白光閃爍防護 | seam-craft |
| 產品發布/解說/字幕工作 | 在上游技能的基礎上疊加 text-beat-economics、brand-faithful、captions-overlay |
創作順序:向量分類帳(ledger.json)→ 從中 STAMP 主接縫(scripts/seam-stamp.mjs --ledger ledger.json --write index.html)→ 每個階段的持續運動路徑 → 載體和原因 → 建立元件 → 驗證(scripts/seam-gate.mjs)。 僅手動處理 Tier-A 的變形/匹配剪輯;STAMP 產生的接縫預設可通過閘門檢查。
第一部分 — 接縫法則
向量法則
場景 A 的退場方式決定了場景 B 的進場方式:相同的軸向、相同的方向、匹配的速度、兩側都在運動中進行剪輯。
- 軸向 — X 保持 X,Y 保持 Y,Z 保持 Z。絕不在剪輯點交換軸向。
- 方向 — 絕不鏡像。在 Z 軸上,方向 = 縮放變化的符號:放大 = 推進(攝影機前進),縮小 = 拉遠(攝影機後退)。一個正在退縮的退場,搭配一個從小變大的進場,就是一個鏡像向量——這是最常見的違規,因為從小變大是預設的元素進場方式。
- 速度 — 進場初始速度 ≈ 退場最終速度,透過鏡像的緩動曲線實現(退場使用
power4.in+ 進場使用power4.out,距離和持續時間相同;進場側在概念路徑上完成 ≥50% 的進度)。具體機械原理請見cut-the-curve。 - 相位 — 剪輯點落在兩側的運動過程中。在剪輯點前停止不動,或剪輯後從靜止開始,都是節奏停滯。
影片流向
每部影片選擇一個主導方向(預設值:向左)。每個普通接縫都使用它。其他向量是保留的——使用其中一個意味著某種意義:
| 向量 | 意義 |
|---|---|
| 主要流向(向左) | "下一個節拍" — 中性的向前進展 |
| 向上 | 提升 — 結論或揭示的內容高於之前的畫面 |
| Z 軸向前(穿透縮放) | 深入同一個想法 |
| Z 軸向後(反向縮放) | 抵達 — 更大、更重要的東西登場 |
| 尺度爆炸(向外爆開) | 離開一個世界 — 一個表面向鏡頭爆裂開來 |
- 絕不連續使用方向相反的接縫 — 來回擺盪會讓人感覺像錯誤。
- 方向改變需要一個可見的原因(點擊/彈跳/撞擊)或一個章節邊界。
向量分類帳
在編寫任何主時間軸之前,先撰寫此分類帳 — 作為專案根目錄下的 ledger.json(結構定義:references/seam-gate.md)。每個接縫一行:剪輯時間、退場和進場向量(軸向 + 有符號的方向;Z 軸行需攜帶縮放符號)、選擇器、技術。退場和進場必須匹配;如果某一行不匹配,修正計劃,而不是修正緩動曲線。驗證器會在任何運行時取樣之前,靜態地檢查行的 consistency。
載體元素
眼睛跟隨的是物體,而不是抽象概念。最強的接縫會將一個具體的載體元素在匹配的位置和速度下傳遞過剪輯點:一個處於移動路徑中的游標、一個縮小/嵌入到下一個佈局中的容器、一個飛入其精確位置的標記、瀑布式剪輯中的詞組。如果沒有天然的載體,則由場景主角來承擔(部分移動 + 早期淡出,進場時已在半空中)。絕不使用交叉淡入淡出 — 它完全沒有載體。
因果運動
連結運動,使每個動作都明顯地由前一個動作觸發:點擊 → 擠壓 → 釋放彈簧 → 飛行 → 撞擊 → 反彈 → 揭示。
- 效果在觸發的影格上開始 — 同一時間軸位置,絕不「稍後」。
- 反應與預期的質量成比例:大元素反彈較慢,小元素反彈較快。
- 一個力是改變方向的許可;一個無原因的翻轉就是來回擺盪。
接縫閘門(建置閘門 — 執行驗證器,退出碼為 0 否則接縫未完成)
node <SKILL_DIR>/scripts/seam-stamp.mjs --ledger ledger.json --write index.html # 生成
node <SKILL_DIR>/scripts/seam-gate.mjs verify --ledger ledger.json --project . # 驗證
該腳本(使用方式 + 分類帳結構定義:references/seam-gate.md)以數值方式強制執行每個接縫的下列檢查:分類帳列 consistency、退場時仍在移動、進場時已在半空中(絕非從靜止開始)、測量到的方向 = 分類帳方向、進場/退場速度匹配(WARN)、零重疊(每個影格僅可見一側 — 剪輯點不是溶解效果)、Z 軸符號規則(d(scale)/dt 在兩側符號相同;會掃描進場場景自身的進場動畫以檢查符號衝突)、以及包含祖先縮放比例的載體矩形連續性。在撰寫分類帳時,使用 seam-gate.mjs probe --t <cut> 來找出每個接縫真實的載體選擇器。
腳本無法檢查的規則 — 仍由您負責:
- 編輯會重新打開接縫。 對場景首尾 ~1 秒所做的任何更改(包括根據新的配音重新調整時間),都會使該邊界的審計失效 — 請重新執行驗證器。
- 音訊是時鐘。 根據配音的真實單詞時間戳來調整場景時間;絕不為了配合時間槽而催促一段朗讀。配音重新生成會重新打開其接縫。
- Clip-gating 陷阱(零重疊 FAIL 的常見原因):一個
data-start早於其進場補間動畫的 clip,會以其初始透明度解除隱藏 — 請設定初始autoAlpha: 0以及data-start= 剪輯時間,絕不能更早。
第二部分 — 表現(場景持續表演)
禁止空轉擺動
禁止將空轉的正弦循環(呼吸、漂浮、漂移、光暈脈動)作為持續運動 — 它們會讓人覺得「影片正在等待」。一個完成進場後還有好幾秒空檔的場景是規劃上的錯誤:增加故事內容,而不是增加擺動。進場和退場之間的每個階段都歸屬於以下其中一條路線(在計劃中指明路線):
| 路線 | 說明 |
|---|---|
| 分階段揭示 | 保留部分內容;在旁白節拍上揭示它 — 畫面不斷獲得新資訊(適用於 ≥2 個內容群組的預設選項) |
| 有意圖的鏡頭 | 一個映射好的縮放+平移路徑:建立廣角 → 移動 → 到達主體上 |
| 序列化 UI 生命週期 | 產品隨時間表現:進度條前進、高亮步驟、計數器跳動 |
| 動畫序列 | 元素演出一個節拍:一張卡片歸檔到堆疊中、一個項目被拖動、一個結果組合完成 |
| 游標引導動作 | 一個超大游標引導眼睛到一個觸發器;它的點擊引發下一個節拍(oversized-cursor) |
測試:在任何一秒暫停 — 必須有一些有意義的事情正在進行中(一個揭示正在落地、鏡頭正在移動、UI 正在執行旁白所述的動作)。
高潮前的靜止
在主要動作和其結果之間安排一個 0.3–0.75 秒的停頓 — 戲劇性的逗號。一個從動作直接跳到結果的場景會失去這種張力。
時間意圖
- 單一進場 ≤ ~800ms;更長的鋪墊 = 多元素交錯,而不是一個緩慢的元素。
- 退場 ≈ 進場的 75%。例外:
cut-the-curve反轉此規則(進場 ≈ 退場的 127%)。 - 總交錯時間 ≤ 500ms;對於 8 個或更多元素,縮短每個項目的延遲,或只交錯前幾個元素。
- 禁止的緩動:
bounce.out/elastic.out。進場超越back.out(1.4–1.7)是允許的。 - 相似元素共享一個緩動 + 持續時間意圖 — 絕不為每個元素設定獨特的配對。
過渡詞彙
每部影片僅使用 2–3 種場景間過渡,並重複使用它們;預設邊界是沿主要流向方向的曲線切割。手寫的共享元素變形(intent: morph)不計入此預算。
反模式
| 不要這樣做 | 應該這樣做 |
|---|---|
| 各自獨立編寫每個場景的進場 | 先撰寫向量分類帳 |
| 在場景之間使用交叉淡入淡出 | 沿主要流向方向進行曲線切割 |
| 退場完成,然後場景才切換 | 兩側都在運動中進行剪輯 |
| 剪輯後進場從靜止開始 | 在概念路徑上完成 ≥50% 的進度時再進入 |
| 反向縮放退場 → 從小變大進場(或推進 → 超大回縮) | 匹配縮放速度的符號(接縫閘門規則 7) |
| 進場場景在 Z 軸接縫交接下有自己的彈出介紹 | 保持其開場畫面已組裝好,或匹配符號 |
| 用空轉擺動/呼吸/漂浮來填充時間 | 指定一個持續運動路線;或增加故事內容 |
| 沒有原因的轉向 | 使用一個力,或保持主要流向 |
| 為了變化而使用保留向量 | 預設使用主要流向;只有在有意義時才動用保留向量 |
| 反應比原因晚幾個影格 | 同一個影格觸發 |
| 動作直接跳到結果 | 安排高潮前的靜止(0.3–0.75 秒) |