---
title: "How to previz a video in Three.js or Blender"
description: "Brief, reference video or painting in; a crude Three.js or Blender previz and handoff prompt out. Measured: cuts hold, 2 of 7 camera moves reversed."
url: https://varg.ai/how-to/previz-a-video-in-threejs-or-blender
updated: 2026-11-12
---

# How to previz a video in Three.js or Blender

> **For AI agents:** find the right skill in one call — `curl -s "https://varg.ai/how-to/api/search?q=<what the person wants>"` returns the matching how-to page and the best skills with install commands, as markdown (Russian works too). Full index: https://varg.ai/how-to/llms.txt. Every page has a markdown twin: add `.md` to its path. Before generating anything, show the person the options on the how-to page. From a terminal: `curl -fsSL https://varg.ai/install | sh` installs the vargai CLI (https://varg.ai/how-to/cli.md): `vargai search` and `vargai install <slug>` with no key, every varg model after `vargai login`.

A brief, a reference video or a painting goes in; a crude 3D prototype in Three.js or Blender, a greyscale guide clip and a handoff prompt for a video model come out. The finding that matters most: cuts hold, camera moves don't always. In our own film, 2 of 7 measured moves came back reversed, so name every move in words.

**Step 6 of 10** in [How to make a video with an AI agent in ten steps](https://varg.ai/how-to/make-a-video-in-ten-steps.md). Before: [How to design characters and props for AI video](https://varg.ai/how-to/design-characters-and-props-for-ai-video.md). Next: [How to animate a previz with AI video models](https://varg.ai/how-to/animate-a-previz-with-ai-video-models.md).

## For your agent

Install the skill, then paste the prompt.

```bash
npx skills add vargHQ/skills --skill code-to-video-previz
```

```text
Use the code-to-video-previz skill. Build a 3D prototype of this video in code, as a guide for a later AI video generation. Don't generate any video.
BRIEF: <what happens, in your own words>
FORMAT: <16:9 or 9:16>, <seconds> s, 24 fps
REFERENCE: <path to a video, painting or still; or "none">
TOOL: <Three.js in a single HTML file | headless Blender with bpy | "you choose and tell me why in one line">
Show me the beats first. Stop at the contact sheet and wait for my notes.
```

The guide's own prompt works with nothing installed. It is in The full prompt below, verbatim.

## The short version

- Prototype only the shots where a camera path, a count or a layout has to be exact. Otherwise a prompt and a start frame do the job.
- Start in Three.js; move to Blender to lock acting, rigs or real assets. A 30-second previz took about 1:30 in Three.js and about 2:30 in Blender, and one finished-render run cost $0.97 against $20.39.
- Stay crude: boxes and capsules in real metres, a 1.75 m person for scale, flat light, no text in frame. The more detail the previz has, the more literally the video model copies it.
- Write beats in seconds and metres, one camera move per shot, lens named in mm. Check the first, middle and last frame of each shot with numbers, then on a contact sheet, at most 3 rounds.
- With a painting or still, read coordinates off the picture. Guessing put key points 9 to 22% of the frame off; a fresh agent's staging of a Vermeer held 9 held-back points within 2.7%.
- With a reference video, solve the camera. A headless Blender solve recovered a real film shot's 3D camera in about two minutes on a laptop CPU; metres are good to about ±15%.
- At handoff, cuts landed within one frame, but of 7 measured camera moves 4 kept the direction, 1 stopped and 2 reversed. Describe each shot as the clip shows it: when the words disagree with the previz, the words win.
- To rank takes with an LLM, gate with yes/no questions (57 of 58 defect runs failed something), compare in pairs in both orders with ties allowed, and let a person pick. Asked "which is better", the judge picked a lit but wrong blockout 6 times out of 6.

## About this guide

Code to video: how to prototype a film in Three.js or Blender with Claude or Codex, then turn it into a real video.

November 3, 2026. Built from about 1,250 quotes on X, GitHub and in film press, six fresh-agent tests, 400 blind judge calls, and our own footage. Quotes are verbatim, with reach shown. Bookmarks show demand, not truth.

## The short answer

- **Prototype only the shots that need it.** If the camera, a count or a layout has to be exact, build one. If not, write a good prompt.
- **Start in Three.js.** Move to Blender when you have to lock acting, use a rig or real assets, or hand the file to an artist. Other tools win only for one specific hard thing.
- **Stay crude.** Boxes and capsules in real metres. The more detail you give a video model, the more literally it copies it.
- **Write seconds and metres, not adjectives.** Then make the agent look at frames, because it can't watch video.
- **Don't trust the handoff.** Cuts hold well. Camera moves don't always: in our own film, 2 of 7 measured moves came back reversed. Say every move in words, and describe each shot as the clip shows it.
- **Ranking takes with an LLM?** Clear criteria aren't enough on their own. Gate with yes/no questions, compare in pairs with evidence first, allow ties, and let a person pick.
- **Have a reference? Measure it.** A headless Blender solve recovered a real film shot's 3D camera in about two minutes on a laptop CPU.

[Watch: Our own film, previz left and Seedance 2.5 right (MP4)](https://s3.varg.ai/files/4325c578-378d-4c43-ae53-3cc3218df1ea/file_a17d1f394a39.mp4)

Our own film, previz left and Seedance 2.5 right. 7.4 s, three shots, one location. The cuts landed within one frame. The third shot is one where the model ignored the previz, covered below.

> We'd write a prompt and Seedance would do whatever it wanted. Wrong camera, wrong blocking, ships changing size between shots.

**[PJ Ace](https://x.com/PJaccetturo/status/2112899205412901276)** · Runs the Nexus AI series; public workflow docs · 101K followers · 57 bookmarks

> i quite like the idea of procedural code for storyboarding and control, and then video to video models for texturing and looksmaxxing.

**[Andrej Karpathy](https://x.com/karpathy/status/2084017844455690558)** · Ran his own three.js film test · 4.4M followers · 33 bookmarks

Not everyone agrees, and the sceptics are worth hearing. Roger Deakins says he has done previs once. He also says each director works differently, and "it's not to say one way is right and another way is wrong."

> I’m very wary of working to a storyboard, or certainly to a previs.

**[Roger Deakins](https://beforesandafters.com/2021/10/25/roger-deakins-on-cinematography-and-vfx-cross-over-and-why-the-dop-calls-his-stills-photography-personal-scribbles/)** · Cinematographer, Blade Runner 2049, 1917

## The full prompt

Paste this into Claude Code or Codex. It works with nothing installed. We tested it on fresh agents with no other context; the results are below.

**Paste into Claude Code or Codex**

```text
Build a 3D prototype of this video in code, as a guide for a later AI video generation. Don't generate any video.

BRIEF: <what happens, in your own words, voice-dictated is fine>
FORMAT: <16:9 or 9:16>, <seconds> s, 24 fps
REFERENCE: <path to a video, painting or still; or "none">
TOOL: <Three.js in a single HTML file with no build step | headless Blender with bpy | "you choose and tell me why in one line">

Work in this order and stop where I say.

1. BEATS. Before any code, write beats in seconds and metres: who, where, which way they face, what happens, what state
   it ends in, and one camera move per beat with its job. If a reference exists, read it first: split it into shots
   with ffmpeg, look at the first, middle and last frame of each, and lay a grid over them to read positions as
   fractions of the frame. Show me the beats. Pick no more than one camera idea I didn't ask for.

2. BLOCKING. Real metres, ground at zero, a 1.75 m person beside anything without a familiar scale. People are a capsule, a
   ball head and a small nose in the same tone as the head, to show their facing. Boxes and spheres for everything else. Build as little as
   explains the action, but keep openings, contact surfaces and anything that tells you which way a thing faces. Don't
   model hero objects, faces, hands or textures. Flat light, no shadows, no text, labels, outlines or UI anywhere in the frame.
   Keep the scene as data separate from a small engine, so a change doesn't rewrite the engine. Everything on screen must be a pure
   function of time t: no clocks, no unseeded random, no state between frames.

3. CAMERA. Name the lens in mm per shot. Write orbits as arcs so they can't pass through the subject. Vary the moves.

4. CHECK WITH NUMBERS. For the first, middle and last frame of each shot, compute: is each subject's head in frame, does anything
   block it, is the camera inside any object. Fix every failure. Then check brightness: in greyscale, anything that passes in front of something else must still
   clearly differ from it, or the shapes merge.

5. LOOK. Render those frames as a contact sheet and actually look at it. Tell me in plain words what each shot shows.
   Fix one thing at a time, at most 3 rounds. Don't call a shot fine without having seen it. If a reference exists, overlay your
   render on it at 50% and report what doesn't line up. Then stop and show me the sheet. Wait for my notes.

6. RENDER. After I approve, render the MP4 frame by frame with headless rendering and ffmpeg, never by screen recording. Confirm
   duration and frame count with ffprobe, then export it in greyscale for the video model.

7. HANDOFF. Write the video prompt: the clip is rehearsal footage, take only camera path, framing, timing and positions from
   it and none of its shapes, colours or lighting. Describe every shot as it appears in the clip. Name each camera move
   in words. Give an end state per beat. Never mention boxes, capsules or stand-ins.

Be honest in your report: what you looked at, what you only measured, what is still wrong. You can't watch video, so tell me which
parts I need to judge by playing it.
```

## Do you need a prototype at all?

Find the one hard thing in the shot, then use the cheapest prototype that pins it down. The clearest rule comes from people who tested previz and say to use it selectively. Matsumaru later made a five-scene piece with previz throughout, so this is about choosing shots, not avoiding it.

> a composition you absolutely must hit: previz. Some image in mind but not settled: storyboard. B-roll you are happy to leave to the AI: text + references only.

**[Keigo Matsumaru](https://x.com/k_matsumaru/status/2100535843652075882)** · AI anime director, for people who came to film through AI. Posts previz vs no-previz comparisons · 45.5K followers · 57 bookmarks · translated

> Perhaps the order is: say in words what it means and why it matters, and only if that fails does the idea of images, references, and then previz come up.

**[Int.Lab](https://x.com/IntLab0000/status/2100520370424193430)** · Filmmaker, tested Codex + Three.js and argues against overuse · 1,797 followers · 35 bookmarks · translated

| The hard thing | Use | Why |
|----|----|----|
| Nothing exact: one or two subjects, randomness welcome | No prototype: a prompt and a start frame | A previz adds cost and can make motion worse |
| The idea and look of a sequence | Storyboard stills, rough ones | Fast to redo, and finished images come back as a "moving storyboard" |
| Timing, positions, crowd paths, side-on shots | 2.5D conte in Remotion or HyperFrames | Minutes to make. Not for orbits, occlusion, height or hands |
| An exact camera path, exact counts, spatial continuity, long takes | A 3D prototype | This is what 3D is for |
| A human performance a real camera could shoot | A phone act-out | Carries weight and timing better than a stand-in. Nobody has published a same-shot test against 3D |
| A performance and an impossible camera | Act-out, then mocap, then 3D | Clean up by hand: feet slide |

> it is useful though but only in forcing seedance to follow a fixed camera trajectory

**[Dara Chaw](https://x.com/DaraChaww/status/2069866836993413463)** · The sceptic, on one anime shot. Later conceded ads, fashion and fight scenes · 469 followers · 60 bookmarks

> IMO, that’s a bad idea if you want realism. Lower-fidelity input lets the model translate your intent better.

**[Andy Orsow](https://x.com/andyorsow/status/2111144232841040280)** · On high-fidelity 3D driving AI video · 10.8K followers · 777 bookmarks

## Three.js, Blender or something else?

This is the clearest one-paragraph answer we found, from someone who wasn't using previz at the time and tried it later:

> If you are locking down acting, camera, timing and speed, I think you should build it properly in Blender or similar, but that costs the biggest advantage of AI production, the speed to finish. A simple previz in three.js for placement and rough motion, letting the AI model fill in the rest, is easier and, I feel, fits a workflow right away.

**[@tebasaki3D](https://x.com/tebasaki3D/status/2109849775881470037)** · AI anime maker, not using previz when writing this, tried it later · 4,925 followers · translated

| Pick | When | The catch |
|----|----|----|
| Three.js (default) | Rough placement and the model fills in the rest. Live and editable, no install, works on a weak laptop or a phone. Many shots in one diffable file. A code-rendered final | No rigs. Agent-written human animation looks stiff |
| Blender | You must lock acting, camera and timing. Rigs, Mixamo or mocap, real assets, heavy sets, stills for storyboards. An artist will open the file | More tokens, and one local install or the `bpy` package |
| Cinema 4D | You already own it, and a hero object needs a rig and motion blur (Maxon's official MCP) | Paid. The window has to stay open. No headless route |
| Unreal + MetaHuman | Fast human bodies, big casts, and you're on a Windows GPU | Agent + Unreal + Seedance hasn't been shown joined end to end |
| Remotion or HyperFrames | 2.5D timing contes before generation. Type and finish after it | Not for real 3D. Remotion has licence limits above 3 people |
| Gaussian splat world | The place is the hard part and nothing touches the set | One full report, from a World Labs employee |

We found nobody using Unity, Godot, Rhino or SketchUp for this, and Houdini only for simulation. Those searches were few, so treat that as "not visible", not "impossible".

> The main difference is that Blender has everything mapped accurately in a 3D space where you have exact control of each angle.

**[Theo Dudley](https://x.com/TheoDudley/status/2113645304755212772)** · Director of Nexus, on Blender vs plain storyboards. Built the film in Blender in about 3 days · 748 followers

> I just need primitives. I don’t need a super high def rendering. I want to block scenes and that’s it. Working in three.js means a web based 3D realtime environment I can manipulate and it’s much faster

**[Henry Daubrez](https://x.com/henrydaubrez/status/2109309789088190693)** · Founder of Oddkid, previously a filmmaker at Google Labs (per his bio) · 60.9K followers · 3 bookmarks

> the truth is any 3D program with MCP can do it.

**[Aharon Rabinowitz](https://x.com/ABAOProductions/status/2114005178290495615)** · About 20 years in Cinema 4D; published the full process · 22.1K followers

### Speed and cost

"Three.js is much faster" is overstated once you count the agent's thinking.

> Creating it is faster in Three.js than in Blender, but AI inference during scene creation takes most of the time (about 10 minutes). A 30-second previz took about 1:30 in Three.js and about 2:30 in Blender, so creation speed itself wasn't that different.

**[Keigo Matsumaru](https://x.com/k_matsumaru/status/2096767779907244506)** · Timed both tools · 45.5K followers · 1 bookmarks · translated

Cost is a different story. One run, same model and same prompt, showed \$0.97 for Three.js and \$20.39 for Blender through MCP. It was a finished V8 render, not a previz, and Blender's metal looked more solid. Treat it as a direction, not a ratio.

> Blender is incredibly powerful, and when combined with AI, it can deliver much more realistic results than Three.js.

**[Rubens Soto](https://x.com/rubenssoto_ai/status/2116500441273954801)** · One run on a finished V8 render, not a previz: \$0.97 vs \$20.39 on screen · 2,687 followers · 7 bookmarks

> Video generations went down, but remaking the previz melted my Claude credits.

**[@AiNamanari33743](https://x.com/AiNamanari33743/status/2079061507808297427)** · On what previz does to the bill · 3,898 followers · 378 bookmarks · translated

**Our test**

The choice doesn't have to be final. Our skill writes one scene file that both tools render with the same lens maths. Every key point landed within 0.01% of the frame across the two. 96 frames at 720p on an Apple Silicon laptop:

| Renderer | Time | Use it for |
|----|----|----|
| Blender Workbench | 8 s | The clip for the video model |
| Three.js, headless Chrome, software WebGL | 18 s | The clip, or a live preview |
| Blender EEVEE | 35 s | Stills with real shadows |
| Blender Cycles, CPU, 48 samples | 15–24 s a still | A final render. About 25–40 min for this clip |

![The same staged scene rendered in Three.js, Blender Workbench, EEVEE and Cycles, side by side](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/engines.jpg)

One scene file. Left to right: Three.js, Workbench, EEVEE, Cycles. Workbench uses its own studio light, which is what you want for a guide clip.

## Set it up

**Three.js** needs nothing but a browser. For an MP4 you need headless Chrome and ffmpeg, which the agent can drive. Step frames through time and pipe them to ffmpeg, which is how the creator of Three.js made his own release video.

> It rendered all the clips using puppeteer and final video with ffmpeg.

**[Ricardo Cabello (mrdoob)](https://x.com/mrdoob/status/2116314204307394855)** · Created Three.js. Made his release video with Claude CLI · 91.3K followers · 1 bookmarks

**Blender** has three routes.

| Route | What it is | Use when |
|----|----|----|
| Headless `bpy` | Blender as a Python package. `uv run --python 3.13 --with bpy==5.2.3 python script.py`. We tested this one | Repeatable builds, nothing to open |
| [mcp-for-blender](https://github.com/ahujasid/mcp-for-blender) | Community MCP by Siddharth Ahuja, formerly `blender-mcp`, 33K stars. A `look` tool through camera and angles, asset libraries, 3D generators. Turn telemetry off | You're directing an open scene and the agent needs to see |
| [Blender Lab MCP](https://www.blender.org/lab/mcp-server/) | From the Blender project, for Blender 5.1+. Minimal: Python, summaries, screenshots, docs search. It warns that it runs code "without any guards" and recommends a virtual machine | Inspecting files, API questions |

"Official" on X is unreliable, so ask for the link. No neutral test of MCP against headless exists. Our view, which is judgement and not data: MCP for directing, headless for repeatable builds.

**Claude or Codex?** No clear winner. Reports favour Opus for reading like a film and Codex's models for speed and sometimes spatial accuracy, and each has counter-examples. In our runs both finished the job. The practical difference we hit: **Codex's default sandbox blocked Chrome's WebGL**, so it fell back to an SVG renderer. Run it with a sandbox that allows Chrome, or use Blender there.

## How to prompt it

### Write seconds and metres, not adjectives

> I write seconds and distances because the parts you can't write are precisely the parts that are vague in your own head.

**[Atsufumi Kashima](https://note.com/atsu_mada/n/na01218f008af)** · AI Film Hackathon Tokyo prize (self-reported); wrote previz-maker · 110 followers · translated

> Adjectives are where the default look lives. Every adjective you replace with a number is a decision you take back from the model.

**[Florence (@flxrnc)](https://x.com/flxrnc/status/2105311836190978392)** · Ran the same brief with and without numbers · 3,333 followers · 8,768 bookmarks

A cut in this form leaves nothing to guess: "*Bartender takes a bottle from the top shelf, 3.4 s. Camera behind the customer's left shoulder, slightly above, locked. 0.9 s: right arm starts to extend. 1.25 s: hand reaches the bottle, 1.1 m from the shoulder. 2.0 s: tilts it over the shaker and holds.*" That's adapted from Atsufumi Kashima's public prompt.

Add a "do not add" list and a stop rule. Agents add things nobody asked for and will polish forever.

> a "do not add" list. without it the AI keeps adding things nobody asked for.

**[Prasenjit (@prasenx)](https://x.com/prasenx/status/2115451421147738432)** · Builder-and-critic loop, with what broke · 23.3K followers · 18 bookmarks

### Geometry: as little as explains the action

> The more detail you put into the previs, the more literally Seedance follows it.

**[Grand Visions](https://x.com/GrandVisionsAI/status/2096993565599490465)** · Same prompt, two previzes, video shown · 140 followers · 361 bookmarks

> I omit rivets, leaves, facial features and clothing wrinkles, and keep direction, joints, openings and contact surfaces.

**[Cell (@cellinlab)](https://zaowujuzhen.com/articles/yong-dai-ma-pai-yan-ai-shi-pin-cong-hai-dao-deng-lu-dao-yi-dong-ka-che)** · Ten Three.js cases with what failed in each · 35K followers · translated

> Ambiguity ruins the pass; crudeness does not: a bent lamppost comes back as a snake, loose limb blocks as extra people, an unmarked car driving backward.

**[Scenario](https://github.com/scenario-labs/skills/blob/main/skills/dcc/blender/scenario-blender-blockout/SKILL.md)** · Vendor skill with test notes, MIT

Don't let the agent model hero objects, faces or hands. It's the one thing every expert agrees on. Get them from Tripo, Meshy or BlenderKit, or say them in the prompt.

> Still very far away from the concept art image.

**[Sebastian Aaltonen](https://x.com/SebAaltonen/status/2103521732124647454)** · 30 years in 3D rendering (per his bio), Codex with Blender MCP · 58.9K followers · 33 bookmarks

> Tripo plus manual cleanup is still the fastest accelerated modeling workflow right now.

**[Kiaran Ritchie](https://x.com/kiaran_ritchie/status/2103536829450670456)** · Author of The Art of Rigging, ex Epic Games (per his bio) · 8,298 followers · 1 bookmarks

> Honestly, Claude is really bad at modeling objects, so some of the assets are free ones, and some I made myself with 3D AI tools.

**[Liminal space (@greeimm)](https://x.com/greeimm/status/2117654413095637415)** · Maker of a piece a tool author showcased · 1,194 followers

### Staging: block once, then cut

Pros work in the same order a good prompt does.

> Block it out first without animation. Do a series of static compositions in the same scene file.

**[fxguide on Chris Edwards's previs guide](https://www.fxguide.com/?p=21653)** · Edwards is co-founder and CEO of The Third Floor. 2008 notes, not his exact words

> But in computer animation, it’s actually camera, action, lights.

**[Patrick Lin](https://theasc.com/articles/toy-story-4-creating-a-virtual-cooke-look)** · Director of photography, Pixar

Block the action once in world time and make each shot a camera on it, so continuity comes free. Replace hard animation with a before pose, an after pose and a cut.

**Stand-ins are the live argument.** Capsules let the model invent the gait. Jointed mannequins hand it a gait to copy, stiffness included. Half-animated limbs are the worst of both. Start with capsules, and use joints when a specific pose or contact point has to survive.

> A figure with limbs hands it a gait; a figure without limbs hands it only a position, a height, a pace and a heading, and the model invents the body.

**[Scenario](https://github.com/scenario-labs/skills/blob/main/skills/dcc/blender/scenario-blender-blockout/references/cast.md)** · Vendor skill with test notes

> the posed people gave it stiff motion to copy. we replaced them with blocks and used image refs for the look.

**[David Israel](https://x.com/RealDavidIsrael/status/2097028838249079149)** · Hosts ImagineArt Live, a live AI filmmaking stream · 823 followers · 175 bookmarks

> If the doll's stance is broken, that break appears directly in the video. Designing the stance mattered most.

**[Maru999](https://x.com/maru_999_/status/2117586762730192975)** · The counter-example: jointed dolls for a weapons fight · 138 followers · 1 bookmarks · translated

### Camera: only what a real camera could do

> We try not to do anything a real camera couldn’t physically do.

**[Patrick Lin](https://theasc.com/articles/toy-story-4-creating-a-virtual-cooke-look)** · Director of photography, Pixar

> Get accurate lens settings and camera settings. Try and use only lenses that could be used on the real shoot.

**[fxguide on Chris Edwards's previs guide](https://www.fxguide.com/?p=21653)** · Edwards is co-founder and CEO of The Third Floor. 2008 notes, not his exact words

> you find it’s an 18mm, and it’s a close up of an actress or something! It drives me insane

**[Roger Deakins](https://beforesandafters.com/2021/10/25/roger-deakins-on-cinematography-and-vfx-cross-over-and-why-the-dop-calls-his-stills-photography-personal-scribbles/)** · On previs cameras

> shooting an over on a 32mm or a 35mm and a closer shot on a 40mm or a 50mm. That seems to me more reflective of the human view. But I have no rule.

**[Roger Deakins](https://www.rogerdeakins.com/forums/topic/ots-to-close-up-move-closer-or-longer-lens/)** · On lenses, from his forum

| Want | Lens (full frame) | Note |
|----|----|----|
| Wide interiors, orbits | 24–30 mm | Boom instead of tilting, so verticals stay straight |
| Neutral, walking | 35 mm |  |
| Over the shoulder | 32–45 mm | Deakins: 32 or 35 |
| Closer shot, medium | 40–50 mm | Deakins: "But I have no rule" |
| Close-up, compression | 65–85 mm | Choose it for what the scene is about, not what fits |

- One move per shot, each with a job. "every shot was a zoom" is the common complaint.
- Write orbits as arcs. A straight line between two orbit keys goes through the subject.
- Frame one size tighter than you want. Generated framing tends to come back looser.
- Stiff camera? Write "handheld" in the video prompt, or add noise to the camera in Blender. Don't key jitter by hand.

### Light: leave it out, unless it is the shot

A guide clip should say nothing about light. Keep it flat and put light in the image references and the prompt. Deakins himself used a shape model for light, not for look:

> It was just a basic shape model that I could light with a moving light.

**[Roger Deakins](https://beforesandafters.com/2021/10/25/roger-deakins-on-cinematography-and-vfx-cross-over-and-why-the-dop-calls-his-stills-photography-personal-scribbles/)** · On lighting a shape model for the VFX team

When light does matter, work in the order Stephen Burum gave: shadow, then separation, then fill. Keep one clear direction.

> There’s no primary direction in the light, no shape, no sculpting.

**[Jarin Blaschke](https://theasc.com/article/nosferatu-exhumes-a-vampire-classic/)** · Cinematographer, Nosferatu

> The difference between a day and a night interior is not the exposure, but the difference between the volumes of blacks and highlights in the frame.

**[Stephen H. Burum, ASC](https://theasc.com/article/lighting-a-set/)** · Cinematographer, The Untouchables

Write it as numbers: direction, height, ratio (2:1, 4:1, 8:1), Kelvin (candle 1,850, tungsten 3,200, daylight 5,600). In the one test we found, "backlight", "silhouette" and "rim" read on screen, while "Rembrandt" and "chiaroscuro" didn't.

### Make it look at its own work

> they can't easily audit their work because they aren't able to efficiently and natively perceive videos or play games within them.

**[Andrej Karpathy](https://x.com/karpathy/status/2083749667410727319)** · On his own three.js test · 4.4M followers · 12.1K bookmarks

> None of these 20 check the output. Without something that reads the rendered frames back, the agent is just generating blind.

**[Jimmy Young](https://x.com/jimmyyangrz/status/2116421315620172177)** · Builds a screen-memory product for agents, so has an interest. Reply under a 12,614-bookmark list of 20 repos · 295 followers

The loop that works: numbers first (in frame, not blocked, camera not in a wall), then first, middle and last frames of each shot on a contact sheet, then a fresh agent that didn't build it, then a person. Stills catch errors. They don't catch taste or pacing, so you have to play it.

> The agent that built something is the worst judge of its own work.

**[Leon Lin](https://x.com/LexnLin/status/2116662591363690999)** · On critics · 33.1K followers · 1,067 bookmarks

> a model saying the render looks fine and a motion designer saying the easing feels off are pretty different checks

**[Dima (@CreativeDima)](https://x.com/CreativeDima/status/2112722094010363918)** · On self-checking agents · 688 followers

> I was happy with it after 22 iterations.

**[Ricardo Cabello (mrdoob)](https://x.com/mrdoob/status/2116314204307394855)** · Created Three.js · 91.3K followers · 1 bookmarks

> Count your follow-ups and post every prompt with the work. Receipts convince people; "one prompt" makes them suspicious.

**[Florence (@flxrnc)](https://x.com/flxrnc/status/2105311836190978392)** · On one-prompt claims · 3,333 followers · 8,768 bookmarks

When the first result is far off, restart rather than fix.

> if the first result doesn’t get reasonably close to the aesthetic you want, it’s often better to start over with a new prompt rather than keep trying to fix it.

**[Dilum Sanjaya](https://x.com/DilumSanjaya/status/2089179586911482146)** · On when to stop fixing · 76K followers · 122 bookmarks

**Keep scene data apart from the engine.** Have the agent build a small engine once and then change only numbers. This is where the token bills come down. [One 30 s Three.js previz took 10% of a \$200 plan](https://x.com/k_matsumaru/status/2096546411257160031) for Keigo Matsumaru, who traced it to an agent loop and expected it could be cut a lot.

## You have a reference video

**Decide first what you're taking.** If you own the clip and want the same camera with a different world, feed it straight in as `@video1`. A 3D prototype earns its cost only for something specific: an exact head count, contact points, continuous camera speed across clips, sync to music, or changing the camera or the set.

> With a reference video it traces cuts, composition and motion almost unchanged

**[aratama](https://x.com/aratamadao/status/2115778971442843889)** · The cleanest public A/B on references · 1,900 followers · 5 bookmarks · translated

He found the catch: final quality was dragged to the reference's level. Stills plus a prompt gave better camera and acting but lost the sync.

### To copy a shot as a 3D prototype

1.  **Split and look.** Find cuts in code, because agents only see frames. Lay out first, middle and last frame per shot.
2.  **Read the picture.** A 2D tracker reports pan, tilt and zoom as the image shows them. Good for describing a shot and for checking a generated clip against its previz. Bad for setting camera keys when the shot has parallax, because a dolly hides a pan.
3.  **Solve the camera, if it really moves.** Blender's motion tracker runs headless on CPU. It needs no GPU and no window, and it gives you lens, path and tracked points in 3D. You supply gravity (where's the horizon?) and scale (how big is something?).
4.  **Read the frame.** Put a grid on first, middle and last frames, and read subjects and big masses as fractions of the frame. On a clean frame an agent can read a lot: in a sealed test on 12 synthetic frames with hidden answers, a plain prompt got the focal length within x1.44 and the shot size right on 11 of 12. Real film will be worse.
5.  **Stage it** around the solved camera, with detail only at depths where the reference has it.
6.  **Compare.** Overlay at 50% for staging, on several frames. Your camera against the solved path for the move.

**Our test**

A fresh agent with only our skill copied a 5.3 s shot from the open film *Tears of Steel*. It found the shot isn't a zoom: a 25 mm lens dollies 1.6 m forward and right while panning left 8.8° and tilting down 5.8°, sliding past a dark cloth to find two people. "Slow push-in" would have missed all of that.

[Watch: A Tears of Steel shot on the left, the code prototype on the right (MP4)](https://s3.varg.ai/files/4325c578-378d-4c43-ae53-3cc3218df1ea/file_769bff9c2be3.mp4)

The film on the left, the prototype on the right. *Tears of Steel* (CC-BY) © Blender Foundation.

| Camera | Solve of the film | Prototype |
|----|----|----|
| Lens | 25 mm (flat 24–28) | 25 mm |
| Pan | 0 to −8.76° | −0.02 to −8.79° |
| Tilt | −6.66 to −12.50° | −6.65 to −12.50° |
| Height | 1.771 to 1.588 m | 1.770 to 1.588 m |
| Roll | +0.69 to −0.45° | 0 (the format had no roll then; it does now) |
| Film's tracked points through this camera | 0.32–0.75 px | 1.76 px median |

The camera copies the solve by design, so the table shows that the path transferred, not that it's independently right. The independent checks: on a test scene with a known 25 mm camera, the same method returned 24.86 mm, and the film's rail came out at 1.17 m. Metres are good to about ±15%. It took about 50 minutes on a busy machine, most of it staging. The clip itself was never played by anyone.

The solve fails on locked-off shots and nodal pans (no parallax), when a moving subject fills the frame, and on bare grey renders. Nobody we found documents a solved camera reaching Seedance with a measured match, and we haven't run that either. Body motion is less ready. Motion2MixamoRig needs one person, head to toe, the whole time. Watch the licences: GVHMR, SMPL and SMPL-X are non-commercial even under permissive repo badges.

> Foot sliding is still something I'm working on.

**[MaxLiu09](https://x.com/MaxLiu09/status/2113974668721856938)** · Author of Motion2MixamoRig · 1,143 followers · 43 bookmarks

### The line between studying and copying

> But I'll take the grammar wherever I can get it.

**[Brian De Palma](https://slashfilm.com/1104267/brian-de-palma-doesnt-think-its-very-fair-to-compare-him-to-alfred-hitchcock)** · On Hitchcock, New York Magazine 1980

**Study by copying, publish by transforming.** Take one shot's move, height and rhythm into your own scene, never a sequence's staging plus its look. This isn't legal advice, and no case squarely covers a camera move. In the US, *Rentmeester v. Nike* treats pose, lighting and angle as free in isolation but protects their combination, and *Dr. Seuss v. ComicMix* cuts against "new skin on a meticulous copy". The UK and EU are stricter. fal, BytePlus and Dreamina all make you warrant rights in what you upload. ShotDeck and Shot Cafe ban automated tools, so a person picks those frames.

## You have a painting or a still

Cinematographers read paintings. They rarely copy them.

> You look at an Edward Hopper painting and you can study where the light sources are

**[Sam Mendes](https://web.archive.org/web/2023/https://theasc.com/magazine/aug02/perdition/sidebar1.html)** · Director, on Road to Perdition

> we studied the lighting effects achieved in the paintings of the Dutch masters, but they seemed a bit flat — so we decided to light more from the side.

**[John Alcott](https://theasc.com/article/flashback-barry-lyndon/)** · Cinematographer, Barry Lyndon

> suggested that we light most scenes to look natural, so that when we show the audience how Caravaggio saw things through his own eyes, it looks and feels different.

**[Vittorio Storaro](https://www.moviemaker.com/vittorio-storaro-cinematographer-caravaggio-20071127)** · Cinematographer, on a film about Caravaggio

Exact staging is possible, and expensive. For *Shirley*, Gustav Deutsch matched Hopper's pictures for "at least one frame", which took tilted furniture and a camera that couldn't move three centimetres.

> \[In Hopper's paintings\] there are no right angles, or else two to three suns producing light effects.

**[Gustav Deutsch](https://austrianfilms.com/news/gustav_deutsch_ueber_shirley__visions_of_reality)** · Director, staged 13 Hopper paintings in Shirley · translated

**Our test**

**Don't eyeball it. Read the picture.** We staged Caravaggio's *The Calling of Saint Matthew* twice. Guessing the camera and positions put key points 9 to 22% of the frame off. The second time we placed everything from coordinates read off the picture, so those points land where the painting has them by construction. That alone proves only the maths. The real checks are the overlay and sizes nobody asked for: the table came out 0.76 m high.

![First try: small figures and a bright wall that doesn't match the painting](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/calling_first_try.jpg)

Guessed camera. Right idea, wrong picture.

![The picture-coordinates render overlaid on the painting at 50 percent](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/calling_overlay.jpg)

Read from the picture, overlaid on the painting at 50%.

![The Calling of Saint Matthew beside its grey-box staging](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/calling_side.jpg)

Painting (public domain) and staging in Blender EEVEE: the diagonal shadow, the dark upper left, the window, who points at whom. The light is still too flat. That's a judgement call the numbers can't make.

[Watch: A 4 s push-in through the staged Calling of Saint Matthew, rendered in EEVEE (MP4)](https://s3.varg.ai/files/4325c578-378d-4c43-ae53-3cc3218df1ea/file_830d40a7e930.mp4)

Once it's a scene, you can move a camera through it. A 4 s push-in rendered in EEVEE.

### The method

1.  **Put a grid on it** and read everything as (u, v), fractions of the frame.
2.  **Find the vanishing point,** if the picture has straight lines. Paintings rarely centre it, and sizes drift across the frame if you assume they do.
3.  **List what matters:** figures (head, feet, hands), big masses, the light and its shadow edge. Note what's dark.
4.  **Get depth from a known size.** A person 1.75 m tall with the head at v = .38 and feet at v = .93 stands 3.1 m away on a 35 mm lens. The feet then give the camera height.
5.  **Check a size you didn't ask for.** If a table comes out 1.4 m tall, something's wrong.
6.  **Place everything by picture coordinates.** A picture point plus a depth gives one world point.
7.  **Use one hard light and cut it with flags,** as on a real set: planes that cast a shadow where you need the edge and that the camera can't see.
8.  **Overlay it,** and hold a few points back as a check. Move on when the composition holds. Paintings cheat on perspective, so nothing will fit everywhere.

**Our test**

A fresh agent with only the skill staged Vermeer's *The Music Lesson*: 372 boxes, 85 of them floor tiles. It fitted the camera to 41 tile corners, so the lens came out at 36 mm and the eye at 0.99 m, a seated painter. **Of 9 points read from the painting and not used for placing, the worst was 2.7% of the frame and most were under 1.5%.** Sizes nobody asked for came out sane: chair seat 0.44 m, ceiling 2.93 m, virginal 1.71 m wide.

![Vermeer's The Music Lesson beside its 3D staging in code](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/vermeer_side.jpg)

Painting (public domain) and staging, rendered by three.js. No image model drew any of it. It's still wrong in places: one hard light where Vermeer has soft window light, a stepped carpet, a faked mirror.

![The staging overlaid on the painting at 50 percent](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/vermeer_overlay.jpg)

The overlay. Look here first.

[Watch: A 6 s push-in, 1.37 m into the staged Music Lesson room (MP4)](https://s3.varg.ai/files/4325c578-378d-4c43-ae53-3cc3218df1ea/file_0956be0bf9de.mp4)

Then move the camera: a 6 s push-in, 1.37 m into the room.

For a photo of a real place with straight lines, use [fSpy](https://github.com/perarnia/fSpy) to get the camera, then build around it. Keep rough references rough when they go to a video model:

> If you reference a highly finished picture, Seedance 2.0 tries hard to keep the shape of that still, and motion can go stiff or jerky.

**[@Ryuki_Yano](https://x.com/Ryuki_Yano/status/2079918378417111109)** · Storyboards for Seedance · 1,467 followers · 1,663 bookmarks · translated

## You have nothing

With no reference, agents reach for their defaults. "dark navy space, a glowing halo ring, bloom, particles", as flxrnc's untouched run came back.

> I asked for a pangolin, an armadillo and a scorpion with nothing to work from. All 3 came out as generic toys. Then I gave the same model one clip of a real V8 simulator and it rebuilt the engine panel by panel.

**[Elvar](https://x.com/elvar_official/status/2116174609355571402)** · Skill author, with specific bugs · 40.5K followers · 5,556 bookmarks

- **Ask for three cameras and pick one.** Three named options per cut as moving stand-ins, on one sheet. You don't need camera language to know which you like. (Eijo's method: 11 s, 2 cuts, one generation.)
- **Make the reference first.** Generate a key frame per beat with an image model, keep it rough, then stage those stills as above. Stills are the cheap place to find out it's wrong.
- **Borrow a structure you can name:** an Ozu dialogue at low height, a Hitchcock zoom. Have the agent write beats first.

> The most important thing I learned is that the references carry most of the quality in your prompt.

**[Leon Lin](https://x.com/LexnLin/status/2116662591363690999)** · Published repos, costs and limits for a 45-hour build · 33.1K followers · 1,067 bookmarks

> The images made discrepancies easier to describe. They did not automatically turn the illustrated shapes into the right meshes.

**[Ben Sun](https://x.com/SunBin70909/status/2115873237330489362)** · Ex-Ogilvy (per his bio), the most honest failure log we found · 84 followers

Both are true. References fix the look, not the structure. Structure comes from the beats and the numbers. Before any code, these need an answer in numbers or names: What's the one image the viewer remembers? Who has power in the shot? Where is the eye at each moment? What's in the foreground, middle and back? Where does the light come from, and what stays dark?

## Make it a real video

Three routes, from people who've run them.

| Route | What you get | The catch |
|----|----|----|
| Guide clip as `@video1` | Camera, positions, cut timing. The most common route | Copies stiffness too |
| Storyboard pages as image references | More natural motion, cheaper than a video reference | Looser control |
| Code-rendered final | No video model at all. Exact and repeatable | Suits machines, products and flat characters, not people |

> Blender is notoriously stiff and unnatural.

**[PJ Ace](https://x.com/PJaccetturo/status/2112899207568785784)** · Why they swapped the clip for boards on one film · 101K followers · 133 bookmarks

> It made all the cuts and camera work feel way more natural.

**[PJ Ace](https://x.com/PJaccetturo/status/2112899208462143765)** · On one film; later called it a per-shot choice · 101K followers · 67 bookmarks

Users writing in Japanese, Chinese and English reached the same split on their own: **video carries camera, path, position and timing. Images carry identity and look. Words carry what boxes can't show.**

> Omni-reference: the \[3D\] model indicates position, the images constrain style.

**[Cell (@cellinlab)](https://x.com/cellinlab/status/2108936584129372409)** · The division of labour · 35K followers · 1 bookmarks · translated

> The reference video is not a spec channel, it is a pixel channel.

**[7ohnson](https://github.com/7ohnson/VLM-Generation-Harness/blob/main/docs/02-ironclad-rules.md)** · VLM harness, published cut tables and costs · translated

**What we measured**

We ran our camera tool over our own launch film: 10 shots, Seedance 2.5, grey previz. It's one film, not a controlled test.

![Three pairs of previz above and Seedance output below, with matching layout](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/v2v_match.jpg)

When it works: layout, hands and pose held. Previz above, result below.

- **Cuts hold.** They landed within one frame.
- **When the words disagree with the previz, the words win.** In both shots where the prompt said "the android's face" or "close-up of the woman" over a previz from behind, the model turned the character to camera.
- **Camera moves aren't guaranteed.** Of 7 shots with enough tracking to measure, 4 kept the direction (two were nearly identical: zoom 1.124 vs 1.125, and 1.129 vs 1.127), 1 stopped moving, and 2 reversed. The one that named its move in the prompt kept it. That's a small sample, and naming costs nothing.

![Two previz shots from behind above; below the model turned both characters to face the camera](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/v2v_flip.jpg)

When it doesn't: both previz shots are from behind. Our prompt described faces, and the model followed the prompt.

> any inconsistency between previz and prompt weakens the effect.

**[Keigo Matsumaru](https://x.com/k_matsumaru/status/2100455064188207235)** · On long prompts over a previz · 45.5K followers · 40 bookmarks · translated

> the previz gives you a layout to work from. you still need to check whether Seedance follows it

**[NΞXUS (@NEXUS_TO_NOVA)](https://x.com/NEXUS_TO_NOVA/status/2117632582514864494)** · Six elders on a magic circle. Unrelated to PJ Ace's Nexus series · 31.1K followers · 32 bookmarks

> Seedance still isn't perfect at matching the reference but it's close.

**[Reid Hannaford](https://x.com/reidhannaford/status/2071595581508563168)** · Creative director in Brooklyn · 3,399 followers · 1,160 bookmarks

### The handoff prompt

**For Seedance and similar models**

```text
@video1 is rehearsal footage: stand-ins walked the scene so camera, timing and movement could be locked. Take from it
ONLY the camera path and framing, the timing of every action and cut, and where each element is and how it moves. No
shape, proportion, surface, colour or lighting from @video1 belongs in the final frame. The result must not look like @video1.

@image1 is <character>: <identity details in words too>. @image2 is <place>: <what is where>.
Only these people exist: <count and names>.

Look: <one line from the moodboard: film stock, lens feel, palette>.
Light: <direction, source, Kelvin or a named reference>. Ignore any lighting in @video1.

N shots, hard cuts exactly as in @video1:
1. 0.0-3.5 s. <Shot size and angle as the previz shows them>. <Who does what>. Camera: <the move, in words>.
   End state: <position, facing, what they hold>.
2. 3.5-6.0 s. Continuing from that end state. <...>. Camera: <...>.

Where a stand-in's proportions differ from the real object's, keep its path and timing and give it true proportions.
If the words and @video1 disagree about position or motion, @video1 wins.
No text, letters, numbers, logos or UI. No music. No dialogue unless written above.
```

- **Don't name the shapes.** Describe the finished shot as if it already existed.
- **Keep all text out of the clip.** Seedance read a subtitle in a previz and spoke it.
- **Generate at 480p first,** then re-render only the winners, and check them again because motion can change.
- **Keep runs short.** In one vendor's 28 renders, 10 to 15 s held and 20 to 30 s drifted. Stay in one location per run.
- **Check the length.** A 9.2 s reference came back as 9.0 s from Seedance, so stretch it before you cut it in.

> A prompt that names the proxies' shapes ("the box figure becomes", "each cone is") anchors the model on those shapes and it renders them as they are.

**[Scenario](https://github.com/scenario-labs/skills/blob/main/skills/dcc/blender/scenario-blender-blockout/references/handoff.md)** · Handoff rules with test notes

> Seedance 2.5 seems to read text in the video and reflect it in the dialogue.

**[Yumi (@japaneseg_yumi)](https://x.com/japaneseg_yumi/status/2116431209190625477)** · Why no text in a previz · 107 followers · translated

### Grey or colour? Nobody knows yet

This is the biggest open question, and our own skills had it wrong by calling grey a rule.

> Anytime I let OPUS color the blockout it ends up following the blockout way too verbatim. As soon as I convert it to grey, it works instantly

**[A.I.Warper](https://x.com/AIWarper/status/2106448701635842120)** · For grey · 38K followers · 9 bookmarks

> An all-gray playblast has lost identity.

**[Scenario](https://github.com/scenario-labs/skills/blob/main/skills/dcc/blender/scenario-blender-blockout/SKILL.md)** · For colour

> To be clear: the 'grey is better' half is reasoning, not an A/B test.

**[7ohnson](https://github.com/7ohnson/VLM-Generation-Harness/blob/main/docs/02-ironclad-rules.md)** · Honest about the evidence · translated

**Our default:** greyscale, with characters clearly apart in brightness. Use identity colours with a written legend when several characters must stay distinct. White clay and depth-only clips also work. Whichever you pick, test both on one short window before a long run, because it varies by model. Two pros found motion blur helps on fast objects, so a clean viewport capture can be too clean:

> I found that Seedance read the propeller motion much better if I had motion blur, so a simple hardware rendered playblast would not cut it.

**[Aharon Rabinowitz](https://x.com/ABAOProductions/status/2113284828514615563)** · Cinema 4D + Seedance · 22.1K followers · 15 bookmarks

> motion blur in the previz is inherited by the AI-generated video.

**[Kaku Drop](https://x.com/KakuDrop/status/2071471484921696332)** · Tokyo director and CG artist, Unreal previz · 15.8K followers · 865 bookmarks · translated

## Rank the takes with an LLM judge

### The short answer

**Clear criteria are necessary, and they aren't enough.** They also have to be specific: with vague points like "fit for purpose", the pretty film won every comparison, and with specific ones it dropped near the bottom. Bias also comes in through what the judge is shown, how it's asked, who it is, and what it's allowed to answer. Fix all of that, then measure it against people.

- **Measure with code** whatever code can measure: framing, cuts, the camera, things passing through each other.
- **Gate each take alone** with yes/no questions, evidence first, "can't tell" allowed. A failure stops the take. Never add passes into a score.
- **Rank survivors in pairs** on specific points, evidence first, in both orders, with ties allowed. If the orders disagree, it's a tie.
- **A person picks** from the top tier. A judge cuts weak work. We found no test showing one can pick the best take.

> Simply asking an LLM to score the outputs was not reliable enough, even with a very descriptive evaluation rubric.

**[Ghita Houir Alami (Notion)](https://x.com/ghita__ha/status/2112924291746734557)** · Notion's production write-up: panel, pairwise votes, Elo, then a calibrated judge · 2,982 followers · 116 bookmarks

> Shipping an unverified LLM judge is the fastest way for people to lose trust in your evals (and your work in general).

**[Hamel Husain](https://x.com/HamelHusain/status/2010782094256222323)** · Teaches evals, says he's helped 30+ companies. Sells a course · 64.8K followers · 98 bookmarks

### What we measured on this task

**Our test**

We made a set where the right answer is known: one brief, a correct blockout and 11 copies with one seeded defect each. Then 360 blind calls to Sonnet 5.5, each in a fresh context with random file names, and 42 through Codex.

![Two contact sheets: on the left a plain correct grey blockout, on the right a lit, coloured one where the woman is missing from the last row](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/j_pair.jpg)

The test that matters most. Left: correct, grey. Right: lit and coloured, but the woman is gone from the last row. Asked which is better, the judge picked the right-hand one 6 times out of 6.

| Test | What the judge did | What fixed it |
|----|----|----|
| Two identical images, must choose | Picked the first 12 of 12 (Codex 4 of 6), saying it was "picking A by default" | Allow a tie: 12 of 12 ties |
| Identical images, one labelled "made by a senior previs supervisor" | Picked the label 12 of 12 (Codex 6 of 6). "Your own earlier work": 8 of 12 | Hide it. "Ignore who made it" still gave 4 of 6. With a tie allowed: 0 of 12 |
| Lit and wrong vs grey and right | Picked lit 6 of 6 (Codex 4 of 6) | Evidence first: 0 of 6. Stating the purpose: 1 of 6. Greyscale inputs: **no help**, 6 of 6 |
| A 1 to 10 score, alone | Averages from 3.7 to 6.3. 4 of 10 defects scored no lower than the correct one. A missing person got 6.3 against 6.0 | Don't use it |
| Yes/no questions, as a gate | 57 of 58 defect runs failed something. 7 of 8 correct runs failed nothing. Claude and Codex both worked | Keep. Read the evidence on any failure |
| She walks through the desk between sampled frames | The sheets are the same, so no judge can see it | Our audit script catches it |
| A question we wrote before seeing real work | "Head visibly higher" failed all three grey real runs, because those agents showed it differently | Reworded after looking. This is criteria drift, and it still caught the seeded defect 3 of 3 |

Then on our four real runs from the tests below, as a guide clip:

| Run | "Which is better?" | Evidence first, vague points | Evidence first, specific points | Yes/no passes of 10, three runs |
|----|----|----|----|----|
| A, the pretty lit film | 3.0 | 3.0 | 0.25 | 5, 5, 5 |
| B, master prompt, Three.js | 1.25 | 1.5 | 2.5 | 9, 9, 9 |
| C, master prompt, Blender | 1.75 | 1.5 | 2.5 | 9, 10, 10 |
| F, master prompt, Codex | 0 | 0 | 0.75 | 7, 7, 7 |

The middle columns are wins out of 3. Same model, same pictures, same stated purpose. Comparing point by point wasn't enough: with vague points ("fit for the purpose", "staging and readability") the pretty film still won everything. It dropped only when the points were specific and named what a guide clip rules out, such as "flat light with no drama, because the video model must not copy it". Our tool's own end-to-end run gave the same result: vague, A 3.0 of 3; specific, B and C 2.5 and A 0.5. **What this doesn't show:** it's one brief with defects we seeded, no human compared the rankings, and it says nothing about taste.

### Where bias comes from

| Bias | What's been measured | What helps |
|----|----|----|
| Position | Verdicts flip on swap: 46% in the first paper, [62.5% in a reproduction](https://zou-group.github.io/llm-claims-shelf-life/) on similar models. On UI pairs, GPT-5.1 was right [35.67% with the winner first, 81.33% second](https://arxiv.org/abs/2505.05026) | Both orders, disagreement is a tie. [GPT-4V on aesthetics: 64.48% to 86.70%](https://arxiv.org/abs/2406.09397) (experts 85.00%), though fewer pairs get decided. It drops the pairs where position decided the verdict. It doesn't make the judge better: on all pairs, [agreement stayed 0.51 to 0.54](https://arxiv.org/abs/2605.20731) |
| Polish | [Black padding +10.4%, brightness +5.9%](https://arxiv.org/abs/2505.15249) with no change in content (GPT-4.1-mini, worst setting of each). Defining the bias to the judge cut them to +5.6% and +0.8%, but didn't remove them. In one [SeeCut](https://github.com/YeJe-cpu/SeeCut) calibration (one project, a handful of versions), Gemini watching the video chose a fake cut in both orders. Its foreground really was better; its background was a placeholder grid | Fail named defects first, then compare. Same layout for every take |
| Labels and text in the image | [Numbers written on an image](https://arxiv.org/abs/2605.11218) shift ratings about 2.5 times more than blur and JPEG damage on average (2.09 vs 0.85). Extreme blur alone moved them about as much | Random names. No take numbers, scores or captions |
| Earlier scores | [d up to 0.71 over 192,000 attempted evaluations](https://arxiv.org/abs/2608.25869). In a separate test with human labels, they blocked 48% of corrections (GPT-4.1). A warning didn't reduce the score shift on the one task tested, though it did remove the accuracy loss on labelled data | Hide prior scores, attempt counts and the builder's summary |
| Self-preference | Blind writing judgments: [Sol +7.7, Opus 5.5 +3.4, GLM +1.8 of 100](https://benchmark.towardsai.com/judges.html) (vendor). GPT-4 is [73.5% accurate at telling its own summaries from others'](https://arxiv.org/abs/2404.13076). We found no test on images | Never the builder's session, ideally another lab. [Fresh critic +13.2 to +23.8, self-check −3.2 to +2.7](https://arxiv.org/abs/2610.34577) (18 tasks, vendor study, and one model inflates it) |
| Forced verdicts | Pairwise judges [pick a winner even when their own scores show almost no gap](https://arxiv.org/abs/2606.13685), and 13.6% of preferences flip between runs (two OpenAI mini models, 29 tasks) | Allow ties. Report tiers, not a list |
| Shared blind spots | On text inference tasks, [nine judges behave like 2.0 to 2.5 votes](https://arxiv.org/abs/2605.29800), and the best single one matches or beats them. On 1,460 Text Arena battles where both picked a winner, judges agreed with each other [79.4% and with the person who voted 56.9%](https://arena.ai/blog/llm-judge-self-preference) | Two model families as an alarm, not a vote. Calibrate on people |

> One caveat: a bias all the judges share cancels out of these comparisons. Only an outside reference, like human ratings, can measure it.

**[Towards AI (ToneBench)](https://x.com/towards_AI/status/2117507550081917245)** · 28,200 blind writing judgments. Vendor · 41.1K followers · 2 bookmarks

> The separation doesn't immediately eliminate that leniency on its own; the evaluator is still an LLM that is inclined to be generous towards LLM-generated outputs.

**[Prithvi Rajasekaran (Anthropic Labs)](https://www.anthropic.com/engineering/harness-design-long-running-apps)** · Built a separate visual critic

> On a three-minute song clip the fresh reviewer scored every cut 0.5 to 1.5 points above the owner, and stopped moving at about 7.5.

**[Tal Siach (Take One)](https://github.com/talsiach/take-one/blob/HEAD/references/reviewer-brief.md)** · Logged reviewer vs owner gaps · 9,258 followers

### What a judge can't see

Give the job to whoever can do it. Some of these numbers come from older models, and we found no run of these defect tests on Opus 5.5, GPT-6 or Gemini 4.

| Defect | Judge reading frames | Use instead |
|----|----|----|
| Parts passing through each other | A mug sat inside a body on [373 of 420 frames](https://x.com/m4lkxx/status/2116504147465757161) and passed every sheet | A geometry check on every frame |
| Motion, speed, direction | [Gemini 3.1 Pro 60.0%, GPT-5.6 Luna 15.0%, open models at most 11.7%](https://arxiv.org/abs/2609.09528), chance 6.25%, humans 91.3%. More frames didn't close the gap | A solved camera or tracked path. Then your eyes |
| Things popping, morphing or lagging | [Spearman with people: GPT-4o 0.176, Gemini 1.5 Pro −0.172](https://arxiv.org/abs/2406.15252). A trained model reached 0.803 | A scorer trained on video, or a person |
| Cuts and pacing | [Counting cuts, % right on a 4-option question (chance 25): GPT-4o 34.5, Gemini 1.5 Pro 58.6, people 87.5](https://arxiv.org/abs/2411.10979) | A shot detector. Pacing is yours |
| Text | Vision models [can rewrite wrong text into plausible text](https://arxiv.org/abs/2607.21617) (tested on documents, up to 10% of short words) | OCR and a diff |
| Counting things | Fine on our stand-ins. [17.05% on altered familiar subjects](https://arxiv.org/abs/2505.23941) in an adversarial set | Scene data, or a detector |
| Which of two close takes is better | Designers' taste: [0.55 to 0.66 where a judge is order-consistent](https://arxiv.org/abs/2605.20731), against a 0.741 ceiling. "More real?": [Gemini 3.1 Pro 48.6%, human experts 86.4%](https://arxiv.org/abs/2605.18984) | A person |

> The model can review the sheet. It cannot review between the frames, and it cannot review taste

**[m4lka](https://x.com/m4lkxx/status/2116504147465757161)** · Logged 100+ defects across ten Three.js and Blender films · 7,244 followers · 302 bookmarks

> Video and audio judges hallucinate problems, so verify every claim against frames.

**[Elie Steinbock](https://x.com/elie2222/status/2107186094777434454)** · Published the prompt his agent wrote from making his product videos, about 15 walkthroughs plus launch films · 16.8K followers · 539 bookmarks

Native video isn't a clear escape: counting synthetic bounces, one model scored [19.6% with native video, 29.3% at 4 fps and 68.6% with oracle keyframes around each true bounce](https://arxiv.org/abs/2608.06361), but on state changes those keyframes dropped it from 36.8% to 6.3%. Use code to find the moment, and test whether showing those frames helps.

### How to write the criteria

- **Look at real outputs first.** Ours failed when we didn't.
- **One observable thing per question,** with what fails it. "Is it good?" fails, and so does "fit for the purpose".
- **Name what the purpose rules out.** This is what moved our ranking: a judge won't mark down a beautiful render unless a point tells it to.
- **Say what to ignore:** polish, colour, lighting, detail.
- **Allow "can't tell", and allow passing.** A judge told to find defects will find them.
- **Don't add up passes.** In the same SeeCut project, 11 summed criteria tied the fake film with the reference, and only 1 of 11 told them apart. Use them as a checklist of named faults.
- **Write some questions whose true answer is no.** [96.6 to 100% of generated yes/no questions](https://arxiv.org/abs/2412.13989) answer yes, so a judge that always says yes looks good. We haven't tested this fix.
- **Watch your adjectives.** They steer whatever the judge is grading.

> Criteria drift raises serious questions for tools that assume the independence of evaluation from regular human observation of model outputs.

**[Shreya Shankar](https://x.com/sh_reya/status/1782425967115501603)** · Who Validates the Validators? Named criteria drift · 59.6K followers · 4 bookmarks

> Reviewers can become so focused on checking each item that they overlook problems outside the rubric.

**[Hamel Husain and Shreya Shankar](https://hamel.dev/blog/posts/evals-faq/)** · Evals FAQ · 64.8K followers

> Including phrases like "the best designs are museum quality" pushed designs toward a particular visual convergence

**[Prithvi Rajasekaran (Anthropic Labs)](https://www.anthropic.com/engineering/harness-design-long-running-apps)** · On criteria wording

> I told the judge to find defects, so it finds defects. When the real ones run out, it invents nitpicks and style preferences

**[Daniel C. Sunday](https://x.com/DanielChibuihe/status/2117186879493668887)** · A judge in a retry loop that never converged · 9 followers

> "It feels off" is a mood. A frame number and a cause is a task

**[m4lka](https://x.com/m4lkxx/status/2116504147465757161)** · On writing notes a judge can act on · 7,244 followers · 302 bookmarks

> A clean, simple shape can score 100 here without resembling the photo.

**[Kaloyan Chernev](https://kaloyan.blog/ai-models-rebuild-a-photo-in-blender)** · On the mesh-health score in his code-scored Blender benchmark

Criteria and comparison do different jobs. [On recovering the intended quality order, comparison beat a rubric](https://arxiv.org/abs/2605.25240): attorneys reached rho 0.908 against 0.150, and GPT-5.4 0.421 against −0.250 (vendor co-authors, text). Ranking 7 image-editing models, [pairwise Elo agreed 0.86 with LMArena, against 0.36 for pointwise scores](https://arxiv.org/abs/2602.06013) taken from earlier papers. So use criteria to reject, and comparison to order.

### The protocol

1.  **Separate three questions:** does it follow the brief, is it fit for its purpose, and is it good. Only a person answers the third.
2.  **Compute first:** framing, blocking, cuts, camera, things passing through each other.
3.  **Clean the inputs:** same layout, size and timestamps for every take. Random file names. No numbers or captions. No author, attempt count, earlier verdict or builder notes.
4.  **State the purpose.** A guide clip and a finished film want opposite things.
5.  **Gate each take alone.**
6.  **Rank survivors in pairs,** two images per prompt, in both orders. Under 8 takes, run all pairs.
7.  **Use a second model family.** Where they disagree, a person decides.
8.  **Put controls in every round:** an exact copy must tie, and a pretty-but-wrong take must lose. If they don't, throw out the round. Check that it looked: SeeCut voids a verdict unless the judge can copy on-screen text and state the duration.
9.  **Report tiers, then a person picks.** Log the judge's pick first, so you can compare later.

**Gate one take, in a fresh context**

```text
BRIEF: <the brief>
PURPOSE: <a guide clip: an AI video model copies only its camera, positions and timing, then redraws everything>
The contact sheet's rows are shots in film order, its columns are the first, middle and last frame. Cells are written R2C3 for row 2, column 3.

Answer each question using only what you can see. Write the evidence first: which cells you looked at and what's in them. Then give a verdict: pass, fail or cannot_tell. Use cannot_tell whenever the frames don't settle it. Never guess.
Don't reward or punish polish, colour, lighting or detail unless a question asks about it.

people: <who must be in which cells>. Fail if anyone is missing, or anyone extra appears.
order: <what each row must show>. Fail if the rows are out of this order.
in_frame: In every cell where a person should be seen, their whole head is inside the frame.
not_blocked: Nothing covers a person's head in any cell.
action: <a rule from the brief you can see in frames, like "the man's nose mark points at the camera in every cell">
coverage: The rows use clearly different shot sizes.
separation: Each person stands out in brightness from whatever is directly behind them.
clean: No readable text, numbers, labels or captions anywhere.
change: <what must differ between the first and last column in a shot, written loosely enough to allow different ways of showing it>
neutral: Flat-lit: no dramatic light pools, hard cast shadows or saturated colour. (Guide clips only.)

Reply with only JSON: {"people":{"evidence":"...","verdict":"pass"}, ...}
```

**Compare two takes. Run it twice, with A and B swapped**

```text
BRIEF: <the brief>
PURPOSE: <the purpose>
Two pictures, A and B. Look at both before you decide.

Compare them on these points, one at a time: <criteria>.
For each point, write what you see in A and what you see in B, and cite where. Don't reward polish, colour, lighting or detail unless a point asks about it.
Only then decide which serves the purpose better. If neither does, say tie: ties are a normal answer.
Reply with only JSON: {"notes":{"point":"..."},"winner":"A"} where winner is A, B or tie.
```

The skill's `judge_pack.py` does the blinding, the copy pair, both orders and the scoring.

### Check it against people

- **One named person owns taste.** Don't use a proxy.
- **Labels:** about 100 per failure mode. For ranking, 100 to 150 pairs from at least two people.
- **Measure** true positive and true negative rates on held-out labels, and kappa, because [raw agreement overstates it by 33 to 41 points](https://arxiv.org/abs/2606.19544). Track signed error too, since [kappa under-reports a constant bias](https://x.com/IanArawjo/status/2079302428558524690).
- **Re-audit after any model change.** [One upgrade collapsed 93% of scores onto a single value](https://arxiv.org/abs/2610.32986). About 200 calls on an anchor set finds it.
- **Test before trusting it on takes:** 20 shots with 4 takes each, against a director's picks and the director's own re-pick a week later. That re-pick is your ceiling.

> Aim for about 100 examples per failure mode, with enough Pass and Fail examples to measure both classes.

**[Hamel Husain](https://hamel.dev/blog/posts/llm-judge/)** · On validating a judge · 64.8K followers

> For most small to medium-sized companies, appointing a single domain expert as a “benevolent dictator” is the most effective approach.

**[Hamel Husain and Shreya Shankar](https://hamel.dev/blog/posts/evals-faq/)** · On who decides · 64.8K followers

> having evals and numbers help us get 80% of the way there faster, but maybe they're a crutch that it makes it harder to polish the final 20%?

**[Eugene Yan](https://x.com/eugeneyan/status/1960148508495020234)** · Member of technical staff at Anthropic (per bio) · 31.1K followers · 555 bookmarks

**The honest limit:** we found no test of an LLM's pick against a director's pick on generated takes. Takes of one shot, which differ only in performance, are the hard case, and judges agree with people [5 to 13 points less on same-model pairs](https://arxiv.org/abs/2512.16899). Treat this as triage until you've run that test.

## What we tested

We gave one brief to fresh agents that had nothing else: a detective at his desk, a woman walks in behind him and crosses to the window, he finally looks up, three shots, 12 s. No human stepped in. These tests measure the prototype only, and none of it went to a video model.

| Run | Prompt, tool | What came back | Time | Tokens |
|----|----|----|----|----|
| A | One line: "good cinematic camera". Claude, Three.js | A lit noir film: textures, 2,400 lines. Much prettier. Unusable as a guide clip, with an uncanny face | 67 min, then we stopped it, still polishing | 407K |
| B | Master prompt. Claude, Three.js | Clean blocking, three real shot sizes, honest list of faults | 25 min | 194K |
| C | Master prompt. Claude, Blender | The same, plus one camera idea it proposed: an arc that moves against her walk | 17 min | 172K |
| F | Master prompt. Codex CLI, default model, Three.js | Correct and honest. Flatter coverage: all three shots stay wide. WebGL blocked, so an SVG renderer | 7.5 min | 15K out, 1.9M in (mostly cached) |

**The honest reading:** the master prompt didn't make a better picture. It made a different object, at under half the tokens: something you can check, change and send to a video model. Run A looks better and costs more. If your final is the code render, that's the prompt to use, with a reference and a time budget. If a video model will finish the shot, its textures and light are exactly what you don't want in the clip.

![Contact sheet of run A, a lit noir film in code](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/t_a.jpg)

Run A, naive prompt. Beautiful, and a video model would copy all of it.

![Contact sheet of run C, clean blockout in Blender](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/t_c.jpg)

Run C, master prompt in Blender. Rows are shots; columns are first, middle and last frame.

![Contact sheet of run B, clean blockout in Three.js](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/t_b.jpg)

Run B, master prompt in Three.js.

![Contact sheet of run F, wide grey blockout from Codex](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/t_f.jpg)

Run F, master prompt in Codex.

### What the tests changed

They found real faults in our own work, and fixing those is most of why this guide can be trusted at all.

- **Our camera tool was wrong.** A fresh agent proved that any zoom leaked into pan and tilt, because the tool measured from the frame's corner. We fixed it and re-measured. The reversed-moves finding holds, since it rests on zoom direction. The false "pan right" on every push-in is gone.
- **"Rarely worth it" was wrong.** We'd written off 3D camera solving. An agent did it anyway, on CPU, in minutes. It's now a script in the skill.
- **Our "within 2%" painting claim was circular.** Points placed from the picture land there by construction. Only points you hold back count as evidence, and the guide now says so.
- **Vanishing points.** Our method assumed a centred one. *The Music Lesson*'s isn't. We added it to the method and to both renderers.
- **Greyscale merges.** Two agents' stand-ins blended once the clip went grey, so the prompt now asks for a brightness check. Two rendered the facing marker as a big black dot that could come back as a mark on a face, so it now matches the head.

**What we can't claim:** one run each, no controls, a loaded machine, and a judge (us) who wrote the prompt. Nobody has played these clips through a video model yet, so these tests show the prototypes are good, not that the films would be.

## What goes wrong

| Symptom | Usual cause | Fix |
|----|----|----|
| Generic look: navy, bloom, particles | Adjectives, no reference | Numbers, named bans, a reference image |
| Stiff, robotic result | Posed limbs in the clip | Capsules, or boards instead of a clip, plus "handheld" |
| The film looks like the previz | Too much detail, or colour, or no image references | Simplify, go grey, a reference for everything in frame |
| Placeholder comes back as furniture | Loose blocks near a figure | Remove them, or say what they are in words |
| Wrong camera in the result | The words disagree with the clip, or don't name the move | Describe each shot as the clip shows it. Name every move |
| Blank grey shot | Subject buried in geometry, not a bad camera | Check geometry first. Build openings as real gaps |
| Characters merge | Same brightness once grey | Check the grey version while they overlap |
| Text comes back garbled, or gets spoken | Labels or subtitles in the clip | Nothing readable in the frame |
| Agent says it's fine and it isn't | It rates itself and can't watch video | A fresh reviewer, frames on a sheet, a person plays it |
| Token bill explodes | Rewriting the engine each round | Scene data apart from the engine, 3 rounds then rethink |
| Agent's modelling looks bad | Asking it to model | It arranges. Tripo, Meshy or BlenderKit supply |

> if it's too specific the model reproduces it too faithfully and powerful action is hard to get.

**[@husky\_\_create](https://x.com/husky__create/status/2107773279486595542)** · Failure memo with both videos · 1,981 followers · 9 bookmarks · translated

## Who to follow

High reach and high bookmarks mostly belong to list accounts ("HOLY F\*CK, 20 repos": 12,614 bookmarks). Those posts show demand. These people show their work. Reach is X followers on November 3, and bios are self-reported unless noted.

| Who | Reach | Why |
|----|----|----|
| [Atsufumi Kashima](https://x.com/atsu_mada) | 110 | Smallest working skill ([previz-maker](https://github.com/atsu-mada/previz-maker-public)), printed prompts, stated failures |
| [Keigo Matsumaru](https://x.com/k_matsumaru) | 45.5K | When-to-use rules, previz vs no-previz comparisons, honest timing. Hit credit limits and says so |
| [PJ Ace](https://x.com/PJaccetturo) and [Theo Dudley](https://x.com/TheoDudley) | 101K, 748 | Public Blender docs and prompts for Nexus. The work was sponsored by Dreamina |
| [AIWarper](https://x.com/AIWarper) | 38K | Open process with failures and exact prompts |
| [@tebasaki3D](https://x.com/tebasaki3D) | 4.9K | Clearest tool rule. Tried previz after disliking it |
| [Aharon Rabinowitz](https://x.com/ABAOProductions) | 22K | About 20 years in Cinema 4D, a full thread with times and prompt |
| [KakuDrop](https://x.com/KakuDrop) | 15.8K | Tokyo director and CG artist. Unreal and MetaHuman previz since February |
| [Cell](https://x.com/cellinlab) | 35K | Best geometry and handoff writing. Says what the tests don't prove |
| [Int.Lab](https://x.com/IntLab0000) | 1.8K | The strongest case against overusing previz |
| [aratama](https://x.com/aratamadao) | 1.9K | Formulas, clay handoff, the honest A/B |
| [Leon Lin](https://x.com/LexnLin) | 33K | Repos, costs and limits for serious three.js worlds |
| [mrdoob](https://x.com/mrdoob) | 91K | Created Three.js. An authority on the render route, silent on previz for video models |
| [Scenario](https://github.com/scenario-labs/skills) | 23K | Best written blockout spec. A vendor with test notes |
| [7ohnson](https://github.com/7ohnson/VLM-Generation-Harness) | GitHub | VLM harness: published cut tables, costs and own errors |

**On camera and staging generally,** read [fxguide's notes on Chris Edwards's previs guide](https://www.fxguide.com/?p=21653), [Roger Deakins's forum](https://www.rogerdeakins.com/forums/), [Patrick Lin on Pixar's virtual camera](https://theasc.com/articles/toy-story-4-creating-a-virtual-cooke-look) and [Stephen Burum on lighting a set](https://theasc.com/article/lighting-a-set/). We found no credited previs pro from The Third Floor, Halon, Proof or NVIZ speaking on AI video, so no pro verdict exists on what amateurs get wrong.

**Repos, in the order we'd use them:** [scenario-labs/skills](https://github.com/scenario-labs/skills), [mcp-for-blender](https://github.com/ahujasid/mcp-for-blender), [VLM-Generation-Harness](https://github.com/7ohnson/VLM-Generation-Harness), [threejs-previz](https://github.com/DevMartinese/threejs-previz), [previz-maker](https://github.com/atsu-mada/previz-maker-public), [CozyClay](https://github.com/NomaDamas/CozyClay) (AGPL), [Motion2MixamoRig](https://github.com/MaxLiu22/Motion2MixamoRig) (check licences). Some of the best have almost no stars: threejs-previz and previz-maker had 0 when we checked.

## What nobody knows yet

- **Grey, colour, clay or depth** as the control clip. No head-to-head has been published.
- **Capsules or joints.** Scenario's one-take-per-cell test favours capsules. Others need limbs to hold facing.
- **Act-out or 3D** on the same shot.
- **Naming the lens.** We found no test showing that "50 mm" in a video prompt changes anything. Inside the 3D scene, a lens is simply correct maths.
- **Whether a blockout reads as a blockout to a pro.** We found no credited previs supervisor reviewing agent work.
- **Which model is best for this.** Reports conflict, including on Seedance 2.5 against 2.0.
- **Veo 3.1.** No evidence found. Kling 4 ignored the previz in the single test we found.
- **Whether a grey-box built from someone's film survives a provider's IP filter,** or the law.

The first two are cheap to settle. One 5 s window, four variants, same camera and paths. **We haven't run this.** It needs four paid Seedance runs: by the rates in our prompting skill, about 320 credits at 480p or 840 at 720p. The clips are rendered and ready.

![The same frame as grey capsule, colour capsule, grey jointed figure and colour jointed figure](https://varg.ai/how-to/guide-pages/previz-a-video-in-threejs-or-blender/media/ab_sheet.jpg)

The test, ready to run: grey or colour, capsule or joints. The skill's `example/ab-test` lets anyone run the same comparison on any model.

## The skill

`code-to-video-previz` packages all of this for an agent: the tool decision, a single scene file both renderers read, the number audit, shot splitting and camera measurement, picture-coordinate staging, handoff prompts, and the Caravaggio example. It leaves the full review UI and pack builder to `threejs-animatic` and `varg-previz`.

**Install:** `npx skills add vargHQ/skills --skill code-to-video-previz`, or copy the folder from [vargHQ/skills](https://github.com/vargHQ/skills/tree/main/code-to-video-previz). Then ask your agent: "prototype this shot with code-to-video-previz". The scene checks need only Python. Three.js needs Bun, Chrome and ffmpeg. Blender and camera solving need `uv` or a Blender install.

## How we did this

Six research tracks on X, GitHub and film press, collected November 3, 2026, gave about 1,250 quotes after separating practitioners from list accounts. Every quote here was checked against saved source text, and a separate agent then re-fetched every source live. All 69 were found. 17 needed a correction: names, lost context, and one translation that read as its opposite. Those corrections are in. Translated quotes are marked and originals are saved. We didn't watch most of the videos people posted, and sampled frames from a few. "Reach" and "bookmarks" are what X reported that day. Claims marked "per bio" weren't verified further. Many creators hold paid partnerships with video platforms, so weigh praise for tools accordingly. "Fable 5.5" claims were left out as unverified.

The judge section adds about 700 more quotes and over 250 measured effects, mostly from unreplicated 2026 preprints and much of it measured on text. Its quotes and key numbers had a live check too: 7 quotes and 18 claims needed correcting, including one comparison that mixed two metrics. Those are in.

"Our test" means we ran it. Everything else is someone's report, with a link. Legal lines aren't legal advice.

*The Calling of Saint Matthew*, Caravaggio, 1600, public domain, via Wikimedia Commons. *The Music Lesson*, Johannes Vermeer, public domain, via Wikimedia Commons. *Tears of Steel* (CC-BY) © Blender Foundation, mango.blender.org. Previz and Seedance footage from varg's own launch film.

## Go deeper

- The skill: [code-to-video-previz](https://github.com/vargHQ/skills/tree/main/code-to-video-previz) (`npx skills add vargHQ/skills --skill code-to-video-previz`)
- The designed version of this guide, with every picture and clip: https://varg.ai/how-to/previz-a-video-in-threejs-or-blender
- Every claim of the ten steps traced to its source: [the evidence bank](https://varg.ai/how-to/guide-pages/evidence-bank/)

## All 10 steps

The route, with the one line that hands it to an agent: [How to make a video with an AI agent in ten steps](https://varg.ai/how-to/make-a-video-in-ten-steps.md)

1. [How to find references for an AI video](https://varg.ai/how-to/find-references-for-an-ai-video.md)
2. [How to make a moodboard for an AI video](https://varg.ai/how-to/make-a-moodboard-for-an-ai-video.md)
3. [How to write a video script with an AI agent](https://varg.ai/how-to/write-a-video-script-with-an-agent.md)
4. [How to design sound and voice for an AI video](https://varg.ai/how-to/design-sound-and-voice-for-ai-video.md)
5. [How to design characters and props for AI video](https://varg.ai/how-to/design-characters-and-props-for-ai-video.md)
6. How to previz a video in Three.js or Blender (this page)
7. [How to animate a previz with AI video models](https://varg.ai/how-to/animate-a-previz-with-ai-video-models.md)
8. [How to edit a video with HyperFrames and AI agents](https://varg.ai/how-to/edit-a-video-with-hyperframes-and-agents.md)
9. [How to judge an AI video: measure, don't grade](https://varg.ai/how-to/judge-an-ai-video-without-bias.md)
10. [How to keep an AI video project in GitHub](https://varg.ai/how-to/keep-a-video-project-in-github.md)
