Live2D 影片逐幀分析:從像素推回 Rigging 結構

· 約 6 分鐘 · #Live2D#技術筆記#研究

這次我用兩段公開的 Live2D 展示影片做練習:一段集中在短裙裙襬,另一段是全身模型 showcase。目標不是重建原模型,也不是猜出 Cubism 專案裡的真實參數,而是回答一個比較實用的問題:

如果只能看到渲染後的影片,可以從哪些變化推回 rigging 結構?

結論先說:有用,但要把它當成 proxy。影片能告訴我們哪些部位有相對位移、哪些變形可能被拆成獨立參數、哪些區域需要 physics 或多層 deformer;它不能直接取代原始 .cmo3 或 Cubism 參數表。

分析方式

流程很單純:

  1. 從 X 貼文解析影片並下載。
  2. 用 CDP 開頁保存上下文截圖。
  3. 把影片逐幀讀入,針對模型區域切 ROI。
  4. 用顏色、亮度或白底差異做 segmentation。
  5. 每幀量輪廓、bbox、中心點、區域寬度、frame diff energy。
  6. 把這些數值轉成 proxy curves,再對照 keyframe sheet。
兩支 Live2D 影片逐幀分析後的 proxy curve 比較

這張圖只放測量曲線,不重貼第三方影片畫面。曲線本身足夠用來觀察節奏、延遲與局部變形責任。

Clip A:裙襬局部變形

第一段影片很適合看單一問題:短裙下緣怎麼擺動、展開、扭轉。

逐幀追蹤後的主要數值:

Proxy觀察範圍意義
hem_center_delta-16px+15px裙襬下緣左右擺動
hem_width_delta-8px+41px下緣展開與收合
twist_px_delta-16.5px+15px下緣相對上緣的水平扭轉
skirt_area_delta-2399+2396可見面積變化

最關鍵的是 swaytwist 幾乎同步,相關係數約 1.00。這代表影片裡看到的不是整片裙子平移,而是下緣相對腰線做剪切。腰線附近保持穩定,下緣和荷葉邊承擔較大的位移。

相反地,spreadabs(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+59pxscale / camera crop proxy

這組數字很清楚:root sway 其實不大,但 lower shear 很大。也就是說,全身展示的活感不是靠整個模型左右搖,而是靠階層差:

  • root 只做小幅 pose center。
  • torso / hip 有相對位移。
  • skirt panel 和外層布料再放大動作。
  • 頭髮、袖子、裝飾層用延遲補出次級動作。

我另外把 silhouette 粗分成 head / upper / skirt / legs 四區,量 frame-diff energy。中位數如下:

段落Head / HairUpperSkirtLegs
近全身21.4717.1713.487.00
Close-up28.7921.8619.8318.50

全身段裡頭髮能量是腿部的約 3.07x。這說明大型側髮不是裝飾貼圖,而是模型生命感的主動來源之一。實作時應該拆成 main mass 和 detail locks:

  • WRP_Hair_Main_L/R/Back:大髮束,延遲較重。
  • WRP_Hair_Detail:前髮、小髮束,延遲較輕。
  • WRP_Hair_Shadow:陰影和遮擋要跟著主髮束,但幅度小一點。

兩段放在一起看

這兩段影片的共同訊息是:Live2D 的變形不是「一個參數拉一整塊」。比較好的模型通常有三層節奏:

  1. Root 層:小幅、穩定、負責姿勢方向。
  2. Body / Cloth 層:相對 root 有更大的剪切和展開。
  3. 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」。

相關文章

← 回到文字