AI 视觉预演实验室 AI Visual Previs Lab

怎么生成一条白模动画

这份说明对应 previs-scene/1.0 合同:四类入口 → 一个场景文件 → 两种渲染后端 → MP4 + 验证记录。它写的是当前实际实现的能力和边界,不是路线图。

三十秒版本

cd experimental/whitebox-workbench

# 1) 起一个场景(模板,或从提示词编译,或从旧场景迁移)
python3 pipeline/previs_cli.py init --kit corridor-follow --param duration_s=8 --out case.json
python3 pipeline/previs_cli.py compile --text "镜1:中景,低机位,缓慢推进。硬切。镜2:特写,环绕。" --out shots.json
python3 pipeline/previs_cli.py convert old-scene.json --out migrated.json

# 2) 校验收口(结构 + 分镜 + 动作 + 溯源)
python3 pipeline/previs_cli.py validate case.json

# 3) 渲染
python3 pipeline/previs_cli.py build case.json --backend blender --out out/     # 离线,需要 Blender 5.x
# 浏览器后端:在预演台打开场景,导出对话框选「全部镜头」+「逐镜导出后拼合」

# 4) 门禁 + 验证记录(人类层一律 pending)
python3 pipeline/previs_cli.py verify case.json --mp4 out/previs.mp4 --out out/verification.json

四类入口

入口 命令或位置 生成什么 明确不做
模板 previs init --kit … 参数化的分镜骨架(过肩正反打、走廊跟随) 不编造剧情、台词、表演
提示词 previs compile --text … 只编译已经写出的镜头信息;缺的补 deterministic_default 并记录来源 「蒙太奇/多角度/快速切换」没有镜数时列为 unresolved,不自动分镜
结构化剧本 手写或程序生成 previs-scene/1.0 JSON 完整场景:区域、道具、人物、动作片段、逐关节覆盖、分镜、事件点 不解释自然语言
手工编辑 预演台界面 分镜列表、动作片段、道具动画与持握、摄影机节点 不做蒙皮、IK 或物理求解

提示词入口另有一个默认关闭的模型适配器:只有显式配置 PREVIS_LLM_BASE_URLPREVIS_LLM_MODELPREVIS_LLM_API_KEY 才会调用;模型返回的 JSON 必须过同一个校验器,失败只报 unsupported不会返回替代场景previs compile --model)。

场景文件里有什么(previs-scene/1.0

  • playbackfpsduration_sresolution
  • scene.geometry[]grid_plane(区域地面)或 box;可带 motion(道具动画)或 attach(挂到角色的手/背/胯)
  • cast[]proxy.class(人形/机甲/双臂悬浮)、motion(走位与朝向关键帧)、clips(动作片段,带 blend_s 混合)、gait(步速/步幅)、pose(逐关节覆盖)
  • camera.rigs[]:每条机位一组关键帧,支持 linear / smooth / step 缓动与 roll_deg
  • timeline.shots[]:分镜必须无缝铺满总时长;切点即真实切镜
  • timeline.beats[]effects[]tethers[]:事件点与接触标记,供「事件前中后」检查
  • validation_targets:门的阈值(支撑、净空、切点跳变…)
  • compilestatusassumptions[](每个补齐值的来源)、unresolved[]warnings[]

坐标约定:右手系,Z 轴向上,X 向右、Y 向纵深,地面 z = 0,单位米;facing_deg 0° 面向 +Y,90° 面向 +X。浏览器端在边界做一次 Y-up 转换,所以场景文件的坐标与 Blender 后端一致。

动作库(调度级代理)

idle / walk / run / turn / sit / stand / reach / point / carry / open_door,以及打戏调度代理 dash / guard / slash / slash_hold / block / thrust / recoil

这些是单轴关节的姿势与节奏代理:用于看机位、走位、动作次序和接触时机判不判得出来。它们不是表演、不是武术、不是物理结果;使用打戏片段时必须同时声明 require_attack_block_contact_recoil_readability,否则校验直接报错。

门禁(会在导出前拦住你)

检查什么 典型失败
脚底支撑 双脚最低点与脚下支撑面(区域/实体顶面/地面)的差 人物悬空、陷入地面;站在高处平台上不算错,头顶横梁不会被当作地面
净空 人物与实体、人物与人物之间的水平距离 两人叠在一起、贴墙穿模
取景与遮挡 每个角色的头/躯干/脚是否在画面内、是否被实体挡住 事件参与者被挡在画外(会升级为警告,其他角色只是提示)
接触可读性 声明了 contact/impact 时,双方的手/道具是否真的靠近 只有接触标记、没有接触
分镜连续性 切点前后的位置与朝向跳变 切镜瞬间人物瞬移
事件窗口 接触事件离镜头首尾是否太近 前中后帧不足,看不清事件

门只做数值与几何判断:好不好看、读不读得懂、能不能接受,仍然要人看,验证记录里这三层永远写 pending

两种渲染后端

  • 浏览器:在预演台里逐帧渲染(WebGL),服务器只做 PNG → H.264。支持整条时间线、单镜、以及「逐镜导出后拼合成序列 MP4」。这条路径在有浏览器的地方都能跑。
  • 离线 Blenderprevis build --backend blender,把场景降级成 previs-compiler/1.0 交给仓库里原有的 Blender 适配器,逐镜渲染后输出 MP4 与 previs_validation.json。需要 Blender 5.x(适配器使用了 5.x 的 image_settings.media_type)。

本机实测:Blender 5.2.1 在无 GPU 的服务器上能出片(EEVEE 走软件光栅化),但很慢:320×180 约 26 秒/帧,1920×1080 不适合在本机跑长片段。所以离线后端在本机的定位是验收与抽帧,长片请在带 GPU 的机器上渲染。

验收分层(沿用仓库规则)

数值/最终几何、全片解码、抽帧可读性、连续观看、用户接受、正式模型生成——自动入口只更新它真正执行过的层。previs verify 写出的记录里,human_review 三项恒为 pending