DEV Community

Voor AI
Voor AI

Posted on

How to Build a Camera-Movement Prompt Contract for AI Video

Camera-movement prompt contract cover

“Make it cinematic” is not a camera plan. A reproducible AI-video brief needs a move type, path, speed, subject lock, horizon rule, and stop condition. Voor’s current 3D Camera Transform page exposes a direct form with Seedance 1.5 Pro, image and optional last-frame inputs, a five-second default, 16:9, Public visibility, and Generate.

Represent the move as data

type CameraMove = {
  move: "orbit" | "dolly-in" | "dolly-out" | "crane";
  degrees?: number;
  speed: "slow" | "medium";
  target: string;
  distance: "constant" | "closing" | "opening";
  horizon: "stable";
  preserve: string[];
};

const brief: CameraMove = {
  move: "orbit",
  degrees: 15,
  speed: "slow",
  target: "centered electric coupe",
  distance: "constant",
  horizon: "stable",
  preserve: ["vehicle geometry", "wheel count", "studio lighting", "background layout"]
};
Enter fullscreen mode Exit fullscreen mode

Compile the contract into a prompt

function toPrompt(x: CameraMove) {
  return [
    `${x.speed} ${x.degrees ?? ""}-degree ${x.move} around the ${x.target}`,
    `${x.distance} camera distance`,
    `${x.horizon} horizon`,
    `preserve ${x.preserve.join(", ")}`,
    `one continuous move, no cuts, no zoom, no subject motion`
  ].join("; ");
}
Enter fullscreen mode Exit fullscreen mode

The negative constraints matter. Orbit and zoom are different operations; asking for both often creates an unstable hybrid.

Current Voor 3D Camera Transform interface

Run the current direct generator

Open the 3D Camera Transform workspace. Verify Seedance 1.5 Pro, upload an authorized still, leave the optional last frame empty for the first test, keep five seconds and 16:9, and choose visibility intentionally. The signed-in form calculates credits from the selected duration and required inputs; read that live estimate before pressing Generate.

Validate the output deterministically

Use a five-item acceptance test:

const checks = {
  continuousShot: true,
  horizonStable: true,
  targetCentered: true,
  geometryPreserved: true,
  moveStopsAtRequestedAngle: true
};

if (Object.values(checks).some(v => !v)) {
  throw new Error("Reject camera pass");
}
Enter fullscreen mode Exit fullscreen mode

Frame-scrub the clip at the start, midpoint, and end. Track wheel count, window shapes, logos, and horizon angle. A smooth clip can still fail if the vehicle mutates.

Failure modes

  • Orbit becomes zoom: state constant distance and no zoom.
  • Subject rotates instead of camera: say the subject remains stationary.
  • Horizon rolls: explicitly require a stable horizon.
  • Background melts: lock major planes and keep the angle modest.
  • Cut appears: require one continuous shot.

Limits

A prompt contract improves reviewability; it does not guarantee physical 3D reconstruction. The model estimates unseen surfaces. Larger angles reveal more invented geometry, so a 15-degree test is safer than a full orbit. Model availability, duration, visibility, and credit estimates are live facts and can change.

Use the current Voor camera-movement form only after the contract can be checked frame by frame.

Top comments (0)