Communitygithub.com

thuann-vn/stick-crowd-mv

製作一個約30秒的豎屏音樂短片,讓一根火柴人在手繪3D街道人群中獨自行走或站立。結合Blender區塊、影像模型重繪投影、程式動畫的百人群眾,並以縮時結尾和歌曲剪接完成。

stick-crowd-mv 是什麼?

這個技能是 painted-3d-short 的擴充,專門在已繪製的3D場景中添加動畫人群。它使用純幾何形狀(六角稜柱肢體和球體頭部)在Blender EEVEE中生成100-200根火柴人,並透過numpy驅動的程式化步態腳本(gait.py)實現無滑步行走。人群管理採用「單一直行車道」規則,避免角色碰撞攝影機或主角;站立角色則有呼吸、重心轉移等細微動作。支援雨天雨傘(三分之一為透明傘面)、手機發光、多盞燈光投影陰影等細節。時間流逝效果讓人群以10倍速移動而主角保持即時速度,並透過6個子幀平均渲染形成動態殘影。適合用於需要角色在繪製世界中行走的音樂短片製作。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/thuann-vn/claude-stickman-crowd-mv/tree/HEAD/stick-crowd-mv

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

火柴人群 MV(繪製3D + 程式人群)

在 example/ 中有實作範例:「人群中的孤獨者」——包含2個越南書街(白天、黃昏)、4個夜晚雨中的日本商店街場景,以及一個結尾縮時鏡頭(攝影機轉向天空)。30秒,720幀,24 fps。

