promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_

Camera control and motion — what separates slop from craft — step 8 of 8

Checkpoint

One last thing before we move on. pass this to mark the lesson done, or skip and keep moving. hop to the next when you're ready.

Final footage drill. Synthesize the shot vocabulary + camera moves into a shot planner: plan_sequence(beats) that takes a list of "beat" dicts and returns a list of "shot" dicts, one per beat, with shot type and camera move filled in according to these rules.

Each beat dict has:

  • intent (str): one of "establish", "reveal", "intensify", "reaction", "product_beauty", "resolution"
  • subject (str): what's being filmed
  • duration_sec (float)

For each beat, assign a shot_type and a camera_move using these rules:

intentshot_typecamera_move
establish"wide""slow pan right"
reveal"medium wide""dolly out"
intensify"close-up""slow push-in"
reaction"medium close""static"
product_beauty"medium""orbit 180 degrees"
resolution"wide""slow pull-out"

Return a list of {"subject": ..., "shot_type": ..., "camera_move": ..., "duration_sec": ...} dicts in beat order.

THEN, after building the sequence, validate that each shot's camera move fits its duration:

  • "orbit 180 degrees" requires duration_sec >= 4.0
  • "slow push-in" requires duration_sec >= 2.0
  • everything else is fine at any duration

Append "warning": True to any shot that fails the duration check. Pass-through shots get no warning key.

A 6-beat sequence runs. Expected output:

city / wide / slow pan right / 5.0 / ok
shop facade / medium wide / dolly out / 4.0 / ok
closing the deal / close-up / slow push-in / 1.5 / WARN
the buyer / medium close / static / 3.0 / ok
the product / medium / orbit 180 degrees / 3.0 / WARN
city again / wide / slow pull-out / 5.0 / ok

full-screen editor opens — close anytime to keep reading.