Stick crowd MV (ペイント3D + コード群衆)
example/ に実例あり:「群衆の中の孤独な一人」— ベトナムの本通り(昼、夕暮れ)の2カット、雨の日本のショッピングストリート夜の4カット、そしてカメラが空に向かって上がっていくタイムラプスのエンディング。30秒、720フレーム、24fps。
このスキルは 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— 2つのセットとそのショット。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=<frame> blender -b --factory-startup -P scene.py -- --proj --shots 4。結果を確認する。 - フルレンダリング(最大3つのBlenderプロセス)、
post.py、ffmpeg + 曲クリップで結合。 - スムーズと判断する前に計測:ショットごとの連続フレーム間の平均絶対差分。最大 ÷ 中央値が約2を超えると何かが跳ねたことを意味する(該当フレームを見つけて確認する)。
人の構築方法(stick.py)
- セット内に実際のジオメトリとして配置されるため、ペイントされたストリートが正しく隠蔽する。全員の四肢=各フレームごとに頂点を書き換える(numpy→
foreach_set)6面角柱で構成される1つのメッシュ。頭部=カメラ空間の3トーンセルシェーダー+インバーテッドハルを持つ球体。200人のレンダリングはEEVEEで1フレーム1秒未満。 - 頭部の中心は首のライン上(
neck + dir × radius × 0.86)に置かれる。または頭部が体から浮く。 - ライト:ロケーションごとのランプリスト(位置、色、強度)。各頭部はその合計をオブジェクトカラーとして取得し、最大チャンネルで正規化し、クランプしない(クランプするとすべて白くなる)。キャストシャドウ=同じ四肢メッシュを最も近い頭上ランプから地面に投影(長さをクランプ)、または日光の場合は太陽に沿って投影。加えてソフトな接触ブラー。
- 傘(雨):一人につき8パネルのドームオブジェクト、色はオブジェクトカラー、3分の1はクリアビニール。右手は柄を握るように再ポーズ。キャノピーは丸い影を落とす。ヒーローには傘なし。
- 電話:左手を耳に当て、頬に沿った薄い板。夜には光る。
- 雨:レンズの前、少なくとも1.9m以上離れた位置にある、薄いカメラ対面クアッドのボックス。
歩行(gait.py)
線画フィギュアのモーションキャプチャは見た目が乱雑になる(首に根ざした腕が大きく広がり、手がノイジー)。代わりにプロシージャルな歩行を使用:
- 足は接地:支持脚は体が通過する間その場所に留まる。地上の位置は歩行距離から計算されるため、どんな速度でも滑りはない(測定値:1フレームあたり0.2mm未満)。
- 腰は支持脚の上で高く、両脚支持期に低くなる。膝を前に出した2ボーン脚IK。
- 腕は首から垂れ、体に近く、脚に逆らって振られる。頭は落ち着いている。
- スペック:
normal、stroll、brisk(歩幅、歩調、腕振り、前傾姿勢が人ごとに異なる)およびhero(短い歩幅、うつむき、腕は垂れたまま)。実歩調:散歩80~105歩/分、普通105~125、早足125~140。
群衆ルール(有料で実装されたもの)
- 歩行者一人につき、ショット全体で1本の直線車線。 ショット中にステアリング(ヒーローを避ける、レンズを避ける)を行うと、人が横に走ってしまう。代わりに、ショット開始前に各歩行者をショット全体でシミュレートし、ヒーローの空円に入る、レンズに近づく、またはレンズとヒーローの間に立つ場合に、一度だけ車線を横にずらす。
- ループは画面外でラップする必要がある。 カメラの約6m後方から約50m前方まで通りを埋め、ラップポイントでのみフェードアウト。画面内でのラップは人物が別の場所にジャンプするように見える。
- 画面内で人を縮めたりフェードアウトさせたりしない。
- 「混雑している」と読める密度:幅6mの通りで1mあたり2~2.7人。
- 2つのキーがループするポーズクリップはフィギュアを震わせる:ホールドする(
timeScale = 0)。 - 立っている人は決して静止しない:呼吸、ゆっくりとした重心移動、顔の向きの変化。
- カップルは同じスペックで並んで歩き、半周期ずれる。
タイムラプス(フィルム全体)
- すべてのショットで群衆の時計は10倍速で動く(
LAPSE、warp())。ヒーローだけがリアルタイムで生きる。このコントラストがフィルムのアイデア。 - 1フレームあたり6サブフレームをレンダリング(
SUB;scene.pyのショットフレーム数×6)。post.pyがそれらを線形光で平均化するため、人は軌跡になり、照明は明るく残る。30秒=4320レンダリング、3つのBlenderプロセスで約25分。
ペイント内のカメラ移動
投影されたペイントは小さな前方ドリーにしか耐えられません。しかしレンダリングカメラはペイント内で自由に TURN、ZOOM IN、ROLL できます。純粋な回転には視差がありません。stick.py の CAMK はショットごとのキーを保持します —(ショットの区間、ズーム、パン、チルト、ロール、ヒーローを狙う)— p3d の look() の後に適用されます。パンとチルトはズームが残す余白に制限され、ロールされたフレームは画像内に収まるよう十分にズームされます。各ショットに理由のある動きを1つ与える:
- 彼にタイトに始まり、チルトアップして引き、混雑した通りを明かす;
- 彼がこちらに向かって歩いてくる間、顔にゆっくりとプッシュイン;
- ネオンサインから通りへ降りて、彼を見つけるまで;
- プッシュインしながら落ち着く傾いた地平線;
- 通り過ぎる傘をパンして彼に着地;
- 上から:裸の頭にタイト、旋回、傘の上を引き;
- エンディング:1つの非常に広い画像(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) を使用しています。