ShotVerse: Advancing Cinematic Camera Control for Text-Driven Multi-Shot Video Creation
Authors: Songlin Yang, Zhe Wang, Xuyi Yang, Songchun Zhang, Xianghao Kong, Taiyi Wu, Xiaotong Zhao, Ran Zhang, Alan Zhao, Anyi Rao Affiliations: MMLab@HKUST, Tencent Video AI Center (PCG)
1. Motivation (研究动机)
1.1 问题背景
文本驱动的视频生成模型已实现“导演”式的影片创作,用户可以指定“拍什么”(what to see),但 “怎么拍”(how to shoot)——即电影级的摄影机控制——仍是瓶颈。具体存在三个层面的问题:
1.2 现有方法的不足
| 方法类型 | 代表工作 | 核心问题 |
|---|---|---|
| 隐式文本控制 | Sora2, VEO3, Kling3.0, Seedance2.0 | 文本 prompt 缺乏精度,无法准确执行复杂的电影运镜(如 “orbit”) |
| 显式轨迹控制(单镜头) | CameraCtrl, MotionCtrl, ReCamMaster | 只支持单镜头,无法在多镜头间共享统一坐标系 |
| 轨迹生成方法 | CCD, E.T., Director3D, GenDoP | 依赖 3D 场景预构建或 character proxy,缺乏自动化电影运镜能力 |
| 手动轨迹绘制 | 人工在全局坐标系中设计 | 需要极高的空间推理和电影美学经验,劳动密集 |
1.3 核心挑战
- 自动化电影运镜规划:如何从文本描述自动生成符合电影语法的多镜头相机轨迹?
- 精确轨迹执行:现有视频生成模型在面对复杂电影轨迹时常产生 out-of-distribution 失败
- 跨镜头一致性:多个镜头的相机轨迹需要在统一全局坐标系中对齐
2. Idea (核心思想)
数据驱动的范式转换:对齐的 (Caption, Trajectory, Video) 三元组构成一个天然的联合分布,可以解耦为两个条件概率——(规划)和 (控制)——分别独立优化。
核心创新是 “Plan-then-Control” 框架:
- Planner:基于 VLM 的轨迹规划器,利用视觉-语言模型的空间先验,从层次化文本描述自动生成电影级相机轨迹
- Controller:基于 holistic multi-shot DiT 的轨迹控制器,通过 Camera Adapter 和 4D RoPE 精确执行规划的轨迹
与现有方法的本质区别:不再依赖 3D 场景预构建或浅层文本编码,而是利用 VLM 的语义-几何空间先验实现端到端的 “文本→轨迹→视频” 管线。
3. Method (方法)
3.1 整体框架
Figure 2 解读:ShotVerse 框架分为三个阶段。左侧 Dataset Curation:通过多镜头相机标定将不同镜头的轨迹对齐到统一全局坐标系,配合层次化标注(global caption + per-shot caption)。中间 Planner: Trajectory Plotting:VLM 处理层次化 prompt(global prompt + shot prompts + learnable trajectory query tokens),通过 Context-Aware Encoding 提取相机编码,经 Trajectory Decoder 自回归生成轨迹 token,再由 Pose De-Tokenizer 转换为显式相机位姿。右侧 Controller: Trajectory Injection:Holistic DiT backbone 接收多镜头噪声 latent,Camera Encoder 编码轨迹信号注入 Transformer Block(Layer Norm → Self-Attention → Cross-Attention → FFN),配合 4D Rotary Positional Embedding 建模 (frame, shot, height, width) 四维层次结构。
3.2 Planner: Shot-Aware Cinematic Trajectory Plotting
3.2.1 Trajectory (De-)Tokenization
将 个镜头的相机轨迹序列 参数化,每帧位姿 用 12D 连续向量 表示(translation , rotation )。采用可逆 tokenization:连续参数归一化后离散化为整数 bin( bins),de-tokenizer 通过 bin center + inverse scaling 恢复连续值。
3.2.2 Hierarchical Prompt Construction
构建结构化输入序列,交错排列语义上下文和 learnable query placeholders:
其中 为拼接, 是每个镜头 的 个 learnable trajectory query tokens,作为 VLM 的 “slots” 填充镜头特定的相机规划。
3.2.3 Context-Aware Encoding
利用 VLM backbone 编码完整输入序列 。通过 self-attention 机制,trajectory query tokens 的 hidden states 聚合了全局上下文、前序镜头(因果依赖)和当前镜头的文本描述,提取最终层对应 query tokens 的 hidden states 作为 camera codes 。
3.2.4 Trajectory Decoder
将所有镜头的 camera codes 拼接并插入 learnable <SEP> tokens:
该序列作为 prefix 输入轻量级自回归 Transformer decoder(基于 OPT 架构,12 层)。解码步骤 的输入:
其中 为 learnable codebook, 为已生成的轨迹 token IDs。
3.2.5 Training Objective
联合优化 VLM 参数(via LoRA)和 Decoder:
L2 正则化项防止过拟合并保证表征紧凑性。
# 伪代码:Planner - Trajectory Plotting Pipeline
def planner_forward(global_prompt, shot_prompts, vlm, traj_decoder, pose_detokenizer):
"""
Input: global_prompt (str), shot_prompts (List[str]), K shots
Output: multi-shot camera trajectories List[Tensor[L_k, 12]]
"""
# Step 1: Hierarchical Prompt Construction (Eq. 1)
tokens = vlm.tokenize(global_prompt)
for k in range(K):
tokens = concat(tokens, vlm.tokenize(shot_prompts[k]))
tokens = concat(tokens, learnable_traj_queries[k]) # M query tokens per shot
# Step 2: Context-Aware Encoding via VLM
hidden_states = vlm.encode(tokens) # Qwen3-VL-2B + LoRA
camera_codes = []
for k in range(K):
h_k = extract_query_hidden_states(hidden_states, shot_k_indices) # [M, D_vlm]
camera_codes.append(h_k)
# Step 3: Trajectory Decoding (Eq. 2-3)
h_plan = interleave_with_sep(camera_codes) # [sum(M) + K-1, D_vlm]
h_plan = project_to_decoder_dim(h_plan) # [*, D]
traj_tokens = traj_decoder.autoregressive_generate(
prefix=h_plan,
codebook=learnable_codebook,
max_len=N + 2 # N variable + BOS/EOS
)
# Step 4: Pose De-Tokenization
trajectories = pose_detokenizer(traj_tokens, num_bins=256) # bin centers → SE(3)
return trajectories # List of [L_k, 12] tensors (translation + rotation)3.3 Controller: Trajectory-Conditioned Video Generation
3.3.1 Camera Encoder
对每帧 extrinsic matrix ,展平并通过 learnable Camera Encoder 投影到 video token 维度 :
注入方式采用 直接加法注入,在每个 Transformer Block 的 self-attention 之前:
其中 为 layer normalization 后的特征。
关键设计:Camera Encoder 仅在高噪声阶段 () 参与优化,低噪声阶段仅 LoRA 微调。高噪声注入已建立全局运动框架,低噪声阶段补充细节。
3.3.2 4D Rotary Positional Embedding (4D RoPE)
标准 3D RoPE 使用 (frame, height, width) 三维位置编码。多镜头视频具有层次化时间结构 (video → shot → frame),因此提出 4D RoPE:
Step 1: Dimension Allocation:将 attention head 维度分为四个子空间 ,空间维度 分配更大比例保证视觉保真度,同时为 和 保留足够容量。
Step 2: Frequency Pre-Computation:每个维度独立计算旋转频率基,形成正交的位置基。
Step 3: Dynamic Assembly:前向传播时,将每帧映射到对应的 (shot index , global frame index ),拼接所有子空间的频率分量。同一镜头内所有帧共享 shot embedding,显式强制镜头内一致性。
# 伪代码:4D Rotary Positional Embedding
def compute_4d_rope(frame_indices, shot_indices, h, w, head_dim):
"""
Input: frame_indices [B, T], shot_indices [B, T], spatial dims h, w
Output: 4D RoPE embeddings [B, T, h, w, head_dim]
"""
# Step 1: Dimension Allocation
F_shot = head_dim // 8 # e.g., 8 dims for shot index
F_frame = head_dim // 8 # e.g., 8 dims for frame index
F_h = (head_dim - F_shot - F_frame) // 2 # spatial height
F_w = head_dim - F_shot - F_frame - F_h # spatial width
# Step 2: Frequency Pre-Computation (standard RoPE formula per dim)
freqs_shot = precompute_freqs(F_shot) # [max_shots, F_shot]
freqs_frame = precompute_freqs(F_frame) # [max_frames, F_frame]
freqs_h = precompute_freqs(F_h) # [max_h, F_h]
freqs_w = precompute_freqs(F_w) # [max_w, F_w]
# Step 3: Dynamic Assembly
rope_emb = []
for b in range(B):
for t in range(T):
s = shot_indices[b, t]
f = frame_indices[b, t]
for i in range(h):
for j in range(w):
emb = concat(
freqs_shot[s], # shot-level consistency
freqs_frame[f], # temporal dynamics
freqs_h[i], # spatial height
freqs_w[j] # spatial width
)
rope_emb.append(emb)
return reshape(rope_emb, [B, T, h, w, head_dim])3.3.3 Training Objective (Flow Matching)
基于 HoloCine 的训练协议,使用 Flow Matching 目标:
其中 , 为 clean latent,。
# 伪代码:Controller - Camera-Conditioned Video Generation
def controller_forward(trajectories, text_prompts, dit_model, camera_encoder):
"""
Input: trajectories List[Tensor[L_k, 12]], text_prompts List[str]
Output: multi-shot video latent [B, C, T, H, W]
"""
# Step 1: Encode camera trajectories
cam_embeddings = []
for t in range(total_frames):
E_t = trajectories_to_extrinsic(trajectories, t) # [3, 4]
c_cam = camera_encoder(E_t.flatten()) # [d]
cam_embeddings.append(c_cam)
cam_embeddings = stack(cam_embeddings) # [T, d]
# Step 2: Encode text
c_text = text_encoder(text_prompts)
# Step 3: Flow Matching denoising
v_1 = randn_like(target_shape) # Gaussian noise
for sigma in noise_schedule: # sigma from 1.0 to 0.0
v_sigma = (1 - sigma) * v_0_est + sigma * v_1
# Inject camera signal before self-attention in each DiT block
for block in dit_model.blocks:
F_norm = block.layer_norm(v_sigma)
if sigma >= 0.875:
# High-noise: optimize camera encoder + LoRA
F_attnin = F_norm + cam_embeddings
else:
# Low-noise: LoRA only, camera encoder frozen
F_attnin = F_norm + cam_embeddings.detach()
v_sigma = block.forward_with_4d_rope(F_attnin, c_text)
return v_sigma # denoised multi-shot video latent3.4 数据集构建: ShotVerse-Bench
3.4.1 数据收集
从高制作水准的电影中收集 20,500 个片段,覆盖专业电影标准和摄影原则的广泛分类。
3.4.2 Multi-Shot Camera Calibration Pipeline
四步自动化标定将不同镜头的轨迹对齐到统一全局坐标系:
- Dynamic Foreground Removal:使用 SAM 遮掩动态前景,保留静态背景区域用于鲁棒位姿估计
- Single-Shot Local Reconstruction:使用 PI3 对每个镜头独立重建静态背景,获得镜头内局部一致的轨迹
- Joint Keyframe Global Reconstruction:从不同镜头采样关键帧,联合通过 PI3 重建,获得全局坐标系和全局位姿
- Anchor-Based Trajectory Alignment:为每个镜头选取同时存在于局部和全局重建中的 anchor frame,估计相似变换对齐局部轨迹到全局坐标系
3.4.3 训练与测试划分
- 选取 2,750 个代表性单镜头片段(249 帧序列)
- 组合为 1,100 个多镜头场景(2/3/4 镜头,比例 6:3:1)
- 移除字幕,标准化分辨率
- 训练 1,000 场景,测试 100 场景(无场景重叠)
3.5 代码映射
| 论文概念 | 实现细节 | 说明 |
|---|---|---|
| Planner VLM backbone | Qwen3-VL-2B + LoRA () | 轨迹 query encoding |
| Trajectory Decoder | OPT-based, 12 layers | 自回归轨迹 token 生成 |
| Discrete Tokenization | bins | 连续→离散→连续可逆管线 |
| Controller backbone | HoloCine DiT + LoRA () | Holistic multi-shot 视频生成 |
| Camera Encoder | Fully-connected layer | |
| 4D RoPE | 4 subspaces: shot, frame, h, w | 替代标准 3D RoPE |
| Flow Matching | Wan 2.2 protocol | 两阶段训练(高噪声 + 低噪声) |
| Camera Calibration | SAM + PI3 | 动态去前景 + 联合全局重建 |
注:代码搜索未找到开源实现。以上伪代码基于论文描述。
4. Experimental Setup (实验设置)
4.1 数据集
- ShotVerse-Bench:20.5K 样本,12M 帧,来自 Film/TV/Documentary
- 对比数据集:MVImgNet (22K), RealEstate10K (79K), DL3DV-10K (10K), CCD (25K), E.T. (115K), GenDoP (29K)
- ShotVerse-Bench 是首个提供多镜头统一全局坐标系对齐轨迹的电影级数据集
4.2 Baseline 方法
Track A (Text→Trajectory):CCD, E.T., Director3D, GenDoP Track B (Trajectory→Video):MotionCtrl, CameraCtrl, ReCamMaster Track C (Text→Video):
- 开源:HoloCine, MultiShotMaster
- 闭源:Sora2, VEO3, Kling3.0, Seedance2.0
4.3 评估指标
Track A:F1-Score(离散运动标签对齐), CLaTr-CLIP(语义对齐) Track B:Translation Error, Rotation Error, Coordinate Alignment Score (CAS, 基于 DINOv2 相似度) Track C:
- 语义一致性:ViCLIP(global/shot-level)
- 视觉质量:Aesthetic Quality (LAION), FVD
- 镜头转换:Shot Transition Accuracy
- 电影质量:VLM-based (Gemini 3 Pro) + User Study(Motion Type, Duration, Subject Emphasis, Cinematic Pacing 四维度)
4.4 训练配置
- Planner: Qwen3-VL-2B + LoRA (), OPT decoder (12层), Nucleus sampling ()
- Controller: HoloCine + LoRA (), FC camera encoder
- 两阶段训练:高噪声 () 优化 camera encoder + LoRA;低噪声仅 LoRA
- 硬件:96 x NVIDIA H20 GPU, FSDP, AdamW (lr=)
- 分辨率:
5. Experimental Results (实验结果)
5.1 Track A: Text-to-Trajectory
| Method | Dataset | F1-Score ↑ | CLaTr-CLIP ↑ |
|---|---|---|---|
| CCD | Pre-Trained | 0.315 | 4.247 |
| E.T. | Pre-Trained | 0.319 | 0.000 |
| Director3D | Pre-Trained | 0.126 | 0.000 |
| GenDoP | Pre-Trained | 0.399 | 32.408 |
| GenDoP | ShotVerse-Bench | 0.268 | 24.132 |
| ShotVerse (Ours) | ShotVerse-Bench | 0.418 | 34.907 |
ShotVerse 在两个指标上均取得最佳结果,F1-Score 0.418 超越最强 baseline GenDoP (0.399)。在 ShotVerse-Bench 上,GenDoP 表现显著退化(domain gap),而 ShotVerse 展现更强的跨域泛化。
5.2 Track B: Trajectory-to-Video
| Method | Trans. Error ↓ | Rotation Error ↓ | CAS ↑ |
|---|---|---|---|
| MotionCtrl | 0.0900 | 2.56 | 0.329 |
| CameraCtrl | 0.0571 | 1.28 | 0.343 |
| ReCamMaster | 0.0589 | 1.12 | 0.408 |
| ShotVerse (Ours) | 0.0163 | 0.73 | 0.500 |
ShotVerse 在 Translation Error 和 Rotation Error 上均最低,CAS 最高(0.500),显示最强的跨镜头坐标一致性。
5.3 Track C: Text-to-Video (End-to-End)
| Method | Sem. Consist. (Global) ↑ | Sem. Consist. (Shot) ↑ | Aesthetic Quality ↑ | Shot Trans. Accuracy ↑ | FVD ↓ |
|---|---|---|---|---|---|
| HoloCine | 0.297 | 0.254 | 4.981 | 0.645 | 407.54 |
| MultiShotMaster | 0.279 | 0.347 | 5.210 | 0.927 | 440.78 |
| Sora2 | 0.297 | — | 5.344 | — | 572.13 |
| VEO3 | 0.282 | — | 5.441 | — | 941.91 |
| Kling3.0 | 0.288 | — | 5.167 | — | 719.44 |
| Seedance2.0 | 0.285 | — | 5.381 | — | 605.17 |
| ShotVerse (Ours) | 0.299 | 0.255 | 5.465 | 0.933 | 201.71 |
ShotVerse 取得最低 FVD (201.71) 和最高 Aesthetic Quality (5.465),同时 Shot Transition Accuracy 达到 0.933(得益于 4D RoPE 的 shot 维度建模)。商业模型虽有竞争力的美学分数,但 FVD 显著更高,表明缺乏显式轨迹引导导致时序保真度差。
5.4 Cinematic Quality (VLM + User Study)
| Method | Motion Type ↑ | Motion Duration ↑ | Subject Emphasis ↑ | Cinematic Pacing ↑ |
|---|---|---|---|---|
| HoloCine (VLM) | 4.524 | 4.281 | 3.997 | 3.218 |
| Seedance2.0 (VLM) | 4.462 | 4.279 | 4.126 | 3.279 |
| ShotVerse (VLM) | 4.447 | 4.204 | 4.426 | 3.384 |
| HoloCine (User) | 2.855 | 2.615 | 2.585 | 2.563 |
| Seedance2.0 (User) | 3.087 | 3.820 | 3.365 | 3.974 |
| ShotVerse (User) | 4.105 | 4.060 | 4.246 | 4.055 |
User Study 中 ShotVerse 在全部四个维度上均显著领先,特别是 Subject Emphasis & Saliency (4.246) 和 Cinematic Pacing (4.055)。
5.5 可视化对比

