Communitygithub.com

Foule de bâtonnets MV (3D peint + foule codée)

Crée un court métrage musical vertical (environ 30 s) où un bâtonnet se tient debout ou marche seul dans une foule, dans une rue 3D peinte à la main. Utilise Blender, un repaint par modèle d'image, une foule animée par code de 100 à 200 bâtonnets, et une fin accélérée, le tout calé sur la musique.

Qu'est-ce que Foule de bâtonnets MV (3D peint + foule codée) ?

Ce skill permet de réaliser un clip musical vertical d'environ 30 secondes dans lequel un personnage bâtonnet solitaire (le héros) se déplace ou reste immobile au milieu d'une foule dense, dans un décor de rue 3D peint à la main. Il repose sur le pipeline du skill **painted-3d-short** (p3d.py) pour le blocage 3D, le rendu des images fixes, la projection des peintures et les appels aux setters à chaque image. La foule est ajoutée par le module `stick.py` qui génère une géométrie réelle (prismes à 6 faces pour les membres, sphères pour les têtes) mise à jour par image via numpy et `foreach_set`, avec ombres portées, parapluies, téléphones, et une animation de marche procédurale sans glissement (pieds plantés). Le travail se fait dans Blender (EEVEE) et supporte les rues peintes en 3D, les foules jusqu'à 200 personnes, la pluie, et un effet d'accéléré (time-lapse) où la foule se déplace 10× plus vite que le héros. La sortie est un fichier vidéo vertical (format court) avec une passe de post-production (bloom, vignette, grain, flash aux cuts, pulse sur le kick de la musique).

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Stick crowd MV (3D peint + foule codée)

Exemple concret dans example/ : "le solitaire dans la foule" — 2 plans dans une rue de livres vietnamienne (jour, crépuscule), 4 plans dans une rue commerçante japonaise sous la pluie la nuit, et une fin accélérée où la caméra se lève vers le ciel. 30 s, 720 images, 24 ips.

Ce skill repose sur painted-3d-short (https://github.com/thuann-vn/claude-painted-3d-shorts) : son p3d.py construit le blocage, rend les images fixes, projette les peintures et appelle vos setters à chaque image. Lisez d'abord ce skill. Celui-ci ajoute les personnages.

Fichiers

  • tools/stick.py — la foule. setter = stick.make(globals(), "<lieu>"), passez-le à render(SHOTS, [setter]).
  • tools/gait.py — la marche (numpy uniquement, testable sans Blender).
  • tools/post.py — passe finale sur les images rendues.
  • example/scene.py, example/book.py — les deux décors et leurs plans. example/jobs.json — les invites de repaint. example/paint/ — les peintures. example/m2m.json — clips d'immobilité (Mesh2Motion, CC0).

Ordre de travail

  1. D'abord la musique : découpez les 30 s souhaitées, trouvez les temps des paroles, coupez les plans sur ces temps (CUT dans scene.py et stick.py).
  2. Blocage + images fixes + repaint + projection exactement comme dans painted-3d-short. Pas de personnages dans les peintures.
  3. Mettez en scène chaque plan dans SHOTS de stick.py : position initiale du héros, direction, walk ou stand, inclinaison du visage, demi-largeur de la voie, rayon de bulle, personnages debout aux bords, marcheurs dans les rues latérales (cross).
  4. Testez des images individuelles : NTEST=2 STICK_OFF=<image> blender -b --factory-startup -P scene.py -- --proj --shots 4. Regardez-les.
  5. Rendu complet (3 processus Blender au maximum), post.py, assemblage avec ffmpeg + l'extrait musical.
  6. Mesurez avant de dire que c'est fluide : différence absolue moyenne entre images consécutives par plan ; max ÷ médiane au-dessus de ~2 signifie que quelque chose a sauté (trouvez l'image, regardez-la).

Comment les personnages sont construits (stick.py)

  • Géométrie réelle dans le décor, donc la rue peinte les cache correctement. Les membres de chaque personne = UN seul maillage de prismes à 6 faces dont les sommets sont réécrits à chaque image (numpy → foreach_set). Les têtes = sphères avec un shader cel à 3 tons dans l'espace caméra + enveloppe inversée. 200 personnes se rendent en bien moins d'une seconde par image dans EEVEE.
  • Le centre de la tête se trouve sur la ligne du cou (cou + dir × rayon × 0.86), ou la tête flotte hors du corps.
  • Lumière : une liste de lampes par lieu (position, couleur, intensité). Chaque tête reçoit la somme comme couleur d'objet ; normalisez par le canal le plus fort, ne serrez pas (serrer rend tout blanc). Ombre portée = le même maillage de membres projeté sur le sol depuis la lampe aérienne la plus proche (longueur serrée), ou le long du soleil en plein jour ; plus une tache de contact douce.
  • Parapluies (pluie) : un dôme à 8 panneaux par personne, couleur d'après la couleur d'objet, un tiers d'entre eux en vinyle transparent ; le bras droit est repositionné pour tenir la tige ; le dôme projette une ombre ronde. Le héros n'en a pas.
  • Téléphones : main gauche à l'oreille, une fine plaque contre la joue qui brille la nuit.
  • Pluie : une boîte de quads fins face à la caméra, à au moins 1,9 m de l'objectif, devant la lentille.

