Stick crowd MV (bemalte 3D + Code-Crowd)
Ausgeführtes Beispiel in example/: "the lonely one in the crowd" – 2 Einstellungen in einer vietnamesischen Buchstraße (Tag, Dämmerung), 4 Einstellungen in einer regnerischen japanischen Einkaufsstraße bei Nacht und ein Zeitraffer-Ende, bei dem die Kamera zum Himmel schwenkt. 30 s, 720 Frames, 24 fps.
Dieses Skill baut auf painted-3d-short auf (https://github.com/thuann-vn/claude-painted-3d-shorts): dessen p3d.py erstellt den Blockout, rendert die Standbilder, projiziert die Gemälde und ruft jede Frame Ihre Setter auf. Lesen Sie zuerst dieses Skill. Dieses hier fügt Personen hinzu.
Dateien
tools/stick.py— die Menge.setter = stick.make(globals(), "<location>"), übergeben Sie es anrender(SHOTS, [setter]).tools/gait.py— der Gang (nur numpy, ohne Blender testbar).tools/post.py— abschließender Durchgang über die gerenderten Frames.example/scene.py,example/book.py— die beiden Sets und ihre Einstellungen.example/jobs.json— die Neubemalungs-Prompts.example/paint/— die Gemälde.example/m2m.json— Leerlaufclips (Mesh2Motion, CC0).
Arbeitsablauf
- Zuerst der Song: Schneiden Sie die gewünschten 30 s, finden Sie die Zeilen-Text-Zeiten, schneiden Sie die Einstellungen darauf (
CUTin scene.py und stick.py). - Blockout + Standbilder + Neubemalung + Projektion genau wie in painted-3d-short. Keine Personen in den Gemälden.
- Inszenieren Sie jede Einstellung in
SHOTSvon stick.py: Held-Start, Richtung,walkoderstand, Gesichtsneigung, Spur-Halbbreite, Blasenradius, Personen am Rand stehend, Seitenstraßen-Geher (cross). - Einzelframes testen:
NTEST=2 STICK_OFF=<frame> blender -b --factory-startup -P scene.py -- --proj --shots 4. Schauen Sie sie an. - Vollständiger Render (maximal 3 Blender-Prozesse),
post.py, Zusammenfügen mit ffmpeg + dem Song-Clip. - Messen Sie, bevor Sie es glatt nennen: mittlere absolute Differenz zwischen aufeinanderfolgenden Frames pro Einstellung; max ÷ Median über ~2 bedeutet, dass etwas aufgetaucht ist (finden Sie den Frame, schauen Sie ihn an).
Wie die Personen aufgebaut sind (stick.py)
- Echte Geometrie innerhalb des Sets, sodass die bemalte Straße sie korrekt verdeckt. Gliedmaßen aller = EIN Mesh aus 6-seitigen Prismen, deren Vertices jeden Frame neu geschrieben werden (numpy →
foreach_set). Köpfe = Kugeln mit einem kamera-bezogenen 3-Ton-Cel-Shader + invertiertem Hüllkörper. 200 Personen rendern in EEVEE in weniger als einer Sekunde pro Frame. - Der Kopfmittelpunkt sitzt auf der Halslinie (
neck + dir × radius × 0.86), oder der Kopf schwebt vom Körper weg. - Licht: eine Liste von Lampen pro Ort (Position, Farbe, Stärke). Jeder Kopf erhält die Summe als seine Objektfarbe; normalisieren Sie durch den größten Kanal, nicht begrenzen (Begrenzung macht alles weiß). Schlagschatten = dasselbe Gliedmaßen-Mesh, projiziert auf den Boden von der nächsten Überkopf-Lampe (Länge begrenzt) oder entlang der Sonne bei Tageslicht; plus ein weicher Kontaktklecks.
- Regenschirme (Regen): ein 8-teiliges Kuppel-Objekt pro Person, Farbe aus der Objektfarbe, ein Drittel davon durchsichtiges Vinyl; der rechte Arm wird neu positioniert, um den Schaft zu halten; das Dach wirft einen runden Schatten. Der Held hat keinen.
- Handys: linke Hand ans Ohr, eine dünne Platte an der Wange, die nachts leuchtet.
- Regen: eine Box aus dünnen, kamera-zugewandten Vierecken vor der Linse, mindestens 1,9 m entfernt.
Der Gang (gait.py)
Mocap an einer Strichfigur sieht unordentlich aus (am Hals wurzelnde Arme breiten sich weit aus, Hände sind verrauscht). Stattdessen wird der Gang prozedural:
- Füße werden aufgesetzt: ein Standfuß bleibt an seiner Stelle, während der Körper darüber hinweggeht; die Position auf dem Boden ergibt sich aus der zurückgelegten Distanz, sodass jede Geschwindigkeit rückfrei ist (gemessen: < 0,2 mm pro Frame).
- Hüften schweben hoch über dem Standbein und tief bei doppeltem Stand; 2-Knochen-Bein-IK mit dem Knie nach vorne.
- Arme hängen vom Hals in der Nähe des Körpers und schwingen gegen die Beine; der Kopf bleibt ruhig.
- Spezifikationen:
normal,stroll,brisk(Schrittlänge, Kadenz, Armschwung, Lehnen unterscheiden sich pro Person) undhero(kurze Schritte, Kopf gesenkt, Arme hängend). Reale Kadenzen: Stroll 80–105 Schritte/min, normal 105–125, brisk 125–140.
Crowd-Regeln, die bezahlt wurden
- Eine gerade Spur pro Geher für die gesamte Einstellung. Lenken während der Einstellung (um den Helden herum, um die Linse herum) lässt Personen seitwärts rennen. Stattdessen simulieren Sie vor Einstellungsbeginn jeden Geher über die Einstellung und verschieben seine Spur einmal zur Seite, wenn er den leeren Kreis des Helden betreten, nahe an die Linse kommen oder zwischen Linse und Held stehen würde.
- Die Schleife muss außer Sicht enden. Füllen Sie die Straße von ~6 m hinter der Kamera bis ~50 m davor und blenden Sie nur an der Nahtstelle aus. Eine Nahtstelle im Bild ist eine Person, die an einen anderen Ort springt.
- Verkleinern oder blenden Sie niemals eine Person innerhalb des Bildes aus.
- Dichte, die als "überfüllt" gelesen wird: 2–2,7 Personen pro Meter einer 6 m breiten Straße.
- Ein Pose-Clip mit zwei links schleifenden Keys lässt die Figur zittern: halten Sie ihn an (
timeScale = 0). - Eine stehende Person ist niemals still: Atmen, eine langsame Gewichtsverlagerung, das Drehen des Gesichts.
- Paare gehen nebeneinander mit derselben Spezifikation, einen halben Zyklus versetzt.
Zeitraffer (der gesamte Film)
- In jeder Einstellung läuft die Uhr der Menge 10× schneller (
LAPSE,warp()); der Held allein lebt in Echtzeit. Dieser Kontrast ist die Idee des Films. - Rendern Sie 6 Unter-Frames pro Frame (
SUB; die Frame-Anzahl der Einstellung × 6 in scene.py); post.py mittelt sie im linearen Licht, sodass Personen zu Streifen werden und Lichter hell bleiben. 30 s = 4320 Render, etwa 25 Minuten auf drei Blender-Prozessen.
Kamerabewegungen innerhalb des Gemäldes
Ein projiziertes Gemälde überlebt nur einen kleinen Vorwärts-Dolly. Aber die Rendering-Kamera kann DREHEN, HINEINZOOMEN und ROLLEN innerhalb des Gemäldes frei: eine reine Drehung hat keine Parallaxe. CAMK in stick.py enthält Keys pro Einstellung – (Teil der Einstellung, Zoom, Schwenk, Neigung, Rollen, Zielen auf den Helden) – angewendet nach p3ds look(); Schwenk und Neigung werden auf den Raum begrenzt, den der Zoom verlässt, und ein gerollter Frame wird gerade genug gezoomt, um innerhalb des Bildes zu bleiben. Geben Sie jeder Einstellung eine Bewegung mit einem Grund:
- eng auf ihn beginnen, nach oben neigen und zurückziehen, um die überfüllte Straße zu enthüllen;
- langsames Hineinzoomen auf das Gesicht, während er auf uns zukommt;
- von den Neonlichtern hinunter in die Straße, bis wir ihn finden;
- ein geneigter Horizont, der sich beim Hineinzoomen stabilisiert;
- ein Schwenk über vorbeiziehende Regenschirme, der auf ihm landet;
- von oben: eng auf den nackten Kopf, drehend, zurückziehen über die Regenschirme;
- das Ende: EIN sehr weites Bild (14 mm, ~20° nach oben gerichtet) und eine 28 mm Render-Kamera, die von ihm zum Himmel neigt.
Für einen Orbit oder einen echten Kran-Flug malen Sie ein extra weites Bild für diese Einstellung.
Abschließender Durchgang (post.py)
Bloom auf das, was wirklich hell ist, Vignette, Körnung (stärker im Dunkeln), ein wenig Farb-Fransen, langsames Handkamera-Wackeln (nicht beim Zeitraffer), Punch-In + Blitz bei jedem Schnitt und ein kleiner Puls von Zoom und Glühen auf den Kick des Songs (tiefes Band des Audios, Frame für Frame). Halten Sie jeden Effekt klein; zusammen sind sie genug.
Musik
Verwenden Sie Musik, für die Sie die Rechte haben; es befindet sich kein Audio in diesem Repository. CLIP=/pfad/clip.m4a python post.py liest den Song für den Kick-Puls. Um einen neuen Titel auf bereits gerenderte Einstellungen abzustimmen, schieben Sie ein 30-s-Fenster über den Titel und behalten Sie den Offset, bei dem die Onset-Stärke zu den Schnittzeiten am höchsten ist. Der finale Schnitt des Beispiels verwendet "Thunder & Rain Inst. & Construction Kits" von coruscate (https://ccmixter.org/files/Coruscate/61228), CC BY 3.0.