motion-video · 用程式碼做能驗收的動畫 是做什麼的?
這份 skill 解決一個很具體的問題:小模型(Flash / mini / turbo 類)能寫 CSS 和 Canvas, 但寫出來的動畫經常「看起來寫了,其實沒動」——中間態被跳過、緩動是假的、 關鍵元素在別的時刻才出現、結尾停在半路。它自己看不出來,因為它沒有眼睛。
所以這裡的做法不是「教它寫得更好看」,而是把動畫變成可被機器判定的工程物:
- 先規格、後程式碼 —— 把審美判斷翻譯成表格裡的數值
- 畫面必須是
t的純函數 —— 從結構上強迫它寫出中間態 - 數字交給腳本算 —— 貝塞爾、彈簧、錯開步長、對比度,一律跑工具,不心算
- 用確定性渲染器逐幀出圖 —— 同一份程式碼永遠同一幀
- 用機器驗收 —— 數值層先驗一遍,像素層再驗一遍
- 只在機器說「結構沒問題」之後,才輪到人眼看構圖
差距不是靠一句咒語補上的。是靠這六件事把「想不對」變成「可發現、可修」。 差距從哪來、哪些補得上、哪些補不上,見 references/delta-vs-opus.md。
品質優先:只省無效開銷,不省驗證
這條比下面的鐵律更靠前。 這個 skill 的目標是做出 Opus 級的片子,不是做出最便宜的片子。 所以「要不要做這件事」的判斷標準不是快不快,而是會不會更好。
只有一類開銷可以省:重複的、無效的、互相搶資源的。驗證密度、渲染品質、幀率、 運動模糊——這些一律不省。
允許省(浪費,省了不加分也不減分)
| 浪費 | 省法 |
|---|---|
| 起 4 個 Chrome 併發搶 CPU | 串行(實測比併發快),render.mjs 已內建單實例鎖 |
| 每章一份 20KB 規格文件 | 一份 storyboard.md 寫全 |
反覆調 render --still 每次只抽一幀 | 一次抽 6–8 個時間點 |
| 同一素材反覆重新分析 | 分析一次,結果寫進 storyboard |
| 逐幀 PNG 落盤再讀 | 已開 optimizeForSpeed;超大專案改 image2pipe(cinema-grade.md §9) |
| 為了「穩妥」把同一件事驗證三遍 | 驗證兩遍(數值 + 像素)就夠,第三遍加不出資訊 |
禁止省(省了就是降質)
| 不許省 | 理由 |
|---|---|
全量 audit,含 jump / flat 逐條處理 | 交付前最後一關,跳過 = 沒驗收 |
verify --idempotent | 冪等壞了,後面所有驗證都不可信 |
rigcheck(每次改角色或姿態) | 骨骼錯位只能靠數字抓,眼睛抓不到 |
| 交付版開運動模糊 | 有沒有快門的觀感差一個檔次,不是錦上添花 |
| 有快速運動時用 60fps | 30fps 下快速肢體會頓,這是缺陷不是取捨 |
| 抽幀看圖(多時刻 + 局部放大) | 1 張圖看不出中段問題;至少 6 幀 + 關鍵部位 2–3× 放大 |
| 修完重跑(而不是「應該好了」) | 沒重跑就等於沒修 |
一句話判據
省下的是等待時間,可以省;省下的是「發現錯誤的機會」,不能省。
渲染 70 分鐘不可接受,原因不是「70 分鐘太長」,而是那 70 分鐘裡 85% 是 4 個進程在互相搶 CPU ——等待沒有換來任何品質。而為了 180° 快門多花 4 倍渲染時間,換來的是實打實的觀感提升 ——這筆必須花。
正確的提速順序
- 先殺浪費:併發改串行、合併重複啟動、刪冗餘文件、批量抽幀
- 再優化實現:截圖參數、單進程多 tab、不落盤直通編碼
- 最後才考慮減少驗證 —— 而這一步基本不該發生;真發生了說明前面兩步沒做
鐵律
違反任何一條,產物就是不可驗收的,重做。
- 沒有規格不許寫程式碼。 先產出鏡頭表和時間軸表(STEP 1)。表格裡每個元素必須有
enter/active/exit三個時間區間,缺一個就說明你還沒想清楚它在什麼時候存在。 但用戶只給一句話時(「做個厲害的」「展示你的能力」「全力以赴」),不許反問他做訪談—— 自己把母題/元敘事/形式/檔位四個槽位填滿並寫進storyboard.md,然後直接開工。 見 references/wish-mode.md。 - 所有畫面狀態是
seek(t)的純函數。 禁止requestAnimationFrame、Date.now()、performance.now()、Math.random()、自增計數器、以及自己會跑的 CSS@keyframes/transition。 同一份程式碼同一個t,必須永遠渲染出同一像素。 - 數值一律跑腳本,禁止心算。 曲線控制點、彈簧參數、錯開步長、座標換算、對比度比值、
linear()串——全部由ease.mjs產出。你的回答裡出現這類數字之前,必須先有一條工具輸出。 見下面「數字歸工具,判斷歸你」。 - 改完必須跑
verify和render + audit。FAIL不許交付。WARN要逐條給出 「改」或「這是設計內的,因為…」。不許跳過verify直接渲整片——多花 8 秒只換來一個 笨不知原因的「畫面沒動」。 - 交付三件套:成片(mp4/webm/gif)+ 接觸表(-sheet.png)+ audit 結論。
- 審美拿不準就給候選,別猜。 兩個配色、兩種節奏,讓用戶選,比交付一個平庸版本強。
- 不許等素材,自己畫。 交付物裡不許出現「建議插入圖片」「此處放圖」「等素材到位後」。 渲染管線只有 HTML/CSS/SVG/Canvas——所有視覺元素只能由程式碼產生。 需要光效/紋理/圖形/圖示時先查 references/asset-recipes.md (20 類現成片段,可直接貼上:光暈、掃光、顆粒、玻璃卡、霓虹、網格、抽象插畫、粒子、 線框球、圖表、城市剪影、故障風、掃描線、圖示集、光束、景深、布紋、散景、偽 3D), 沒有再自己寫 SVG path。禁止用 emoji 或 unicode 符號充當圖形。 每個畫面至少三層(背景漸變/網格 → 主體 → 氛圍顆粒/散景),至少 2 個自建視覺元素、 1 處深度線索(陰影/漸變/疊色/顆粒)。只有一層、只有文字和色塊的畫面 = 不合格。
- 既有資產優先,禁止重建。 工作空間裡如果有已經拼好的骨骼/規範/組件/設計稿,
必須整套沿用,一個數值都不許重估。用
rigcheck.mjs --ref證明你用的是原值。 事故記錄:某次重建把head.pos從[-6.8,-182.5]改成[0,-248](偏 65.9px)、torso.pv從[160,160]改成[160,291](偏 131px),效果是頭飄在身體左側, 而「看圖檢查」沒看出來——因為人眼會把它讀成「一個角色」。這類錯必須用數字查。 - 素材白名單。 只用
storyboard.md裡明確列出的素材。工作空間裡別的檔案 (上一版產物、無關角色的圖、別的專案的配置)一律不許碰,哪怕它看起來能用。 需要新素材時在 storyboard 裡加一行並說明用途,再找。 - 驗收不放水,也不許併發渲染。
audit報 WARN 不等於「可以交」:硬跳變(jump)與純色幀(flat)必須清零或逐條解釋, 否則重做。verify/rigcheck有 FAIL 一律不許繼續。 渲染一次只跑一個render.mjs進程——腳本帶單實例鎖,併發只會互相搶 CPU。 要並行就在一個 Chrome 裡開多 tab(見 cinema-grade.md §9),不是起多個進程。
數字歸工具,判斷歸你
這一類模型(Flash / mini / turbo)有個共同傾向:寧願自己估,也不肯調工具。 它覺得心算零成本、工具要等。這個成本帳是錯的,先用數字把它算清楚:
| 心算 | 調 ease.mjs | |
|---|---|---|
| 直接耗時 | 0 秒 | 約 0.3–0.5 秒 |
| 一次算對的機率 | 三四十(貝塞爾控制點猜錯一位,整條曲線性質就變了) | 100 |
| 錯了代價 | 渲 90 幀 ≈ 8 秒 + 審圖,而且很可能看不出錯,只是「就是不夠絲滑」 | 0 |
| 期望成本 | 0 + 0.5 × (8 + 30) ≈ 19 秒,且品質靜默下降 | 0.5 秒 |
心算省下的 0.5 秒,是最貴的那種省法。所以這裡是硬要求,不是建議:
下列數字一律來自工具輸出,不許在回答裡手寫推斷值:
| 要什麼 | 跑什麼 |
|---|---|
| 任意貝塞爾的性質(過衝、平台、取樣表) | node scripts/ease.mjs cubic 0.22 1 0.36 1 |
| 彈簧參數(回彈多少、多久停、會不會中途停) | node scripts/ease.mjs spring 120 14 1 1.2 |
把曲線壓成 CSS linear() | node scripts/ease.mjs css-linear --preset silkIn |
| 一組元素的錯開步長、會不會超出總時長 | node scripts/ease.mjs stagger 7 2.4 0.5 |
| 文字對比度是否達標 | node scripts/ease.mjs contrast "#0b0e14" "#6d8bbd" |
| 由底色生成可讀灰階 | node scripts/ease.mjs ramp "#0b0e14" 5 |
自檢三問(交付前問自己,答不上就是違規):
- 我回答裡的每個曲線參數,能指向上一條命令的輸出嗎?
- 我有沒在哪一行寫下了「大概 0.3 左右」這種估出來的數?有 → 刪掉,跑命令。
- 我說「這條曲線很絲滑」,是因為我看了
ease.mjs打的 ASCII 圖和過衝百分比,還是因為我猜?
它也想自己驗,那就用驗算器讓它放心:verify.mjs 讀的是真實計算樣式,
不是推測。它想「確認一下」的時候,正確動作是跑 verify,不是在自己腦子裡模擬一遍。
環境
零 npm 依賴。需要 Chrome 或 Edge(本機已有)+ ffmpeg + ffprobe。
ffprobe 只有 audit 校驗解析度/時長時用。缺了不會靜默放行:宣告了 --width/--height/--duration 就 FAIL,沒宣告則 WARN 並列印「解析度未知(未校驗)」。
node scripts/render.mjs --check # 列印 chrome / ffmpeg / node / WebSocket 能力
輸出裡 chrome 是 NOT FOUND 時,用 --chrome <path> 指定,或先裝一個瀏覽器。
沒有圖像理解時怎麼辦
有些模型(例如純文字推理版本)不能 read_image。這套鏈路的判定全部是數字,不是圖片,
所以仍然能走完:ease(參數)→ verify(數值軌跡 + 冪等)→ audit(像素統計,結論就是數字)
→ rigcheck(幾何斷言)。
- 能做:結構、運動、幾何、可讀性
- 做不到:構圖好壞、配色協調、風格統一、視覺穿模
後者必須交給能看圖的人或視覺模型。但可以推遲到最後:先用數字把能抓的錯全抓掉,
再一次性給人看 6–8 幀(--still 批量抽 + --guides 疊加安全區)。
文件索引(按需讀,別一次全讀)
| 文件 | 什麼時候讀 |
|---|---|
| references/wish-mode.md | 用戶只給一句話時先讀這個:四槽位、章節推導、預設值表、許願模式下不許做訪談 |
| references/spec-and-prompt.md | STEP 1 寫規格表時;要可複製的 prompt 模板時;對付「不願調工具」的模型時 |
| references/code-patterns.md | STEP 2 寫程式碼時:seek(t) 典範、緩動庫、keys() 關鍵幀表、spring(f,z)、SVG/Canvas、20 種現代 CSS 效果 |
| references/asset-recipes.md | 畫面缺東西時第一時間翻:光暈、掃光、顆粒、玻璃、霓虹、網格、插畫、粒子、線框球、圖表、圖示集、散景、偽 3D |
| references/rig-characters.md | 畫面裡有角色要動:部件 + 父子變換鏈 + pose 表 + 12 條原則怎麼落到字段上 |
| references/cinema-grade.md | 定稿前:運動模糊、編碼參數(抗色帶)、暗角、HUD 系統、甩鏡、幀率選擇、長片組織、並行提速 |
| references/review-checklist.md | STEP 5 人眼抽檢 + 交付前逐條過 |
| references/failure-modes.md | audit/verify 報錯時對號入座 |
| references/delta-vs-opus.md | 想知道「這套東西到底能補到哪一步」、要判斷該不該換模型時 |
先分流:許願,還是下需求
| 輸入長什麼樣 | 走哪條路 |
|---|---|
| 給了尺寸/時長/內容/風格中的多數;或在回答你的追問 | 規格模式:STEP 0 問清楚 → STEP 1 規格表 → … |
| 一句話 + 授權語氣(「做個厲害的」「展示你的能力」「就像某類片子那樣」「全力以赴」) | 許願模式:跳過 STEP 0,不許反問。先掃工作空間找母題,自己填四個槽位,然後從 STEP 1 起走。見 wish-mode.md |
判據很簡單:他沒說清楚的,是「等我問」還是「你定」? 語氣裡帶「你看著辦/全力以赴/展示給我看」就是後者。
許願模式同樣要寫 storyboard.md —— 區別只是那張表由你寫,不是問來的。
工作流
STEP 0 · 問清楚三件事(僅規格模式;許願模式跳過)
- 用途:投影片頭 / 社交短影片 / 網頁 hero 動效 / 講解插片 / 數據增長動效 / GIF
- 尺寸與時長:見下表預設值,除非用戶明確要求
- 情緒:穩(企業/金融)、快(科技/發布)、柔(生活/品牌)、硬(遊戲/運動)
| 用途 | 尺寸 | 時長 | 幀率 | 格式 |
|---|---|---|---|---|
| 片頭 / 發布會 | 1920x1080 | 3–6s | 30 | mp4 |
| 社交豎屏 | 1080x1920 | 5–15s | 30 | mp4 |
| 網頁 hero / banner | 1920x800 或 1440x600 | 2–4s,可循環 | 30 | webp / apng(要透明);webm 需先驗 alpha |
| 數據動效 / 圖表 | 1920x1080 | 3–8s | 30 | mp4 |
| 循環動圖 | 800x800 / 1080x1080 | 1–3s,必須能無縫循環 | 15–20 | gif / webp |
| 講解插片 | 1920x1080 | 每鏡 2–5s,整片再拼 | 30 | mp4 |
超過 10 秒或超過 3 個鏡頭:拆成多個場景檔案,每個單獨渲染單獨驗收,再用 ffmpeg 拼接。
不要讓一個 seek() 管 30 秒——那樣不會有人能自查。
STEP 1 · 寫規格(唯一允許的自由發揮環節)
產出 storyboard.md,兩樣東西缺一不可:
① 鏡頭表
| # | 時間 | 畫面在做什麼 | 主要運動 | 收尾狀態 |
|---|---|---|---|---|
| 1 | 0.00–1.10s | 標題逐字上浮 | y: +96→0, 每字錯開 75ms | 標題就位 |
| 2 | 1.10–2.40s | 進度線鋪滿 + 三點彈出 | scaleX: 0→1(緩入緩出) | 線到邊、點齊 |
② 元素時間軸表(每個元素一行,這是後面程式碼的唯一依據)
| 元素 | enter | active | exit | 屬性 | 曲線 |
|---|---|---|---|---|---|
| #title span | 0.15 + i*0.075 | 到片尾 | — | translateY 96→0, opacity 0→1 | easeOutCubic |
| #bar b | 0.30 | 0.30–2.40 | — | scaleX 0→1 | easeInOutCubic |
| .dots i | 1.50 + i*0.15 | 到片尾 | — | scale 0→1 | easeOutBack |
寫不出這張表 = 你還沒想清楚。不要跳過它去寫程式碼,寫出來一定是「只有首末幀」。
「曲線」這一列不是讓你寫個名字就完事。 定了名字之後立刻跑一次工具,把「這條曲線 在你這個時長下會怎樣」釘死,然後把這行補成帶數值的形式:
node scripts/ease.mjs cubic 0.33 1 0.68 1 # easeOutCubic → 看平台段/過衝
node scripts/ease.mjs stagger 6 2.4 0.7 # 6 個標題字在 2.4s 內、每個 0.7s → 步長與溢出
於是表格裡那兩行變成:
| 元素 | enter | active | exit | 屬性 | 曲線(工具確認) |
|---|---|---|---|---|---|
| #title span | 0.15 + i*0.075 | 到片尾 | — | translateY 96→0, opacity 0→1 | cubic-bezier(0.33,1,0.68,1),過衝 0%,0.75 後有平台段 → 時長壓到 0.7s 內 |
| .dots i | 1.50 + i*0.15 | 到片尾 | — | scale 0→1 | spring(120,14) 過衝 7.1%,0.67s 穩定 → 段長給 0.75s |
好曲線的判據(工具會直接告訴你):過衝 ≤ 15%、沒有中段平台、彈簧的穩定時間 不超過段長。任何一條不滿足,換參數再跑一次,而不是「先這麼寫,渲出來看看」。
模板與更多典範: references/spec-and-prompt.md
STEP 2 · 實現
從骨架開始,不要一次寫完整個場景。骨架 = 背景 + 一個元素能動 + seek 契約通。
window.scene = {
duration: 3.0, fps: 30, width: 1920, height: 1080, ready: true,
seek(t) {
// 每個元素:把「時間軸表裡那一行」逐字翻譯成 3 行程式碼
// k = 曲線(seg(t, enter, enter + 持續)) → 用 k 插值屬性
},
};
必須內聯 CSS 和 JS。不要引外部 CDN(渲染時會斷網般失敗),
字型用系統字型("Segoe UI", "Microsoft YaHei", Arial)。
可用典範(DOM/CSS/SVG/Canvas/GSAP/Web Animations、緩動庫、多段編排、文字逐字、
路徑描邊、數字滾動、遮罩轉場、CSS linear()、filter/blend-mode/mask 用法):
references/code-patterns.md
需要畫東西的時候(光效、紋理、圖形、圖示、圖表、插畫、偽 3D),先翻
references/asset-recipes.md。那裡有 20 類零依賴片段,
都能直接粘進單檔案 HTML 並接受 seek(t) 驅動。不要憑感覺從零造,也不要等素材。
STEP 3 · 數值驗算(先查數字,別急著渲)
這一步是「多驗算」裡最先跑的一環:秒級、不用編碼、還能點名到元素。
# 看每個元素的實際軌跡:誰在動、動到哪、哪兒卡住了
node scripts/verify.mjs --html scene.html --select "#bar b,#title span" --props transform,opacity --steps 31
# 驗證「畫面只由 t 決定」(同一 t 兩次調用必須一模一樣)
node scripts/verify.mjs --html scene.html --select ".item" --idempotent
它會直接告訴你這一類的答案:
⚠ #b[0] · sx — 中途停頓 0–2s 之後又繼續變化→ 這一段插值被拆斷或漏了ℹ #card[0] · (全部) — 這個元素整段沒有任何變化→ 選擇器沒命中 / style 沒寫進 DOM✖ seek 不冪等:13 處同一 t 兩次調用結果不同→ seek 裡用了累計狀態
數值層過了再往下。不要在數值有問題的時候就渲整片——那只會得到一個模糊的 「畫面好像沒動」,然後你要從像素倒推原因。先讓數字說話。
STEP 4 · 渲染 + 像素驗收
先只出關鍵幀,快、夠判斷構圖對不對:
node scripts/render.mjs --html scene.html --still 0.2,1.0,2.2 --out out/stills
看這幾張圖(用 read_image 自己看,別跳)。構圖 OK 再出整片:
node scripts/render.mjs --html scene.html --out out/v.mp4 --fps 30 --sheet
node scripts/audit.mjs --video out/v.mp4 --fps 30 --duration 3 --width 1920 --height 1080
audit 會給你:變化像素曲線、節奏條、以及分級結論。按結論改,一次只改被點名的那一處,
改完立刻重跑 audit。最多 5 輪;第 5 輪還 FAIL 就回到 STEP 1 改規格(說明規格本身錯了)。
常見報錯對號入座: references/failure-modes.md
STEP 5 · 人眼抽檢
機器只保證「結構對」。這幾條要你自己看圖:
- 文字有沒有溢出畫面 / 被裁切 / 和背景撞色
- 視覺重心在不在預期位置(三分法 / 居中 / 元素群的重心)
- 對比度夠不夠(暗背景上 40% 透明度的灰字等於看不見)
- 出入口是否乾淨(有沒有元素在畫面外就開始動、在畫面內突然消失)
清單: references/review-checklist.md
STEP 6 · 交付
# 需要的格式再補一條
node scripts/render.mjs --html scene.html --out out/v.webm --format webm
node scripts/render.mjs --html scene.html --out out/v.gif --format gif --fps 15
交付時給:成片路徑、接觸表、audit 的 verdict 那幾行、storyboard.md。 如果 audit 有 WARN 但你判斷是設計內的,明說是哪一條、為什麼。
定稿版必須開運動模糊重渲一次。
node scripts/render.mjs --html scene.html --out out/final.mp4 --fps 30 --motion-blur 180
這是「看起來順」與「看起來像錄屏」的分界。迭代階段可以暫時關著省時間,
但交付版不許沒有快門——省這個就是在降質。開完重跑一次 audit 確認時長幀數沒被改變。
有快速運動(角色動作、甩鏡、粒子)時,同時上 --fps 60。
命令速查
# 體檢
node scripts/render.mjs --check
# 算數(曲線 / 彈簧 / 錯開 / 對比度)—— 這些不許心算
node scripts/ease.mjs cubic 0.22 1 0.36 1
node scripts/ease.mjs spring 120 14 1 1.2
node scripts/ease.mjs css-linear --preset silkIn
node scripts/ease.mjs stagger 7 2.4 0.5
node scripts/ease.mjs contrast "#0b0e14" "#6d8bbd"
node scripts/ease.mjs ramp "#0b0e14" 5
node scripts/ease.mjs presets
# 骨骼幾何體檢(有角色時必跑;有現成 rig 時必須 --ref 對齊)
node scripts/rigcheck.mjs --rig rig/ander.rig.json
node scripts/rigcheck.mjs --rig lib/rig.json --ref rig/ander.rig.json
node scripts/rigcheck.mjs --rig rig.json --pose '{"head":{"rot":0.2}}' --assert
# SKILL.md frontmatter 體檢(改完 skill 就跑一次,防「整個 skill 載不了」)
node scripts/lint-skill.mjs
# 數值驗算(秒級,能點名元素)
node scripts/verify.mjs --html scene.html --select "#bar b" --props transform,opacity --steps 31
node scripts/verify.mjs --html scene.html --select ".item" --idempotent
node scripts/verify.mjs --html scene.html --all --json
# 關鍵幀(審圖用,最快)
node scripts/render.mjs --html scene.html --still 0,0.5,1.5,2.9 --out out/stills
# 關鍵幀 + 構圖輔助線(100px 網格 / 80px 安全區 / 三分線 / 中心十字)
node scripts/render.mjs --html scene.html --still 1.6 --guides --out out/guides
# 整片 + 接觸表
node scripts/render.mjs --html scene.html --out out/v.mp4 --fps 30 --sheet
# 最終交付版開運動模糊(180° 快門 = 電影標準;渲染 ×4,只在定稿時用)
node scripts/render.mjs --html scene.html --out out/final.mp4 --fps 30 --motion-blur 180
# 有快速運動(角色動作、甩鏡、粒子)才上 60fps
node scripts/render.mjs --html scene.html --out out/final.mp4 --fps 60 --motion-blur 180
# 2x 超取樣(更銳,慢 3–4 倍)
node scripts/render.mjs --html scene.html --out out/v.mp4 --scale 2
# 透明背景:webp / apng / png 可靠
node scripts/render.mjs --html scene.html --out out/v.webp --format webp --alpha
node scripts/render.mjs --html scene.html --out out/v.apng --format apng --alpha
# webm 的 alpha 取決於 ffmpeg 構建。本機實測 VP8/VP9 都會降級成無 alpha,
# 腳本會在編碼後回讀首幀校驗 —— 沒有透明像素就報錯,並告訴你換哪個格式
node scripts/render.mjs --html scene.html --out out/v.webm --format webm --alpha
# 循環動圖
node scripts/render.mjs --html scene.html --out out/v.gif --format gif --fps 15
# 像素驗收
node scripts/audit.mjs --video out/v.mp4 --fps 30 --duration 3 --width 1920 --height 1080
node scripts/audit.mjs --video out/v.gif --loop # 循環接縫檢查
node scripts/audit.mjs --video out/v.mp4 --json out/audit.json
render.mjs 參數:--html --out --fps --duration --width --height --scale --format(mp4|webm|gif|webp|apng|png) --still --sheet --alpha --file --keep-frames --chrome --check --quiet
verify.mjs 參數:--html --select --props --steps --idempotent --all --json
audit.mjs 參數:--video --fps --duration --width --height --loop --json
ease.mjs 參數:cubic <x1> <y1> <x2> <y2> / spring <mass> <stiffness> <damping> [initialVelocity] / stagger <count> <duration> [overlap] / contrast <bg> <fg> / ramp <bg> <steps> / css-linear [--preset name] / presets
rigcheck.mjs 參數:--rig <file> [--ref <file>] [--pose <json>] [--assert]