La marche (gait.py)

La capture de mouvement sur une figure filaire donne un résultat désordonné (les bras ancrés au cou s'écartent, les mains sont bruitées). La marche est plutôt procédurale :

  • Les pieds sont plantés : un pied d'appui reste sur sa place pendant que le corps passe au-dessus ; la position au sol vient de la distance parcourue, donc toute vitesse est sans glissement (mesuré : < 0,2 mm par image).
  • Les hanches montent haut au-dessus de la jambe d'appui et descendent au double appui ; IK de jambe à 2 os avec le genou vers l'avant.
  • Les bras pendent du cou près du corps et balancent contre les jambes ; la tête reste calme.
  • Spécifications : normal, stroll, brisk (foulée, cadence, balancement des bras, inclinaison diffèrent par personne) et hero (petits pas, tête baissée, bras pendants). Cadences réelles : promenade 80–105 pas/min, normal 105–125, rapide 125–140.

Règles de foule qui ont été payées

  • Une seule voie droite par marcheur pour tout le plan. Gouverner pendant le plan (autour du héros, autour de l'objectif) fait que les gens se précipitent sur le côté. Au lieu de cela, avant le début du plan, simulez chaque marcheur sur le plan et déplacez sa voie une fois s'il entrerait dans le cercle vide du héros, passerait près de l'objectif ou se tiendrait entre l'objectif et le héros.
  • La boucle doit sortir de la vue. Remplissez la rue d'environ 6 m derrière la caméra jusqu'à environ 50 m devant et fondez uniquement à la jonction. Une jonction à l'intérieur de l'image est une personne qui saute à un autre endroit.
  • Ne rétrécissez ni ne fondez jamais une personne à l'intérieur de l'image.
  • Densité qui se lit comme "bondée" : 2–2,7 personnes par mètre d'une rue de 6 m de large.
  • Un clip de pose avec deux clés en boucle fait trembler la figure : maintenez-le (timeScale = 0).
  • Une personne debout n'est jamais immobile : respiration, lent transfert de poids, tournement du visage.
  • Les couples marchent de front avec la même spécification, à un demi-cycle d'écart.

Accéléré (tout le film)

  • Dans chaque plan, l'horloge de la foule tourne 10× plus vite (LAPSE, warp()) ; seul le héros vit en temps réel. Ce contraste est l'idée du film.
  • Rendez 6 sous-images par image (SUB ; le nombre d'images du plan × 6 dans scene.py) ; post.py les moyenne en lumière linéaire, donc les personnes deviennent des traînées et les lumières restent brillantes. 30 s = 4320 rendus, environ 25 minutes sur trois processus Blender.

Mouvements de caméra à l'intérieur de la peinture

Une peinture projetée ne supporte qu'un petit travelling avant. Mais la caméra de rendu peut TOURNER, ZOOMER et ROULER librement à l'intérieur de la peinture : une pure rotation n'a pas de parallaxe. CAMK dans stick.py contient des clés par plan — (partie du plan, zoom, panoramique, inclinaison, roulis, viser-le-héros) — appliquées après le look() de p3d ; le panoramique et l'inclinaison sont serrés dans la pièce que le zoom laisse, et une image roulée est zoomée juste assez pour rester dans la peinture. Donnez à chaque plan un mouvement avec une raison :

  • commencez serré sur lui, inclinez-vous et reculez pour révéler la rue bondée ;
  • lent push-in sur le visage alors qu'il marche vers nous ;
  • des enseignes au néon vers le bas dans la rue jusqu'à ce que nous le trouvions ;
  • un horizon incliné qui se stabilise tout en poussant ;
  • un panoramique à travers les parapluies qui passent et qui atterrit sur lui ;
  • d'en haut : serré sur la tête nue, tournant, reculant au-dessus des parapluies ;
  • la fin : UNE image très large (14 mm, visée ~20° vers le haut) et une caméra de rendu 28 mm qui s'incline de lui vers le ciel.

Pour une orbite ou un vrai mouvement de grue, peignez une image extra-large pour ce plan.

Passe finale (post.py)

Bloom sur ce qui est vraiment brillant, vignette, grain (plus fort dans l'obscurité), un peu de frange de couleur, dérive lente de la caméra à main (pas sur l'accéléré), punch-in + flash à chaque coupe, et une petite impulsion de zoom et de lueur sur le kick de la chanson (bande basse de l'audio, image par image). Gardez chaque effet discret ; ensemble, ils suffisent.

Musique

Utilisez une musique dont vous avez les droits ; aucun audio n'est dans ce dépôt. CLIP=/chemin/extrait.m4a python post.py lit la chanson pour l'impulsion du kick. Pour adapter un nouveau morceau à des plans déjà rendus, glissez une fenêtre de 30 s sur le morceau et conservez le décalage où la force d'attaque aux temps de coupe est la plus élevée. La coupe finale de l'exemple utilise "Thunder & Rain Inst. & Construction Kits" par coruscate (https://ccmixter.org/files/Coruscate/61228), CC BY 3.0.

Skills associés