怎么生成一条白模动画
这份说明对应 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_URL、PREVIS_LLM_MODEL、PREVIS_LLM_API_KEY 才会调用;模型返回的 JSON 必须过同一个校验器,失败只报 unsupported,不会返回替代场景(previs compile --model)。
场景文件里有什么(previs-scene/1.0)
playback:fps、duration_s、resolutionscene.geometry[]:grid_plane(区域地面)或box;可带motion(道具动画)或attach(挂到角色的手/背/胯)cast[]:proxy.class(人形/机甲/双臂悬浮)、motion(走位与朝向关键帧)、clips(动作片段,带blend_s混合)、gait(步速/步幅)、pose(逐关节覆盖)camera.rigs[]:每条机位一组关键帧,支持linear / smooth / step缓动与roll_degtimeline.shots[]:分镜必须无缝铺满总时长;切点即真实切镜timeline.beats[]、effects[]、tethers[]:事件点与接触标记,供「事件前中后」检查validation_targets:门的阈值(支撑、净空、切点跳变…)compile:status、assumptions[](每个补齐值的来源)、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」。这条路径在有浏览器的地方都能跑。
- 离线 Blender:
previs 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。