Was macht Sticky Director – KI-Filmregie-Playbook?
Dieses Repository ist eine lokale Animations- und Stummfilm-Engine. Ein rigger schwarzer Silhouetten-Charakter in einem grauen Hoodie agiert vor Fotos (z. B. Google Flow-Bilder), mit Musik, Umgebungsgeräuschen, Kamerabewegungen und Untertiteln. Du führst Regie über MCP-Tools (.mcp.json registriert sticky-studio → node mcp-server.js) oder über die CLI (node cli.js …). Beide starten server.js automatisch, und Canvas-Aktionen öffnen das Studio (Headless-Chromium, wenn kein Display vorhanden ist).
Verwende immer absolute Dateipfade. Jede unten stehende ID wird validiert. Unbekannte Werte werden als
warningszurückgegeben und nicht angewendet – lies also die Warnungen.
Ausführung von Antigravity: Falls die
sticky-studioMCP-Tools nicht verfügbar sind, nutze die CLI aus dem Repository-Stammverzeichnis. Jedes MCP-Tool hat einen CLI-Zwilling (siehe Tabelle unten);node cli.js snapshot <t> <abs.png>schreibt ein PNG, das du mit Vision öffnen kannst. Alle Befehle starten den Studio-Server automatisch.
Tools (MCP) ↔ CLI
| MCP-Tool | CLI | Funktion |
|---|---|---|
sticky_status | node cli.js status | Modus, Seitenverhältnis, Dauer, BPM / Beat-Anzahl, verbundener Tab, Szenenliste |
sticky_get_project | node cli.js get-project [out.json] | Vollständiges Projekt im flachen Agentenformat (Szenen, fxMarkers, mediaCards, audio.beats/strongBeats, Hintergründe + lightProfile) |
sticky_load_audio | node cli.js load-audio <pfad> --mode silent | Lade Musik/Sprachaufnahme → {duration, bpm, beats[], strongBeats[]} |
sticky_import_photos | node cli.js import-photos <p1> <p2> … [--auto-build] | Fotos registrieren → [{bgId, name, path, width, height, lightProfile}] |
sticky_apply_template | node cli.js template <id> [--no-photos] | Lade ein Stummfilm-Storyboard, das an Audio und Fotos angepasst ist |
sticky_set_project | node cli.js set-project <datei.json | '{…}'> | Lade ein vollständiges oder teilweises Storyboard (nur die gesendeten Schlüssel werden angewendet) |
sticky_update_scene | node cli.js update-scene <index|id> '{…}' | Ändere eine einzelne Szene |
sticky_split_scene | node cli.js split <zeitSek> [--no-snap] | Teile die Szene an einem Zeitpunkt, mit Snap zum nächsten Beat (±0,35 s) |
sticky_add_fx | node cli.js add-fx <typ> <zeitSek> [--duration s] | Kamera-Punch / SFX / card |
sticky_render_frame | node cli.js snapshot <zeitSek> [ausgabe.png] | Exakter Frame als PNG (MCP gibt ihn auch als Bild zurück) |
sticky_export_mp4 | node cli.js export | Echtzeit-Rendering → exports/sticky_video_*.mp4 (60 fps H.264 + AAC) |
get_status, get_project, set_project und update_scene funktionieren auch ohne geöffneten Studio-Tab: Sie lesen und schreiben projects/live_state.json, und das Studio lädt diese Datei, wenn es sich verbindet.
Referenz-IDs
Emotionen (10)
| id | Verwendung |
|---|---|
neutral | Standard, ruhig |
happy | Wärme, Erleichterung, kleine Erfolge |
tired | 3 Uhr morgens, Burnout, Erschöpfung |
crying | Trauer, Zusammenbruch (kombinieren mit silentMouth: quiver) |
angry | Frustration |
shocked | Panik, Erkenntnis |
skeptical | Zweifel, Seitenblick |
confused | „?“-Momente |
excited | Aufregung (Sternenaugen) |
deadpan | Leere, Taubheit |
Gesten (18) — gesture
| id | Beschreibung | beste Ansicht |
|---|---|---|
pocket | Hände in der Hoodie-Tasche (chilliger Standard) | beliebig |
idle | entspannte Arme (schwingen beim Gehen) | beliebig |
talking | audio-reaktive Handbewegungen (Sprachaufnahme) | vorne |
explain | beide Handflächen nach außen | vorne |
point_screen | zeigt seitwärts (auf eine Medienkarte) | vorne |
point_viewer | zeigt auf die Kamera | vorne / 3/4 |
crossed | verschränkte Arme | vorne |
facepalm | Hand über dem Gesicht | vorne |
hands_head | Hände auf dem Kopf (Panik) | vorne |
shrug | Achselzucken, Handflächen nach oben | vorne |
wave | winken | vorne |
typing | sitzt an einem Schreibtisch und tippt (Schreibtisch + Hocker werden automatisch gezeichnet) | auto 3/4–Seite |
slouch_lonely | tiefes Einknicken, hängender Kopf, langsamer schwerer Atem | vorne / 3/4 |
heavy_sigh | 4,5-Sekunden-Zyklus: einatmen → halten → zusammensacken (automatisches Atemgeräusch) | vorne / 3/4 |
check_phone_dark | hält ein leuchtendes Telefon; blauer Lichtkegel auf Gesicht und Hoodie | vorne / 3/4 |
sit_curb_hug_knees | sitzt auf dem Boden, umfasst die Knie, Kopf gesenkt | auto 3/4 |
look_back_horizon | steht und blickt auf die Weite, Wind im Hoodie | back / 3/4 |
pull_hood_up | Aktion: greift nach hinten und zieht die Kapuze hoch (~2,3 s ab Szenenbeginn) | vorne |
Körper- & Pose-Schlüssel
| Schlüssel | Werte |
|---|---|
pose | rig (gegliedert, Standard) · v1 Sprites: front, bust, side, back |
view | front, threeQuarter, side, back |
hoodUp | true / false (Kapuze wird in jeder Ansicht gezeichnet; Rückansicht standardmäßig hoch) |
walkSpeed | 0 still · 0.1–1.0 gehen · 1.1–2.5 joggen → sprinten |
walkDir | left, right |
walkInPlace | true (Laufband) / false (bewegt sich über den Bildschirm, umlaufend) |
wind | 0..1 (Saum, Kordeln, Kapuze) |
silentMouth | closed (Standard) · sigh · quiver (Weinen/Angst) |
handLeft, handRight | auto, relaxed, open_palm, pointing, fist, holding_prop, in_pocket |
prop | none, phone, mug, mic, controller, book |
spineLean, headTilt, headNod | Grad (≈ −25…25; headNod + = nach unten schauen) |
ikPins | { rightHand|leftHand|rightFoot|leftFoot|head: {x, y} } in Rig-Einheiten (Ursprung = Boden zwischen den Füßen, +x = Blickrichtung, oben = negatives y; der Kopf ist bei y ≈ −300, Hände hängen bei y ≈ −130). {} löscht |
x, y, scale, flipX | Position 0..1 (x 0,5 = Mitte; y ≈ 0,55 = stehend im unteren Drittel), Größe (1 = Standard), spiegeln |
motion | breathe (Standard für stumm), talk_bounce, walk, shake (zittern), float, none |
emotion | siehe Tabelle oben |
Hintergründe — background
Standardhintergründe: paper_sketch, cozy_night, rainy_window, streetlight (Mitternachtslampe), classroom (Sonnenuntergangs-Schreibtisch), dark_spotlight, rooftop_dusk, green_screen.
Fotos: Verwende die bgId, die von sticky_import_photos zurückgegeben wird, oder setze einfach den absoluten Fotopfad in background (wird automatisch importiert).
Fotokamera & Tiefe
| Schlüssel | Werte |
|---|---|
kenBurns | none, push_in, pull_out, drift_left, drift_right, breathing (Foto bewegt sich 100 %, der Charakter 30 % → Parallaxe) |
foreground | none, bokeh, rain_streaks, window_reflection |
camera | static, zoom_in, zoom_out, pan_right, handheld (wird auf kenBurns angewendet) |
atmosphere | dust (leuchtet im Musikbeat), rain, none |
dutchScene / spotlightScene | gesamte Szene: geneigter Horizont / Hintergrund um 60 % abgedunkelt |
Lichtanpassung (Fotoharmonisierung) — lightMatch
true = empfohlen (tint 0,35, rim 0,55, exposure 0,5) · false = aus · eine Zahl 0..1 = Gesamtstärke · oder { tint, rim, exposure, side } mit side = auto (vom Foto) | left | right | back (Gegenlicht, beide Kanten).
Verwende true bei jeder Fotoszene. Erhöhe rim (0,7–0,9) für Sonnenuntergänge und Gegenlichthorizonte; verwende side: "back" für look_back_horizon.
Übergänge (wie eine Szene EINTRITT) — transitionType, transitionDur (0–2 s)
cut · dissolve (beide Aufnahmen werden live gerendert und überblendet) · fade_black (Zeitsprung, Einsamkeit) · fade_white (Rückblende, Erkenntnis, Hoffnung). Szene 0 mit dissolve oder fade_black blendet aus Schwarz ein. fadeOutEnd: true blendet den Film am Ende auf Schwarz aus.
Atmosphären (kontinuierlich, pro Szene) — ambientBed, ambientVol 0..1
| id | Stimmung |
|---|---|
none | — |
rain_window | sanfter Regen + ferner Donner (macht auch Schritte nass) |
night_wind | einsamer Mitternachtswind |
vinyl_crackle | warmer Lo-Fi-Staub |
clock_ticking | 60 BPM nachhallender Tick: 3 Uhr morgens, Schlaflosigkeit, Leere |
heartbeat | tiefer gedämpfter Herzschlag: Angst, Panik |
crowd_muffle | tiefpassgefiltertes Gemurmel: allein in einem überfüllten Raum |
FX-Marker — sticky_add_fx / fxMarkers: [{type, timeSec, …}]
- Kamera-Punches:
snap_zoom(1,0→1,25× springt auf das Gesicht),dutch_tilt,shake,spotlight(+duration,intensity0..3,dir±1 für Dutch) | - SFX / Geräusche (10):
whoosh,pop,vine_boom,record_scratch,shutter,typing,footstep_wet,heavy_sigh_breath,phone_vibrate,door_close_echo(+volume) | - Szenen können auch
transitionSfx(ein SFX, das am Schnitt abgespielt wird) undfoley: truesetzen (automatische Schritte bei jedem Fersenauftritt + Seufzer; im Stummmodus standardmäßig an) | - Medienkarten:
type: "card"mitcard: {kind: image|meme|post|note, text, imagePath, side: auto|left|right, hold, size}|
Projekt-Schlüssel (sticky_set_project)
| Schlüssel | Werte |
|---|---|
mode | silent (nur Musik, der Mund synchronisiert nie Lippen) · voiceover |
aspectRatio | 16:9 · 16:9-letterbox (2,35:1 Kino-Balken) · 9:16 (Shorts / Reels / TikTok, 720×1280) |
fadeOutEnd | true oder Sekunden |
masterAmbientVol | 0..1 |
captionStyle | cinematic (Stummfilm-Serife), pop, karaoke, classic, off, oder {mode, highlight, position: bottom|middle|top, chunk, uppercase, size} |
snapToBeats | Standard true: Schnitte rasten zum nächsten Beat ein |
scenes | flache Szenenobjekte. Timing: gib start/end für alle Szenen an, oder keine und verwende duration / weight (verteilt über die Musik) |
fxMarkers | siehe oben |
mediaCards | [{sceneIndex | timeSec, kind, text, imagePath, appear, hold, side}] |
Vorlagen — sticky_apply_template
loneliness_3am (Telefon im Dunkeln → Hoodie-Regen-Spaziergang → Knie umarmen auf dem Bordstein → Morgendämmerungshorizont) · social_anxiety (Ecke zusammengesunken + Menschengemurmel → Panik mit Herzschlag → nach draußen treten in den Wind → erleichterter Seufzer) · burnout (Tippen am Schreibtisch → leerer Blick mit Uhr → Überblendung auf Schwarz → Regenspaziergang) · discipline (müdes Aufwachen → Kapuze hochziehen → 1,2× joggen → 2,0× Sprint in den Sonnenaufgang).
Regie-Workflow
- Schauen und hören. Betrachte die Fotos des Nutzers mit Vision (lies die Bilddateien) und entscheide den emotionalen Bogen (z. B. Isolation → Bruchpunkt → Befreiung → Hoffnung). Lade die Musik mit
sticky_load_audio {path, mode: "silent"}und notiereduration,bpmundstrongBeats(die besten Schnittpunkte). - Fotos importieren und zuordnen.
sticky_import_photos {paths: [...]}in Story-Reihenfolge. Verwende jedeslightProfile(tonewarm/kühl,brightness,lightFrom), um den Beat auszuwählen. Dunkle kühle Räume eignen sich fürcheck_phone_dark/slouch_lonely+clock_ticking. Regenstraßen eignen sich für Hoodie-pocket-Spaziergänge +rain_window+rain_streaks. Sonnenuntergänge und Skyline eignen sich fürlook_back_horizon(Rückansicht,lightMatch {rim: 0.8, side: "back"}) +night_wind. - Das Storyboard erstellen mit einem einzigen
sticky_set_project-Aufruf:mode: "silent",captionStyle: "cinematic",fadeOutEnd: trueund eine Szene pro Foto. Gib jeder Szenebackground(den Pfad oder die bgId),gesture,emotion,view,hoodUp,kenBurns,lightMatch: true,ambientBed,transitionType(erste Szenefade_black, meistdissolve1,0–1,5 s,fade_blackfür Zeitsprünge,fade_whitefür die Wende zur Hoffnung), kurze poetischesubtitles (≤ 8 Wörter oder leer) undweightfür Betonung. Füge einigefxMarkershinzu (phone_vibrate,door_close_echo, einensnap_zoomauf dem emotionalen Höhepunkt). Überprüfe diewarningsim Ergebnis. - Visuell prüfen.
sticky_render_framean 2–3 wichtigen Zeitpunkten: innerhalb der ersten Szene (nach der Einblendung, ~1,5 s), in der Mitte des Films und am Höhepunkt. Stelle sicher, dass der Charakter vollständig im Bild und auf dem Boden steht (passey,scale,xan), dass der Rand und die Farbtönung zum Foto passen (passelightMatchan), dass Untertitel lesbar und nicht verdeckt sind und dass Gesichter nicht von Karten verdeckt werden. Korrigiere mitsticky_update_sceneund rendere erneut. - Exportieren mit
sticky_export_mp4, sobald der Nutzer bereit ist. Es dauert etwa die Filmlänge plus Codierung. Melde denmp4Path.
Geschmacksführer für stille emotionale Kurzfilme
- Weniger, längere Aufnahmen (4–8 s). Schneide auf
strongBeats. Lassheavy_sighundslouch_lonelymindestens einen vollständigen Zyklus (≥ 4,5 s) wirken. hoodUp: true= Rückzug / Regen / Angst; Kapuze unten = Offenheit, Erleichterung.- Halte
walkSpeedbei 0,4–0,6 für melancholische Spaziergänge, 1,2 für einen entschlossenen Jogging-Schritt, 2,0+ nur für klimaktische Sprints. - Kombiniere Emotion und Mund:
crying+quiver,tired+sigh. Verwende im Stummmodus niemalstalking. - Verwende eine Atmosphäre pro Szene mit Lautstärke 0,4–0,8. Wechsle die Atmosphäre an Schnitten, um einen neuen Ort zu markieren.
- Für
9:16haltex≈ 0,5 undscale0,9–1,1. Untertitel und Karten positionieren sich automatisch neu.
Beispiel-Storyboard
{
"mode": "silent", "aspectRatio": "16:9-letterbox", "captionStyle": "cinematic", "fadeOutEnd": true,
"scenes": [
{ "title": "3 Uhr morgens", "background": "/abs/photos/schlafzimmer.jpg", "gesture": "check_phone_dark", "emotion": "tired",
"kenBurns": "push_in", "lightMatch": true, "ambientBed": "clock_ticking", "transitionType": "fade_black", "transitionDur": 1.2, "subtitle": "3:07 Uhr." },
{ "title": "Regenspaziergang", "background": "/abs/photos/strasse.jpg", "gesture": "pocket", "view": "threeQuarter", "hoodUp": true,
"walkSpeed": 0.55, "walkInPlace": false, "x": 0.25, "foreground": "rain_streaks", "ambientBed": "rain_window",
"lightMatch": true, "transitionType": "dissolve", "transitionDur": 1.2, "weight": 1.2 },
{ "title": "Morgendämmerung", "background": "/abs/photos/sonnenuntergang.jpg", "gesture": "look_back_horizon", "view": "back", "wind": 0.6,
"lightMatch": { "rim": 0.8, "side": "back" }, "kenBurns": "pull_out", "ambientBed": "night_wind",
"transitionType": "fade_white", "subtitle": "Aber die Sonne ging trotzdem auf." }
],
"fxMarkers": [ { "type": "phone_vibrate", "timeSec": 0.8 } ]
}