Figure 3 解读:与 SOTA 方法的可视化对比。测试场景为传统中国武术表演的双镜头视频(Shot 1: 从右到左 orbit close-up;Shot 2: 从左到右 orbit medium shot)。CameraCtrl 和 MotionCtrl 无法处理复杂电影轨迹。ReCamMaster 执行轨迹但偏离主体。HoloCine、MultiShotMaster、Sora2、VEO3、Kling3.0、Seedance2.0 均无法执行 “orbit” 运动,画面几乎静止。ShotVerse(最后一行)成功执行了带 orbit 运动的多镜头生成,同时保持了主体一致性和镜头间的视觉连贯性。
5.6 Ablation Study
Figure 4 解读:定性消融实验。(a) 无 Camera Encoder 时模型无法保持主体朝向(如正脸追踪失败);(b) 高噪声注入已建立全局运动框架,加入低噪声注入收益有限;(c) 4D RoPE 比 3D RoPE 在镜头切换边界更稳定;(d) 无全局坐标标定时跨镜头轨迹不对齐,主体追踪不准;(e) 在合成数据上训练导致画面和环境偏向合成风格,真实电影数据提供了合成三元组无法捕获的关键视觉线索。
Planner Ablation (Table 6):
| 配置 | F1-Score ↑ | CLaTr-CLIP ↑ |
|---|---|---|
| w/o VLM encoder | 0.343 | 33.875 |
| w/ VLM decoder (native) | 0.248 | 15.078 |
| w/o Query Tokens | 0.251 | 18.796 |
| Ours (full) | 0.422 | 35.016 |
三个关键发现:(1) VLM encoder 提供的语义-空间先验至关重要;(2) 专用 Trajectory Decoder 优于 VLM 原生 decoder(避免语言建模的结构低效);(3) Query Tokens 作为结构化 “planning slots” 解耦每个镜头的语义和几何信息。
Controller Ablation (Table 7):
| 配置 | Trans. Error ↓ | Rot. Error ↓ | Shot Trans. Acc. ↑ | Aesthetic ↑ |
|---|---|---|---|---|
| w/o Cam. Enc. (HoloCine) | 0.0609 | 1.27 | 0.645 | 4.981 |
| w/ Low&High Noise Enc. | 0.0189 | 0.74 | 0.930 | 5.321 |
| w/ 3D RoPE | 0.0523 | 1.04 | 0.429 | 5.413 |
| w/ Synthetic Data | 0.0509 | 1.35 | 0.705 | 4.833 |
| w/o Camera Calibration | 0.0165 | 0.79 | 0.931 | 5.136 |
| ShotVerse (Ours) | 0.0163 | 0.73 | 0.933 | 5.465 |
4D RoPE → 3D RoPE 导致 Shot Transition Accuracy 从 0.933 骤降至 0.429;移除全局标定降低 Aesthetic Quality(5.136 vs 5.465)。
5.7 局限性
- Semantic-Geometric Synergy:shot-reverse-shot 场景中文本先验可补偿标定噪声,但长上下文循环视角下仍有微小漂移
- Holistic Controllability vs. Scalability:当前仅支持同一场景内的多镜头控制,固有的持续时间限制和刚性剪切点需要扩展到多场景、无限长度生成
- Asymmetric Generalization:模型在 atmospheric shots 上表现出色,但在高密度人群动态场景中效果较差
总结:ShotVerse 提出了数据驱动的 “Plan-then-Control” 框架,将电影级多镜头相机控制解耦为 VLM 驱动的轨迹规划和 DiT 驱动的轨迹执行两个阶段。核心贡献包括:(1) 利用 VLM 空间先验自动生成电影运镜轨迹;(2) 4D RoPE 显式建模多镜头层次结构;(3) ShotVerse-Bench 数据集——首个统一全局坐标对齐的电影级多镜头轨迹数据集。在三轨评估中全面超越开源和闭源 baseline。