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