FilmForge Motion
Gemälde halten wie Filmframes; kein Zoomen, kein Driften. Bewegung kommt von innen: Partikel, Nebel, Flimmern, Schimmer, Licht – alles auf der GPU gerendert für nichts. Bezahltes Video wird aufgehoben für das, was Code nicht kann (echter Flug, eine Verwandlung, die der Höhepunkt des Films ist). Dieses Skill füllt das motion-Feld jedes Shots, wendet die QA-Korrekturen an, exportiert die Zeitleiste für den Renderer und rendert die Vorschau, die der Regisseur absegnet.
Pfade: scripts/, templates/ und config/ unten sind Ordner innerhalb dieses Skills (das Basisverzeichnis, das beim Laden angezeigt wird), platziert von ./install.sh. Beim Arbeiten aus einem Klon des Repositorys sind es tools/, templates/ und config/ in dessen Wurzel.
Der Renderer ist painted-film-pipeline (Python und GLSL; Module unten benannt). Alle Pixelwerte sind 4K (3840x2160); der Renderer skaliert sie mit K = W / 3840, sodass eine 1080p-Vorschau dieselben Zahlen verwendet.
Schritt 1. Den Shot lesen
Für jeden Shot: sein Beat, die Stimmung seiner Szene und das Farbdrehbuch, seine Länge nach Retime, die darunterliegende Musik (Phrasen, Hits in beatmap.json), was bereits im Bild ist (Feuer, Meer, Himmel, Glas). Das Leben muss der Welt des Gemäldes angehören: Glut steigt aus einem Feuer auf, das dort gemalt ist; Schnee fällt, wo der Himmel ist.
Schritt 2. Sein Leben wählen (das Vokabular)
| Effekt | Parameter (Shot-Feld) | Werte |
|---|---|---|
| Treibende Nebelbänder | fog + fogc | (Stärke 0..1, y wo es beginnt, y wo es voll ist, Driftgeschwindigkeit); Farbe (r, g, b) 0..1 |
| Lichtstreifen über Lichtern | sweep | (Periode s, Bandbreite px, Intensität, 0) |
| Feuerschein-Flimmern um einen Punkt | flick + fire | Amplitude (0.07 bis 0.45); (x, y, Radius px) |
| Hitzeflimmern in einem Band | shim | (y voll, y null, 0, Stärke) |
| Kamerabeben | shake | (Start s, Länge s, Amplitude px) |
| Überblendung rein / raus | tin, tout | ("fade" oder "white", Sekunden); Standard ist ein harter Schnitt |
| Neuausrichtung | crop | (x0, y0, x1, y1) in Quellpixeln |
| Partikeltönung | ashc | (r, g, b) |
| Partikel | life | ein Rezept oder ein Lambda über die Partikelsysteme unten |
| Blitze | bolts | Liste von Zeitpunkten im Shot |
| Glassprung | crack | (Start s, Länge s) |
Partikelsysteme (painted.py): ash(t, n, wind=(vx, vy), size=(min, max), alpha, seed) für Asche, Staub und Schnee;
flakes(...) für große weiche Flocken; sparkles(t, n, alpha, size) für Glitzer und Sterne; streaks(t, n, speed) für Regen; embers(t, n, src=(x, y), spread, rise, life) für Glut, die aus einer Quelle aufsteigt. Rezepte aus dem echten Film (film_cut.py): SNOW(n, wind), EMB(n, alpha), GLINT, RAIN, STARS(n), GOLD. Vollständige Parameterbedeutungen: references/pipeline-modules.md; getestete Stimmungsrezepte: references/effects-cookbook.md.
Grafiken (graphics.py, overlays.py): goldene Fadenbänder, die sich einzeichnen, mit der Musik schwingen und einrasten (T(points, t0, draw, w)); handgeschriebene Wörter, die von links nach rechts geschrieben werden (W(text, t0, x, y, size)); Ortsnamen, die sich aus dem Material der Szene formen und fortblasen (V(...)); das Titel-Finale.
Schritt 3. Die Musik treibt es
graphics.Drive misst die Partitur pro Frame (Level und Puls). Bloom, Glutblühen, Fadenglühen und Textatmung folgen ihm, sodass ein Hit die Glut ohne Keyframe aufleuchten lässt. Setze Überblendungen und Beben auf Hits aus beatmap.json (shake Start = die Zeit des Hits minus der Start des Shots).
Schritt 4. Das Motion-Feld schreiben
In shotlist.yaml, pro Shot (Beispiel: ein Feuer-Wald-Shot aus Simorgh und der Strahl der Laternenmotte):
motion:
life: EMB(320)
flick: 0.09
fire: [1920, 1300, 2600]
shim: [2160, 300, 0, 0.8]
ashc: [0.62, 0.55, 0.5]
motion:
tin: [white, 0.4]
sweep: [3.0, 520, 0.35, 0]
life: GOLD
shake: [0.0, 0.4, 10]
Ein Shot, der nichts braucht, bekommt motion: none (das Gate will, dass jeder Shot entschieden ist).
Schritt 5. Die QA-Korrekturen anwenden
Für jede fix in qa.yaml: führe ihren Aufruf aus (grade.py recolor oder blue, ein Patch, ein crop auf den Shot), schreibe die _g-Datei, messe erneut mit ledger.py palette, setze dann done: true. Die angepasste Gradierung (Plattenebenen) und die 4K-Hochskalierung sind automatisch im Renderer.
Schritt 6. Exportieren, rendern, ansehen
python3 scripts/shotlist.py export-cut shotlist.yaml --paintings art/film > code/timeline.py
gibt die Zeitleiste als P_()-Zeilen für film_cut.py aus. Dann, im Renderer:
W=1920 H=1080 python film_cut.py still out/frames 6.0 12.0 24.0 # Standbilder zu den Story-Hits
python film_cut.py sheet out/sheet.jpg # ein Frame pro Shot
python film_cut.py video film/preview_1080p.mp4 audio/score.wav # die Vorschau mit der Partitur
Sieh dir die Vorschau mit Ton an. Überprüfe die Standbilder an jedem Hit. Dann segnet der Regisseur die Motion-Phase ab.
Wann für Video bezahlen
Nur wenn die Bewegung die Geschichte ist und Code sie nicht vortäuschen kann: Flug (Simorghs Start: echte Clips mit Geschwindigkeitsrampen), eine Geburt oder Verwandlung am Höhepunkt. Kalkuliere die Kosten in budget.py (Kling 4.0: 16,25 Credits pro 5 s bei 1080p, plus das Keyframe-Gemälde); male die Keyframes zuerst und lass sie durch die QA laufen; erstelle günstige Entwürfe, wo das Modell einen Entwurf anbietet, und finalisiere einen Take. Alles andere wird in gemalten Schlüsselposen erzählt, die einrasten (poses: 2), so wie Anime eine Pose hält.
Ausgabe
- das
motion-Feld jedes Shots (odernone) code/timeline.pyaus export-cut- die angewendeten Korrekturen (
_g-Dateien,done: truein qa.yaml) film/preview_1080p.mp4, Standbilder zu den Hits, ein Ein-Frame-pro-Shot-Blatt
Gate-Checkliste
- Jeder gemalte Shot hat einen Bewegungsplan oder
motion: none - Jede QA-Korrektur angewendet und erneut gemessen
- Die Vorschau mit Ton angesehen; Standbilder an jedem Hit überprüft
- Abgesegnet
Reparaturtabelle
| Symptom | Korrektur |
|---|---|
| Es fühlt sich an wie eine Diashow | Jeder Haltepunkt braucht eine lebendige Schicht, die an seine Welt gebunden ist (Partikel, Nebel, Flimmern); variiere sie nach Szene |
| Effekte wirken aufgeklebt | Töne Partikel mit ashc aus dem Gemälde; Emitter an gemalten Quellen; Nebelfarbe aus dem Himmel |
| Hektische, verrauschte Frames | Weniger Partikel (n halbieren), niedrigeres Alpha; eine Effektfamilie pro Szene |
| Shots aus verschiedenen Generationen schneiden nicht zusammen | Die angepasste Gradierung ist für diese Platte falsch: Ebenen prüfen; eine Gradierung, Korn und Vignette für alle |
| Effekte ignorieren die Musik | Hits nicht genutzt: platziere Beben, Flares und Überblendungen auf Beatmap-Hits |
| Text ist schwer zu lesen | Verschiebe ihn in den ruhigen Bereich des Gemäldes (text_area), vergrößere, verlangsame das Einblenden |
Referenzen
references/pipeline-modules.md: die Module des Renderers und alle Parameterreferences/effects-cookbook.md: getestete Rezepte pro Stimmung, aus einem fertigen Film