Install
openclaw skills install @vargai/threejs-animaticBuild a three.js animatic ("animatronic", 3D previz, blockout) of a multi-shot video: every storyboard shot becomes a schematic 3D scene drawn in code, with jointed mannequins and poses, master sets in real metres and props, a real camera per shot (START/END keys, lens in mm, move and ease), timed to the music or voiceover, reviewed in the browser with a top-down set map of every camera frustum, approved, exported as a camera plan, rendered to MP4 frame by frame (headless Chrome or HyperFrames), then used as the @video1 reference for Seedance 2.5 video-to-video on varg so the generated shots keep the approved camera and blocking. Use when someone asks for a three.js animatic or animatronic, a 3D previz or blockout, camera blocking, a camera plan, shot sizes and lenses, a grey-box of a storyboard, previz to Seedance, a reference video for video-to-video, or a look blockout (reference pictures as textures on the blockout, stills for look approval). Includes a working starter project (no npm).
openclaw skills install @vargai/threejs-animaticAI video models redraw the world on every call: cameras wander, rooms change layout between shots, a person ends
up as big as their car. A three.js animatic fixes camera, geography, scale and timing for free, before the
paid step. It is a grey-box: it approves where things are and how the camera sees them, never the look. The
approved clip then goes to Seedance 2.5 as @video1, and the generated shots keep that camera and blocking.
Distilled from real production sessions: a 36-shot vertical music video (previz → 13 Seedance runs), product and launch films, and a deterministic three.js film rendered through HyperFrames.
| project | do |
|---|---|
| 1–3 shots, simple camera | skip the animatic: a still per shot, approve, then image-to-video |
| 3–15 shots, one or two places | this skill + starter/: hand-key the cameras, review, render, pack |
| a storyboard of 15+ shots, songs, many locations | this skill for the craft, plus the varg-previz skill for its full app: auto cameras from storyboard words ("MCU, 3/4 left, push in"), pack.json + board builder, story structure and sheet guides (in this repo: varg-previz) |
| the animatic itself is the film (3D product shot, explainer) | this skill, render path B (HyperFrames) with HTML text on top, plus the optional look blockout |
| the look must be approved before paid generation | the optional look blockout (below): reference pictures on the grey set, stills only |
cp -r <this skill>/starter my-film/previz && cd my-film/previz
bun serve.ts # http://localhost:8777/ review UI: shot view, set map, timeline, panel
bun tools/check.ts # headless: UI screenshot, frames per shot, contact sheet, seek-safety test
bun tools/capture.ts # renders/animatic.mp4, frame-exact, 24 fps
The demo is generic: two mannequins at a cafe table, a drone flies in and lands; 3 shots, 10 s, 16:9, 120 BPM.
Replace js/config.js (format, bpm), js/sets.js (the place), js/shots.js (shots + blocking). The rest is the
engine. starter/README.md lists every key and file.
brief.md. Lock format (aspect, length, fps),
music or VO, BPM. Every later note gets applied to brief, shot list and animatic in the same pass.id, start/end (cuts on bar lines when there is music; the hook in the
first 2–3 s), picture (what we see), action (what happens, written for the video model), camera words,
subjects to check. In the starter this is SHOTS in js/shots.js; long projects keep a
storyboard.json.S.o. → references/sets-and-blocking.mdBLOCKING(S, T)), and every shot is only a camera on it.
→ references/mannequin-rig.mdline, or arc for orbits). Key them in code, then fix them by eye in the UI (1/2, drag, write).
→ references/camera-language.mdbun tools/check.ts and LOOK at checks/sheet.png
(START, middle, last frame before each cut). Do not report a shot as fine without having seen it.⌘S. If the direction is still open, approve
stills first (capture.ts --stills) on a board, animate after.camera_plan.md (size, angle, lens, move, positions, status, notes) and
camera_plan.json for prompts and tools.bun tools/capture.ts (headless Chrome over CDP, frame i = t i/fps, ffmpeg).
Path B: bun tools/make_hf.ts → npx hyperframes render hf when the animatic needs HTML text, audio or
Studio edits. Both call the same film.pose(t). → references/seek-safe-rendering.md--shots … --grey, pick image references for exactly what is in frame, write the prompt.
→ references/seedance-v2v-pack.mdestimate_cost, a yes from the person paying, ONE run first, then the batch.
QA every output against its @video1, cut it back onto the timeline with the run's placement file.Spend nothing before step 11 except cheap stills. Steps 1–9 are free, and notes cost least there.
The grey-box approves camera and blocking; a look blockout approves the look on the same set, for free. Reference
pictures and generated matte paintings go onto the grey geometry as textures (backgrounds, ground, a few hero
surfaces) with js/look.js; geometry, cameras and blocking stay code. Render one still per shot
(bun tools/capture.ts --look --stills), put each next to its reference, list the gaps, fix one area at a time,
up to 3 rounds, then the person approves the stills. A first version that "looks like a toy" gets a detail pass
(textures, light matching the reference, small props for scale).
→ references/look-blockout.md
@video1 unless that is deliberate. The v2v reference stays
capture.ts --grey without --look; the look reaches Seedance through image references and the Look: line.?look=1 / --look the review UI and every export are the plain grey film.Size = frame height at the look-at target, 2·d·tan(vFOV/2):
| ECU | CU | MCU | MS | MLS | FS | WS | EWS |
|---|---|---|---|---|---|---|---|
| < 0.2 m | < 0.4 m | < 0.7 m | < 1.1 m | < 1.5 m | < 2.4 m | < 8 m | ≥ 8 m |
For objects divide by height / 1.8 (a 0.3 m bottle: 0.17). Angle from pitch: < −60° top, −60…−15° high,
±15° eye level, 15…60° low, > 60° worm's eye; roll > 5° dutch.
Lens (full-frame equivalent, 36 mm on the long side) → three.js vertical FOV:
| lens | 18 | 24 | 35 | 50 | 65 | 85 | 135 |
|---|---|---|---|---|---|---|---|
| 16:9 vFOV | 58.7° | 45.7° | 32.3° | 22.9° | 17.7° | 13.6° | 8.6° |
| 9:16 vFOV | 90.0° | 73.7° | 54.4° | 39.6° | 31.0° | 23.9° | 15.2° |
Moves as keys: push in / pull out = p along the view, same t; zoom = fov only; truck = p and t
sideways; crane = p.y; pan/tilt = t only; orbit = p around a fixed t with path arc; whip = whip ease;
impact = shake: [s]. One move per shot.
Grammar: keep all cameras of a dialogue on one side of the 180° line (check the map); match eyelines; change angle
by ≥ 30° or one size between consecutive shots of a subject; cut on action or on the beat; vary the coverage.
Narrow frames: horizontal half-FOV = atan(tan(vFOV/2)·W/H); at 9:16 and vFOV 55° that is 16°.
Building
Reviewing
Rendering
tools/check.ts proves it by comparing pixels across render orders.capture.ts or HyperFrames), never by screen recording.--headless=new --use-angle=swiftshader --enable-unsafe-swiftshader; a plain --screenshot
also needs --virtual-time-budget=8000 or it captures before the first WebGL frame.data-duration on the root is required; pin three (and three/addons/) in the import
map; heavy setup goes on window.__hf.buildReady; check the last frame before each cut.Seedance video-to-video
@video1 greyscale and say "copy only camera, cuts and blocking; the result must not look like @video1".
One colour previz came back unchanged, as the output.@video1 (stacked frames), fix small artefacts in the edit, regenerate only what
the edit cannot fix.| path | what |
|---|---|
references/camera-language.md | sizes, angles, lens table, moves as keys, coverage rules, the narrow frame, camera words in prompts |
references/mannequin-rig.md | joint hierarchy and sizes, sign conventions, pose layers, walk cycle, props, readability for AI |
references/sets-and-blocking.md | master sets from plates, lighting, world-time blocking, cheats, labels, the set map |
references/seek-safe-rendering.md | the determinism contract, CDP capture, HyperFrames path, troubleshooting |
references/seedance-v2v-pack.md | runs, the greyscale clip, references, a generic prompt, the call_tool request, QA |
references/look-blockout.md | optional look pass: textures on the grey set, still vs reference for 3 rounds, detail pass, when not to use it |
starter/ | the working project: review UI, set map, camera editor, save/export, checks, MP4/stills capture, HyperFrames builder, optional look mode (js/look.js) |
video-animate (what to do once the animatic is approved: code or AI, which model, cheap pass, takes, sound, plates for motion design),
varg-previz (full previz app, auto cameras, pack builder), varg-ai (models, prices, uploads, jobs),
varg-video-prompting (prompting Seedance and other models), varg-mockups (still boards before animation),
varg-consistent-characters (character and location sheets), hyperframes and its three.js adapter (HTML → MP4,
text over the animatic).