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 核心挑战

  1. 自动化电影运镜规划:如何从文本描述自动生成符合电影语法的多镜头相机轨迹?
  2. 精确轨迹执行:现有视频生成模型在面对复杂电影轨迹时常产生 out-of-distribution 失败
  3. 跨镜头一致性:多个镜头的相机轨迹需要在统一全局坐标系中对齐

2. Idea (核心思想)

数据驱动的范式转换:对齐的 (Caption, Trajectory, Video) 三元组构成一个天然的联合分布,可以解耦为两个条件概率——(规划)和 (控制)——分别独立优化。

核心创新是 “Plan-then-Control” 框架:

  1. Planner:基于 VLM 的轨迹规划器,利用视觉-语言模型的空间先验,从层次化文本描述自动生成电影级相机轨迹
  2. 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 latent

3.4 数据集构建: ShotVerse-Bench

3.4.1 数据收集

从高制作水准的电影中收集 20,500 个片段,覆盖专业电影标准和摄影原则的广泛分类。

3.4.2 Multi-Shot Camera Calibration Pipeline

四步自动化标定将不同镜头的轨迹对齐到统一全局坐标系:

  1. Dynamic Foreground Removal:使用 SAM 遮掩动态前景,保留静态背景区域用于鲁棒位姿估计
  2. Single-Shot Local Reconstruction:使用 PI3 对每个镜头独立重建静态背景,获得镜头内局部一致的轨迹
  3. Joint Keyframe Global Reconstruction:从不同镜头采样关键帧,联合通过 PI3 重建,获得全局坐标系和全局位姿
  4. 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 backboneQwen3-VL-2B + LoRA ()轨迹 query encoding
Trajectory DecoderOPT-based, 12 layers自回归轨迹 token 生成
Discrete Tokenization bins连续→离散→连续可逆管线
Controller backboneHoloCine DiT + LoRA ()Holistic multi-shot 视频生成
Camera EncoderFully-connected layer
4D RoPE4 subspaces: shot, frame, h, w替代标准 3D RoPE
Flow MatchingWan 2.2 protocol两阶段训练(高噪声 + 低噪声)
Camera CalibrationSAM + 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

MethodDatasetF1-Score ↑CLaTr-CLIP ↑
CCDPre-Trained0.3154.247
E.T.Pre-Trained0.3190.000
Director3DPre-Trained0.1260.000
GenDoPPre-Trained0.39932.408
GenDoPShotVerse-Bench0.26824.132
ShotVerse (Ours)ShotVerse-Bench0.41834.907

ShotVerse 在两个指标上均取得最佳结果,F1-Score 0.418 超越最强 baseline GenDoP (0.399)。在 ShotVerse-Bench 上,GenDoP 表现显著退化(domain gap),而 ShotVerse 展现更强的跨域泛化。

5.2 Track B: Trajectory-to-Video

MethodTrans. Error ↓Rotation Error ↓CAS ↑
MotionCtrl0.09002.560.329
CameraCtrl0.05711.280.343
ReCamMaster0.05891.120.408
ShotVerse (Ours)0.01630.730.500

ShotVerse 在 Translation Error 和 Rotation Error 上均最低,CAS 最高(0.500),显示最强的跨镜头坐标一致性。

5.3 Track C: Text-to-Video (End-to-End)

MethodSem. Consist. (Global) ↑Sem. Consist. (Shot) ↑Aesthetic Quality ↑Shot Trans. Accuracy ↑FVD ↓
HoloCine0.2970.2544.9810.645407.54
MultiShotMaster0.2790.3475.2100.927440.78
Sora20.2975.344572.13
VEO30.2825.441941.91
Kling3.00.2885.167719.44
Seedance2.00.2855.381605.17
ShotVerse (Ours)0.2990.2555.4650.933201.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)

MethodMotion Type ↑Motion Duration ↑Subject Emphasis ↑Cinematic Pacing ↑
HoloCine (VLM)4.5244.2813.9973.218
Seedance2.0 (VLM)4.4624.2794.1263.279
ShotVerse (VLM)4.4474.2044.4263.384
HoloCine (User)2.8552.6152.5852.563
Seedance2.0 (User)3.0873.8203.3653.974
ShotVerse (User)4.1054.0604.2464.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 encoder0.34333.875
w/ VLM decoder (native)0.24815.078
w/o Query Tokens0.25118.796
Ours (full)0.42235.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.06091.270.6454.981
w/ Low&High Noise Enc.0.01890.740.9305.321
w/ 3D RoPE0.05231.040.4295.413
w/ Synthetic Data0.05091.350.7054.833
w/o Camera Calibration0.01650.790.9315.136
ShotVerse (Ours)0.01630.730.9335.465

4D RoPE → 3D RoPE 导致 Shot Transition Accuracy 从 0.933 骤降至 0.429;移除全局标定降低 Aesthetic Quality(5.136 vs 5.465)。

5.7 局限性

  1. Semantic-Geometric Synergy:shot-reverse-shot 场景中文本先验可补偿标定噪声,但长上下文循环视角下仍有微小漂移
  2. Holistic Controllability vs. Scalability:当前仅支持同一场景内的多镜头控制,固有的持续时间限制和刚性剪切点需要扩展到多场景、无限长度生成
  3. Asymmetric Generalization:模型在 atmospheric shots 上表现出色,但在高密度人群动态场景中效果较差

总结:ShotVerse 提出了数据驱动的 “Plan-then-Control” 框架,将电影级多镜头相机控制解耦为 VLM 驱动的轨迹规划和 DiT 驱动的轨迹执行两个阶段。核心贡献包括:(1) 利用 VLM 空间先验自动生成电影运镜轨迹;(2) 4D RoPE 显式建模多镜头层次结构;(3) ShotVerse-Bench 数据集——首个统一全局坐标对齐的电影级多镜头轨迹数据集。在三轨评估中全面超越开源和闭源 baseline。