此技能建立在 painted-3d-short(https://github.com/thuann-vn/claude-painted-3d-shorts)之上:其 p3d.py 負責建立區塊、渲染靜態畫面、投影繪畫並在每一幀呼叫您的設定器。請先閱讀該技能。本技能添加人物。

檔案

  • tools/stick.py — 人群。setter = stick.make(globals(), "<location>"),將其傳遞給 render(SHOTS, [setter])。
  • tools/gait.py — 行走動作(僅需numpy,無需Blender即可測試)。
  • tools/post.py — 對渲染幀進行後期處理。
  • example/scene.py、example/book.py — 兩個場景及其鏡頭。example/jobs.json — 重繪提示詞。example/paint/ — 繪畫圖像。example/m2m.json — 靜止片段(Mesh2Motion,CC0)。

工作順序

  1. 先選歌:剪出您要的30秒,找出歌詞時間點,根據這些時間點剪輯鏡頭(在 scene.py 和 stick.py 中的 CUT)。
  2. 完全按照 painted-3d-short 的方式進行區塊建立、靜態幀渲染、重繪、投影。繪畫中不要出現人物。
  3. 在 stick.py 的 SHOTS 中設定每個鏡頭:主角起始位置、方向、walk 或 stand、臉部俯仰、車道半寬、氣泡半徑、邊緣站立的人、橫向行人(cross)。
  4. 測試單幀:NTEST=2 STICK_OFF=<幀數> blender -b --factory-startup -P scene.py -- --proj --shots 4。檢視結果。
  5. 完整渲染(最多3個Blender進程)、執行 post.py、用 ffmpeg 合併影片並加入歌曲片段。
  6. 在宣稱流暢之前先測量:每個鏡頭連續幀之間的平均絕對差值;最大值÷中位數超過約2表示有東西跳動(找出該幀,檢查它)。

人物建構方式(stick.py)

  • 在場景內使用真實幾何體,以便繪製的街道能正確遮擋人物。所有人的肢體=一個由六角稜柱組成的網格,其頂點在每一幀被重寫(numpy → foreach_set)。頭部=帶有攝影機空間三色調賽璐璐著色器+內縮外框的球體。200人在EEVEE中每幀渲染時間遠低於1秒。
  • 頭部中心位於頸部線上(neck + dir × radius × 0.86),否則頭部會浮在身體外。
  • 燈光:每個位置有一組燈光(位置、顏色、強度)。每個頭部將其總和作為物件顏色;以最大通道歸一化,不進行裁切(裁切會使所有東西變白)。投射陰影=同一個肢體網格從最近的頭頂燈光投射到地面(長度被裁切),或在日光下沿太陽方向投射;再加上柔和的接觸斑塊。
  • 雨傘(雨天):每個人一個8片式圓頂物件,顏色來自物件顏色,三分之一為透明塑膠傘面;右臂重新調整姿勢以握住傘柄;傘篷投射圓形陰影。主角沒有雨傘。
  • 手機:左手靠近耳朵,一個貼在臉頰旁的薄片,夜間會發光。
  • 雨水:在鏡頭前方一個由薄型面向攝影機的四邊形組成的盒子,距離至少1.9公尺。

行走動作(gait.py)

在線條人物上使用動作捕捉會顯得雜亂(從脖子根部伸出的手臂張開過寬,手部噪點多)。因此行走動作為程式生成:

  • 腳部固定:支撐腳在身體通過時保持在其位置上;地面位置由行走距離決定,因此任何速度都不會滑步(測量結果:每幀<0.2毫米)。
  • 臀部在支撐腿一側抬高,在雙腳支撐時降低;使用二骨骼腿部反向運動學,膝蓋朝前。
  • 手臂從頸部貼近身體垂下,與腿部反向擺動;頭部保持穩定。
  • 規格:normal、stroll、brisk(步幅、節奏、手臂擺動、身體前傾因人而異)和 hero(短步、低頭、手臂下垂)。真實節奏:漫步80–105步/分鐘,正常105–125,快走125–140。

付費買來的人群規則

  • 每個步行者在整個鏡頭中只有一條直行車道。 在鏡頭內轉向(繞過主角、繞過鏡頭)會使人側向衝刺。反之,在鏡頭開始前,模擬每個步行者在整個鏡頭中的路徑,如果他要進入主角的空白圓圈、靠近鏡頭、或站在鏡頭與主角之間,就將他的車道偏離一次。
  • 循環必須在視線之外進行包繞。 從攝影機後方約6公尺到前方約50公尺處填滿街道,僅在包繞處淡出。在畫面內包繞會讓人看起來像在瞬間跳到另一個位置。
  • 絕不縮小或淡出畫面內的人物。
  • 能解讀為「擁擠」的密度:在寬6公尺的街道上,每公尺2–2.7人。
  • 一個帶有兩個關鍵幀的姿勢片段如果持續循環會使人物抖動:請保持它(timeScale = 0)。
  • 站立的人絕不會靜止:呼吸、緩慢的重心轉移、轉頭。
  • 情侶並肩行走,使用相同規格,相差半個週期。

時間流逝(整部影片)

  • 在每個鏡頭中,人群的時鐘以10倍速度運行(LAPSE,warp());只有主角活在即時時間中。這種對比是這部影片的核心理念。
  • 每幀渲染6個子幀(SUB;在 scene.py 中鏡頭的幀數×6);post.py 在線性光中將它們平均,因此人物變成拖影,燈光保持明亮。30秒 = 4320次渲染,在三個Blender進程上約需25分鐘。

繪畫內的攝影機移動

投影繪畫只能承受小幅的前推鏡頭。但渲染攝影機可以在繪畫內自由地旋轉、推近和滾轉:純旋轉不會產生視差。stick.py 中的 CAMK 儲存每個鏡頭的關鍵幀——(鏡頭片段、縮放、平移、俯仰、滾轉、對準主角)——在 p3d 的 look() 之後套用;平移和俯仰被限制在縮放留下的空間內,滾轉後的幀會被縮放到剛好能留在畫面內。為每個鏡頭賦予一個有理由的移動:

  • 從近拍他開始,仰視並拉開,揭示擁擠的街道;
  • 當他朝我們走來時,緩慢推進到他的臉部;
  • 從霓虹招牌往下進入街道,直到我們找到他;
  • 一個傾斜的地平線,然後在推進時穩定下來;
  • 橫掃經過的雨傘,最後落在他身上;
  • 俯拍:緊拍裸露的頭頂,旋轉,越過雨傘拉開;
  • 結尾:一個非常廣角的畫面(14mm,朝上約20°瞄準)和一個28mm的渲染攝影機,從他俯仰到天空。

如果需要環繞或真實的吊臂移動,則為該鏡頭繪製一個額外的寬幅畫面。

後期處理(post.py)

對真正明亮的部分添加輝光、暗角、顆粒(暗處更強)、輕微色差、緩慢的手持晃動(不在時間流逝鏡頭中)、每個剪輯時的推進+閃爍,以及配合歌曲鼓點的小幅縮放和發光脈衝(音訊的低頻段,逐幀處理)。保持每個效果微小;結合起來就足夠了。

音樂

使用您擁有版權的音樂;此倉庫中不包含任何音訊。CLIP=/path/clip.m4a python post.py 用於讀取歌曲以進行鼓點脈衝偵測。若要將新曲目適配到已渲染的鏡頭,可在曲目上滑動一個30秒的視窗,並保留在剪輯時間點上起始強度最高的偏移量。範例的最終剪輯使用 coruscate 的 "Thunder & Rain Inst. & Construction Kits"(https://ccmixter.org/files/Coruscate/61228),CC BY 3.0。

相關技能