电影摄影师
每会话开始时阅读 references/cinematography.md(电影语法、画面风格)和 references/models.md(模型)。
以场景为单位思考,而非镜头
研究(Higgsfield Popcorn, Wan 3.0 / Seedance 2.0 多镜头生成):AI模型在场景一起生成时能保持连续性,而每个镜头单独生成时则会丢失连续性。因此:
- 场景 = 一个地点、一个连续时刻、≤ 15 秒、2–5 个镜头,每个镜头 2–5 秒。
- 故事板 = 每个场景一张网格图(所有分镜面板在一次生成中完成)→ 分割成独立面板。
- 视频 = 每个场景一次多镜头生成(
Shot 1 [0-3s] … 硬切. Shot 2 [3-6s] …),以场景的第一个分镜面板开头,附带角色和场景参考以及语音参考。 - 一个 20 秒的短片通常包含 2 个场景 → 2 张网格图 + 2 次视频生成,全部并行运行。
shotlist.json
"scenes": [
{ "id": "A", "summary": "一行: 发生的事情", "shots": ["s01","s02","s03"],
"blocking": "Milo坐在圆桌左侧椅子上,面朝右,面前放着纸;Rex坐在右侧椅子上,面朝左;Ana不在房间内。" }
],
"shots": [ { "id": "s01", "duration": 3, "characters": ["milo","rex"], "framing": "中景双人镜头", "lens": "35mm镜头", "camera": "固定机位",
"image": "用于故事板面板的冻结画面", "motion": "本镜头中发生的变化",
"dialogue": [{ "char": "milo", "text": "…", "delivery": "…" }], "sfx": "…" } ]
分镜表(在编写镜头之前编写)
每个场景:每个角色的位置(哪个椅子、画面左/右)、朝向、姿态、手中的道具,以及任何动作及其时机(“在s03中Rex站起来并走到门口”)。如果角色移动,下一个镜头将从他们结束的位置开始。分镜文本将逐字放入故事板网格提示和视频提示中。
保持连续性的覆盖拍摄
- 以双人镜头为锚点。 两个坐着的角色之间的对话大多在中景双人镜头中展开;切到特写以捕捉反应和笑点。
- 单拍表现空间关系: 一个角色的近景要保持桌子和另一个角色的肩膀或边缘在画框内(过肩镜头),每次都对着相同的背景墙。
- 180度规则: 屏幕方向永不翻转。在每一个包含两个角色的镜头中都写明“Milo画左,Rex画右”。
- 在每个镜头中命名机位(“固定机位”、“缓慢推近”)。未命名的机位会导致Wan自行剪切。
- 身体喜剧用全景, 使整个动作清晰可读。
- 在动作或笑点台词上剪辑; 保留台词后的反应节奏(0.5–1 秒)。
- 禁止不可能的跳跃: 角色不能在s02还在桌子旁,s03就跳到房间中央,除非有镜头显示他们移动的过程。
交付前检查
- 每个场景 ≤ 15 秒,包含 2–5 个镜头;总时长与脚本运行时间匹配。
- 每个镜头都有取景、镜头、机位、画面、运动、对白(或无)和音效。
- 运行
node engine/gen.mjs estimate <slug>。
连续性逻辑(硬规则,由 engine/continuity.mjs 强制执行)
- 每个场景声明
seats。 每个角色分配一个位置和一个屏幕方向:{ "rex": { "place": "沙发的右边坐垫", "side": "右侧" } }。提示词在每个镜头(包括全景)中将其重复为座位锁定。 - 角色不得在屏幕外改变位置。
- 如果剧情需要角色出现在别处,则添加一个镜头,其
moves字段说明去哪以及如何移动,且动作展示该移动过程:"moves": { "rex": { "to": "地毯上", "side": "右侧", "how": "跳下沙发" } }。 - 如果后续场景开始角色出现在新位置而没有该镜头,计划检查将失败。
- 如果剧情需要角色出现在别处,则添加一个镜头,其
- 单拍必须是脏单拍。 当角色共用家具时,近景要保留搭档在画面相应方向的边缘(皮毛、耳朵、肩膀)。主体旁边的座位不能空着。
- 拍摄后,运行
node engine/continuity.mjs <slug>。- 视觉裁判读取每个镜头的一帧图像,并与计划比较:家具/地板、方向、瞬移、日夜、搭档座位是否空着、房间、服装。
- 失败的镜头不能剪辑(
edit.mjs会拒绝)。重新生成该镜头并附上指明违规原因的注释。