Predictable AI video generation: a proof of concept
Camera moves, marks and faces fixed before anything is generated, and motion transfer tested, on The Midnight Line, a vertical microdrama on Singapore's last train.

What this proof of concept tests
AI video models are good at content and poor at staging. Ask one for three people in a loading bay and you get three people in a loading bay. Ask again and the camera is somewhere else, the people are a different size in frame, and someone you did not ask for walks across the front. For a brand or a series, that means a shot cannot be planned, only re-rolled until one comes out right.
This proof of concept tests whether the parts a director owns can be fixed before anything is generated: where the camera goes, when it moves, where each person stands, and whose face it is. We tested each part on its own with measured runs, then used them together on The Midnight Line, a vertical microdrama set on Singapore's last train.
The same prompt with no staging
We ran one plain prompt four times, with no start image, no reference video and no blocking: three people in a loading bay, a woman walking, a man approaching her, a second man near a crate.
All four runs had roughly three people in them, so the model followed the content. Everything else changed. At the first frame, the lead person filled anywhere from 27% to 91% of the frame height, a 3.4× spread in shot size from an identical prompt. One run changed shot halfway through, unasked, when a figure crossed in front of the camera. Sets, lens and light direction differed in all four.
Blocking the camera move in Blender
Each shot is blocked in Blender first, with simple stand-in figures and a camera. The move is watched on a loop and corrected there, where a change costs nothing. Only an approved blocking goes forward.
The approved blocking reaches the video model in two forms. The first is a rendered clip of the blocking, passed as a reference video. The second is a written description of the timing, read directly from the Blender scene's keyframes rather than written by hand: when the camera moves, how far, and how fast each person is going.
A controlled test showed that both are needed. The blocking was a hold, a quick 90-degree turn between 2.0 and 2.5 seconds, then another hold:
| What the model was given | When the turn happened |
|---|---|
| The Blender blocking itself | 1.96–2.46s |
| Exact timing in the prompt, plus the blocking clip | 1.92–2.62s |
| Exact timing in the prompt only | 1.62–3.33s, smeared over 3.4× its length |
| A vague prompt, plus the blocking clip | No distinct turn at all |
With both, the turn landed within about a tenth of a second. On an 8-second shot with several camera beats (trail, pass, overtake, turn, slow down), every beat arrived in order, within about 0.7 seconds of its blocked time. That is close enough to cut to music. It is not frame-accurate, and we do not promise that it is.
Holding each person to a mark
To test position, we blocked a five-second shot with three people, each with a mark to hit. Each person's identity came from a trained face model, and the same start image was used for every version. We then measured where each person actually was in the generated frames against where they were blocked.
| What the model was given | Mean distance from the mark, as a share of frame width |
|---|---|
| Blocking clip, timing prompt and the three faces | 0.009 |
| Timing prompt and faces, no blocking clip | 0.102 |
| Plain prompt and faces | 0.113 |
Without the blocking clip, people ended up 11 to 12 times further from their marks. With it, all three landed in their blocked third of the frame at every one of the 17 points we checked.
Position also held across re-rolls. When we generated the same blocked shot again, the cast stood where they were blocked each time, so choosing between takes became a call about performance, not a fix for staging.
Holding faces across shots
Each character in a production has a locked written description, a trained identity model, and one approved reference still. Every new shot is made from that still, not from a fresh description, because a fresh description lets the face drift.
We measured identity on two four-second close-ups from The Midnight Line, scoring each face against the character's reference sheet with a published face-matching model. Both faces scored above 0.6 at the first frame and dropped by only 0.03 to 0.04 by the last, against a match threshold of 0.363. The face stayed the same person while the expression changed.
Motion transfer
Motion transfer takes the movement from a reference performance and puts generated characters into it. We tested it on a 10-second fight between two characters, comparing two routes.
A dedicated motion-transfer model kept the reference's body movement, camera and cuts closely, and matched the lead character's face to her reference sheet, but it held on to the reference location: scaffolding and a background figure from the source stayed in the shot. A general video model given the same reference video built a clean new set from our images, but the faces drifted further from their references.
So the choice of route depends on which matters more for the shot: the exact moves, or a clean set and faces. That test used a reference clip we do not own, so its footage is not shown here.
What it does not do yet
Body pose does not transfer from the blocking. A stand-in figure that crouches just gets shorter, which the model reads as nothing. A pose has to be fixed with an end image showing it, which made it reliable.
The timing of an expression cannot be directed. In a test that asked for an emotional beat, the performance landed and the cast held their marks, but the beat arrived about a second early and the camera pushed in closer than blocked.
Size of performance needs checking by eye. One of the Midnight Line close-ups plays open-mouthed fright where the episode needs a mild, deniable chill. The face held; the performance was too big, and that shot needs another take.
The Midnight Line, episode one
The Midnight Line is a near-silent supernatural romance: a woman sleeps past her stop on the last train and brushes past a man no one else can see. Episode one is planned at about 75 seconds in 18 shots, cut first as an animatic before anything was generated.
The episode is the test bed for this proof of concept, not a finished film. So far it has an approved animatic, a blocked dash through the carriage with generated takes, and two generated close-ups whose eyelines oppose, so they cut together as a shot and its reverse.
Built with
- Blender 5.2.1
- Blocks each shot with stand-in figures and a camera, and renders the blocking clip.
- Python
- Reads camera and cast timing off the Blender keyframes and writes it into the prompt.
- Seedance 2.5
- The video model, run on Higgsfield with the blocking clip, start and end images and the timing prompt.
- Higgsfield Soul
- Trained identity models, one per character, used to make each character's reference still.
- Nano Banana Pro
- Start and end stills, including end images that fix a pose the blocking cannot carry.
- Higgsfield motion control
- The dedicated motion-transfer model compared against Seedance 2.5 in the fight test.
- Higgsfield CLI 1.1.26
- Runs and prices every generation from the command line.
- OpenCV
- Measures the results: YOLOX-tiny finds people for the position checks, SFace scores faces against reference sheets.
- ffmpeg
- Stitches Blender frames into clips and builds the side-by-side comparisons.
- Claude Code
- The coding agent used to build the blocking, prompt and measurement tools.
Questions
Can you control the camera move in an AI-generated video?
Yes, within limits. bluebed blocks the camera move in Blender first, then gives the video model both a clip of the blocking and a prompt stating its timing. In a controlled test a blocked turn landed within about 0.1 seconds; on an 8-second multi-beat move, beats arrived in order within about 0.7 seconds. It is not frame-accurate.
Why does the same AI video prompt give a different shot each time?
Video models follow content but not staging. In bluebed's test, one prompt run four times always produced roughly three people as asked, but the lead person filled between 27% and 91% of the frame, a 3.4 times spread in shot size, and the set, lens and light changed every time.
How do you keep people on their marks in an AI-generated shot?
bluebed blocks each person's position in Blender and passes the rendered blocking to the video model as a reference video, alongside a timing prompt. In a three-person test, people ended up 11 to 12 times further from their marks when the blocking clip was left out.
What is motion transfer in AI video?
Motion transfer takes the movement from a reference performance and puts generated characters into it. In bluebed's test on a 10-second fight, a dedicated motion-transfer model kept the moves and cuts closely but held on to the reference location, while a general video model built a cleaner new set but let faces drift.
What can't AI video generation control yet?
In bluebed's tests, body pose does not carry over from a blocking stand-in and has to be fixed with an end image, the moment an expression lands cannot be directed, and the size of a performance still needs checking by eye. Timing is close, about 0.1 to 0.7 seconds, but not frame-accurate.
How does bluebed keep a character's face consistent across AI video shots?
Each character has a locked written description, a trained identity model and one approved reference still, and every shot is made from that still. On two four-second close-ups, face-match scores against the reference sheets dropped by only 0.03 to 0.04 from first frame to last, well above the 0.363 match threshold.
If you want something like this made, book a consultation