Live2D 影片逐幀分析:從像素推回 Rigging 結構
這次我用兩段公開的 Live2D 展示影片做練習:一段集中在短裙裙襬,另一段是全身模型 showcase。目標不是重建原模型,也不是猜出 Cubism 專案裡的真實參數,而是回答一個比較實用的問題:
如果只能看到渲染後的影片,可以從哪些變化推回 rigging 結構?
結論先說:有用,但要把它當成 proxy。影片能告訴我們哪些部位有相對位移、哪些變形可能被拆成獨立參數、哪些區域需要 physics 或多層 deformer;它不能直接取代原始 .cmo3 或 Cubism 參數表。
分析方式
流程很單純:
- 從 X 貼文解析影片並下載。
- 用 CDP 開頁保存上下文截圖。
- 把影片逐幀讀入,針對模型區域切 ROI。
- 用顏色、亮度或白底差異做 segmentation。
- 每幀量輪廓、bbox、中心點、區域寬度、frame diff energy。
- 把這些數值轉成 proxy curves,再對照 keyframe sheet。

這張圖只放測量曲線,不重貼第三方影片畫面。曲線本身足夠用來觀察節奏、延遲與局部變形責任。
Clip A:裙襬局部變形
第一段影片很適合看單一問題:短裙下緣怎麼擺動、展開、扭轉。
逐幀追蹤後的主要數值:
| Proxy | 觀察範圍 | 意義 |
|---|---|---|
hem_center_delta | -16px 到 +15px | 裙襬下緣左右擺動 |
hem_width_delta | -8px 到 +41px | 下緣展開與收合 |
twist_px_delta | -16.5px 到 +15px | 下緣相對上緣的水平扭轉 |
skirt_area_delta | 約 -2399 到 +2396 | 可見面積變化 |
最關鍵的是 sway 和 twist 幾乎同步,相關係數約 1.00。這代表影片裡看到的不是整片裙子平移,而是下緣相對腰線做剪切。腰線附近保持穩定,下緣和荷葉邊承擔較大的位移。
相反地,spread 和 abs(sway) 的直接相關很弱,表示展開不只是「左右擺越大就越開」的線性結果。它比較像另外一個 flare / panel 參數,偶爾在極端姿勢或手動 scrub 時被拉開。
我會把這類裙子拆成:
WRP_Skirt_Base:腰線附近,負責錨定,不做大幅左右漂移。WRP_Skirt_Lower:下緣剪切與 sway。WRP_Skirt_Panel_L/R:左右布片不對稱展開。WRP_Skirt_Fril_L/R:荷葉邊細節,適合接小幅 physics。
參數則不要全部塞進一個 ParamSkirtX。比較穩的拆法是:
ParamSkirtSwingX:主控下緣左右剪切。ParamSkirtSpread:主控裙襬寬度、外擴、布片打開。ParamSkirtTwist:如果左右布片摺疊很明顯,再獨立出來;否則可由 panel deformer 吸收。
這裡學到的重點是:裙襬的好看不只來自左右擺,而是上緣穩、下緣大、邊緣慢半拍。
Clip B:全身 showcase
第二段影片比較複雜。前半是近全身展示,後半切到腿部、胸口、臉部 close-up。因此我只把 0.0s-28.7s 當成全身段來看,後段只看局部動態能量。
近全身段的主要 proxy:
| Proxy | 相對中位數範圍 | 意義 |
|---|---|---|
center_x | -12px 到 +18.5px | 全身 root 左右位移 |
lower_shear_px | -40px 到 +51.5px | 下半身相對腰線的剪切 |
hip_width | -74px 到 +151px | 裙 / 髖部外擴 |
bbox_h | -43px 到 +59px | scale / camera crop proxy |
這組數字很清楚:root sway 其實不大,但 lower shear 很大。也就是說,全身展示的活感不是靠整個模型左右搖,而是靠階層差:
- root 只做小幅 pose center。
- torso / hip 有相對位移。
- skirt panel 和外層布料再放大動作。
- 頭髮、袖子、裝飾層用延遲補出次級動作。
我另外把 silhouette 粗分成 head / upper / skirt / legs 四區,量 frame-diff energy。中位數如下:
| 段落 | Head / Hair | Upper | Skirt | Legs |
|---|---|---|---|---|
| 近全身 | 21.47 | 17.17 | 13.48 | 7.00 |
| Close-up | 28.79 | 21.86 | 19.83 | 18.50 |
全身段裡頭髮能量是腿部的約 3.07x。這說明大型側髮不是裝飾貼圖,而是模型生命感的主動來源之一。實作時應該拆成 main mass 和 detail locks:
WRP_Hair_Main_L/R/Back:大髮束,延遲較重。WRP_Hair_Detail:前髮、小髮束,延遲較輕。WRP_Hair_Shadow:陰影和遮擋要跟著主髮束,但幅度小一點。
兩段放在一起看
這兩段影片的共同訊息是:Live2D 的變形不是「一個參數拉一整塊」。比較好的模型通常有三層節奏:
- Root 層:小幅、穩定、負責姿勢方向。
- Body / Cloth 層:相對 root 有更大的剪切和展開。
- Detail / Physics 層:髮尾、荷葉邊、袖口、裝飾物延遲回位。
對 Cubism 來說,這可以整理成一組基本 hierarchy:
WRP_Body_Root
WRP_Torso
WRP_Chest
WRP_Sleeve_L / WRP_Sleeve_R
WRP_Hip
WRP_Skirt_Base
WRP_Skirt_Panel_L
WRP_Skirt_Panel_R
WRP_Skirt_Fril_L / WRP_Skirt_Fril_R
WRP_Head
WRP_Face_Expression
WRP_Hair_Main
WRP_Hair_Detail
參數上則可拆成:
ParamBodyAngleX/Y/Z:全身 pose 與 torso 傾斜。ParamHipShiftX:腰到髖部的 counter motion。ParamSkirtSwingX:裙襬下緣剪切。ParamSkirtSpread:裙襬外擴與布片展開。ParamHairFront/Side/Back:物理輸出或 keyform driven 的髮束跟隨。ParamBreath:胸口、衣料陰影、袖子 anchor 的小幅同步變化。ParamEyeSmile / EyeOpen / MouthOpen / MouthForm:close-up 時真正能被看見的表情 payoff。
實作時的驗收點
如果我要用這次觀察回頭做自己的模型,我會這樣驗收:
- root 左右位移不要太大,否則會像整張圖在漂。
- 下緣、髮尾、袖口的振幅要比錨點大。
- spread 不要完全綁死在 sway 上,否則布料會太機械。
- physics 只加在外層細節,不要直接拿來修整個 body pose。
- close-up 前要先確定眼嘴表情、胸口陰影、頭髮遮擋都有獨立層。
尤其是裙襬:先做一個乾淨的 SwingX,再加 Spread,最後才加 frill physics。順序反過來會很難 debug,因為每一層都在替上一層掩蓋問題。
目前限制
這套分析目前仍有幾個限制:
- 數值都是 rendered pixels 推出的 proxy,不是真實 Cubism parameter。
- 全身影片後半有 camera crop,bbox 寬高會混到鏡頭移動。
- 左側參數面板的粉紅 slider handle 可以偵測,但還沒有 OCR row name,因此不能當 ground truth。
- 若能取得
.cmo3或 runtime model,直接 probing 會比影片推論可靠。
下一步如果要把這件事做得更像工具,我會補三個模組:OCR 對應參數列、slider handle 時序追蹤、右側 deformation curve 對齊。到那一步,就能從「觀察影片」進到「半自動反推 motion recipe」。