Links: arXiv:2509.19296 · Project · Code · Model · Dataset

相关笔记:Lyra 2.0 - Explorable Generative 3D Worlds

1. Motivation (研究动机)

  • 现有路线的瓶颈: 传统 3D reconstruction / feed-forward reconstruction 依赖真实多视角图像、精确相机位姿和高质量同步采集;动态场景还需要多机位同步。RealEstate10K / DL3DV 这类数据多样性有限,导致 scene-level 3D 模型 out-of-domain generalization 差。另一方面,Video Diffusion Model 已经有很强的“想象”和相机运动建模能力,但输出仍是 2D video,不提供可实时渲染、可物理交互的显式 3D 表示。
  • 本文要解决的具体问题: 不采集真实 multi-view training data,也不做每个场景的优化式重建,而是把 camera-controlled video diffusion model 隐含的 3D knowledge 蒸馏成一个 feed-forward 3D Gaussian Splatting (3DGS) decoder:输入单张图或单段视频,先由 GEN3C 生成多轨迹 video latents,再直接解码出静态 3DGS 或动态 4D Gaussian scene。
  • 为什么值得做: 一旦可行,video diffusion model 就不只是生成“看起来合理”的视频,而能变成可部署到 simulation / robotics / autonomous driving / industrial AI 的 3D data engine。Lyra 的输出是 explicit 3DGS,可 novel-view real-time rendering、导出 .ply / .usdz 到 Isaac Sim,并能用合成数据训练而非依赖真实多视角采集。

2. Idea (核心思想)

核心洞察是:不要先让 diffusion model 生成多视角 RGB、再用一个外部优化器重建 3D;而是把视频模型的 latent 直接接一个 3DGS decoder,并用视频模型自己的 RGB decoder 作为 teacher 做 self-distillation。 这样 student 只需要学习“从生成模型内部 latent 到显式 3D 表示”的转换,监督信号来自同一个 pre-trained video model 的 RGB branch,不需要真实 3DGS ground truth。

关键创新是一个双分支解码框架:冻结 GEN3C / Cosmos VAE / RGB decoder,训练新的 3DGS decoder;同一个 denoised video latent 一边被 RGB decoder 解成 teacher video,另一边被 3DGS decoder 解成 Gaussians,再通过 differentiable rendering 对齐 teacher RGB / depth。为扩展视角覆盖,训练时每张图采样 条相机轨迹、每条 帧;动态版本再加入 source/target time embeddings 和 motion-reversed supervision。

CAT3D 的差异:CAT3D 生成多视角图后仍需要优化式 3D reconstruction;与 Bolt3D 的差异:Bolt3D 基于 multi-view image diffusion 和 pointmap / geometry head;与 Wonderland / BTimer 的差异:Lyra 直接在 video latent space 融合多轨迹长序列,并输出 feed-forward 3DGS / dynamic 3DGS,不在 pixel space 处理 726 张高分辨率输入帧。

3. Method (方法)

3.1 Overall framework:视频 teacher 到 3DGS student

Figure 1 解读:图 1 展示 Lyra 的两个目标任务。上半部分是 single image → static 3DGS:输入一张图,模型一次前向生成显式 3D Gaussian scene,并可从不同视角渲染 RGB / depth。下半部分是 single video → dynamic 3DGS:输入单目视频后,生成的 4D 表示同时支持时间维和视角维控制。

Figure 2 解读:图 2 对比了传统 multi-view reconstruction 训练与 Lyra self-distillation。左侧方法需要真实 multi-view datasets,并用真实图像监督 3D reconstruction blocks;右侧 Lyra 冻结 camera-controlled video diffusion model,把 RGB decoder 输出当作 teacher,训练 3DGS decoder 的 rendering 去匹配 teacher video,因此监督来自 video model 自身的生成结果。

Figure 4 解读:图 4 是方法主图。左侧训练流程:输入图像和多条 camera trajectories,经 GEN3C / Video Diffusion Transformer 产生 denoised video latents;同一 latent 被 RGB decoder 解成 teacher images,也被 3DGS decoder 解成 Gaussians;student rendering 与 teacher images 计算 loss。右侧放大 3DGS decoder:video latents、Plücker embeddings、动态版本的 source/target time embeddings 分别 patchify 后相加,经 multi-view reconstruction blocks 和 transposed 3D conv 输出 3D Gaussian attributes。

形式化地,GEN3C 的 RGB video 经过 VAE encoder 得到 latent:

其中论文使用 。对输入图像 和第 条相机轨迹 ,teacher video model 生成 latent:

Lyra 的 student decoder 融合多条轨迹 latent 和相机编码:

再通过 renderer 得到 student views:

方法直觉:Video diffusion model 已经从海量 2D 视频中学到了相机运动、遮挡补全和场景布局的隐含 3D 规律;但 RGB decoder 只能把 latent 投影回 2D。Lyra 的关键是把 RGB decoder 旁边接一个 3DGS decoder,让它在完全相同 latent 上学习一个“显式 3D 投影”。由于 teacher 和 student 共享 latent,student 不必从有限真实多视角数据里学习全部世界多样性,而是继承 video model 的生成覆盖;由于输出是 3DGS,它又比纯视频更适合仿真和实时交互。

3.2 Camera-controlled video teacher:GEN3C 的 3D cache 与 structured guidance

GEN3C 为 Lyra 提供 camera-controlled、3D-consistent 的 video latents。其 spatiotemporal 3D cache 记作 ,其中 是时间、 是输入视角;每个 由 RGB + depth 反投影得到 colored point cloud。给定目标相机 ,渲染函数输出 structured guidance:

其中 是 forward-rendered RGB guidance, 是 disocclusion mask,提示 diffusion model 哪些区域需要补全。Lyra 不训练这个 teacher,而是依赖它输出足够一致的多视角 synthetic supervision。

Figure 8 解读:图 8 来自附录,对比普通 forward warping 与更 conservative 的 rendering function。左侧 forward warping 会把背景错误填到本应 disoccluded 的区域;右侧把不可靠区域 mask 掉,让 diffusion model 正确补全。这个细节解释了 teacher video 的 camera-control 质量为何会直接影响 Lyra 的 3DGS student。

3.3 3DGS decoder:在 latent space 做 multi-view reconstruction

Figure 3 解读:图 3 展示训练时对每张输入图采样的 6 条 camera trajectories,用来扩大单个输入图的视角覆盖。论文主配置为 ,因此每张图会产生 个高分辨率 views;这正是作者选择 latent-space decoder 而非 pixel-space reconstruction 的核心动机。

3DGS decoder 的输入包括多轨迹 video latent 和 camera Plücker encoding 。原始 Plücker embedding 为 ;代码将 ray directions 与 ray moment 两个 3-channel 部分分别通过 Cosmos VAE encoder,再沿 channel concat,得到 latent-space camera tokens。

Decoder 架构:

  • video latents 与 Plücker embeddings 分别用 PatchEmbed3D patchify 到 hidden dimension;动态版本再加 source/target time embeddings;
  • reconstruction blocks 采用 Long-LRM 风格的 hybrid sequence mixer:每 8 层中 1 层 Transformer + 7 层 Mamba-2,重复两次,共 16 层、hidden dim 512;
  • transposed 3D conv 先输出 12 个 raw channels:distance、RGB、scale、rotation、opacity;随后 gaussian_processing() 根据 camera rays 把 distance 转成 3D position,并拼出最终 14 维 Gaussian attributes:position 、opacity 、scale 、rotation quaternion 、RGB
  • inference 时可以按 opacity pruning,论文默认移除最低 80% opacity 的 Gaussians,使 rendering 从 30ms 降到 18ms,约 加速。

代码中 Gaussian attribute processing 的核心为:

其中 分别来自 camera ray origin / direction;opacity 使用 ,scale 使用 capped exponential,rotation 做 normalize,RGB 用

3.4 Loss:RGB teacher rendering + depth + opacity regularization

论文的总损失为:

权重设置为:

MSE / LPIPS 约束 3DGS rendering 和 RGB decoder teacher images;depth loss 用 ViPE 估计的一致 video depth,缓解只用 RGB loss 时出现的 flattened geometry;opacity loss 与 pruning 让表示更紧凑。开源训练配置默认 lambda_lpips=0.5lambda_depth=0.05,并在一些 stage/config 中使用 pruning;代码 compute_loss() 中 opacity 项需要 lambda_opacity>0 才启用。

3.5 Dynamic 4D extension:time-conditioned dynamic 3DGS

动态版本把输入从单图换成 monocular video。Teacher 生成保留同一 motion state 的多视角视频 latent;student decoder 基础上加入 source time 和 target time embeddings:

原始 source time / target time 先归一化到 ,再拼接 2D sinusoidal embedding 变成 3-channel map,并通过 RGB VAE encoder 编成 latent time tokens。训练时随机抽取 target timestep,只监督对应时间的 dynamic Gaussians。

Figure 5 解读:图 5 说明 dynamic decoder 的一个失败模式:如果只用原始 outward trajectory 监督,早期时间步在极端视角处缺少覆盖,容易产生 low-opacity / missing Gaussian artifacts。Lyra 用 motion-reversed video 生成 inward trajectories,使每个时间步都有近/远两侧视角监督。

Figure 9 解读:图 9 展示 zoom-out 和 zoom-in 两类 trajectory 的 original / augmented supervision。Augmented videos 的相机运动被翻转,训练时与原始 6 条轨迹合并成 12 条 supervision views;推理时不需要这些 flipped trajectories。

3.6 与 3D generation 相关路线的结构差异

Figure 13 解读:图 13 总结三条路线。CAT3D 是 multi-view image diffusion + 后处理 optimization;Bolt3D 是 multi-view image/pointmap generation + feed-forward Gaussian head;Lyra 则直接接在 multi-view video diffusion model 的 latent 后面,用 3DGS decoder 输出 Gaussians,避免 pixel-space 726-frame reconstruction 的内存瓶颈。

3.7 Pseudocode:基于官方代码的 PyTorch 风格流程

(a) Teacher synthetic data generation / self-distillation targets

@torch.no_grad()
def generate_teacher_latents(pipeline, prompt, image_path, cache, trajectories, vae_rgb_decoder):
    teacher_batches = []
    for cams in trajectories:  # V=6 static, V=12 for dynamic training with flipped supervision
        rendered_warp_images, rendered_warp_masks = cache.render_cache(cams.w2cs, cams.intrinsics)
        generated = pipeline.generate(
            prompt=prompt,
            image_path=image_path,
            rendered_warp_images=rendered_warp_images,
            rendered_warp_masks=rendered_warp_masks,
            return_latents=True,
        )
        if generated is None:
            continue
        video, final_prompt, latents = generated  # Gen3cPipeline.generate(..., return_latents=True)
        rgb_teacher = vae_rgb_decoder(latents)    # paper teacher branch; official script also saves video outputs
        teacher_batches.append({"latents": latents, "rgb_teacher": rgb_teacher, "cameras": cams})
    return teacher_batches

(b) LatentRecon.forward_gaussians():latent-space 3DGS decoder

class LatentRecon(nn.Module):
    def forward_gaussians(self, video_latents, plucker_latents, rays_o, rays_d, time_latents=None,
                          num_input_multi_views=1):
        x = self.reshape_mv_temp_to_batch(video_latents, num_input_multi_views)
        plucker = self.reshape_mv_temp_to_batch(plucker_latents, num_input_multi_views)
        rays_o = self.reshape_mv_temp_to_batch(rays_o, num_input_multi_views)
        rays_d = self.reshape_mv_temp_to_batch(rays_d, num_input_multi_views)
 
        tokens = self.patch_embed(x)                 # PatchEmbed3D over video latents
        tokens = tokens + self.patch_plucker_embed(plucker)
        if time_latents is not None:
            src_t, tgt_t = self.get_time_embedding(time_latents, V=x.shape[1],
                                                   num_input_multi_views=num_input_multi_views)
            tokens = tokens + src_t + tgt_t
 
        if self.process_multi_views:
            tokens = self.reshape_mv_batch_to_temp(tokens, num_input_multi_views)
        for block in self.enc_blocks:                # hybrid Transformer/Mamba-2 blocks
            tokens = block(tokens)
        tokens = self.enc_norm(tokens)
 
        if self.process_multi_views:
            tokens = self.reshape_mv_temp_to_batch(tokens, num_input_multi_views)
        dense = self.deconv(rearrange(tokens, "b (t h w) c -> b c t h w", h=self.h, w=self.w))
        dense = maybe_subsample_gaussians(dense, rays_o, rays_d)
        gaussians = self.gaussian_processing(dense, rays_o, rays_d)
        return self.gaussian_pruning(gaussians)

(c) gaussian_processing():从 decoder channels 到 3DGS attributes

def gaussian_processing(x, rays_o, rays_d, dnear=0.1, dfar=500.0, scale_cap=0.3):
    distance, rgb, scaling, rotation, opacity = x.split([1, 3, 3, 4, 1], dim=-1)
    w = torch.sigmoid(distance - 1.65)
    depth = dnear * (1.0 - w) + dfar * w
    position = rays_o + rays_d * depth
 
    alpha = torch.sigmoid(opacity - 2.0)
    scale = torch.minimum(torch.exp(scaling - (1.0 - math.log(scale_cap))),
                          torch.tensor([scale_cap], device=x.device, dtype=x.dtype))
    quat = F.normalize(rotation, dim=-1)
    color = 0.5 * torch.tanh(rgb) + 0.5
    return torch.cat([position, alpha, scale, quat, color], dim=-1)  # [B, N, 14]

(d) train_step():student rendering 与 teacher RGB/depth 对齐

def train_step(batch, vae, transformer, optimizer, lr_scheduler, lpips_loss_module, config, accelerator, train_loss=0.0):
    gt_images = batch["images_output"]           # RGB-decoded teacher frames
    gt_depths = batch.get("depths_output")       # ViPE depth supervision when enabled
 
    if "rgb_latents" in batch:
        batch["images_input_embed"] = batch["rgb_latents"].to(torch.bfloat16)
    else:
        batch["images_input_embed"] = encode_multi_view_video(
            vae, batch["images_input_vae"], batch["num_input_multi_views"], config.vae_backbone
        )
 
    batch["plucker_embedding"], batch["rays_os"], batch["rays_ds"] = get_plucker_embedding_and_rays(
        batch["intrinsics_input"], batch["c2ws_input"], config.img_size,
        config.patch_size_out_factor, batch["flip_flag"], get_batch_index=False,
    )
    if config.time_embedding_vae:
        batch = encode_latent_time_vae(batch, lambda x: encode_video(vae, x, config.vae_backbone), config.img_size)
    if config.plucker_embedding_vae:
        batch = encode_plucker_vae(batch, lambda x: encode_multi_view_video(vae, x, batch["num_input_multi_views"], config.vae_backbone))
 
    output = transformer(batch)
    # Mirrors train.py: compute_loss uses the real Accelerator to gather logging loss.
    train_loss, loss = compute_loss(
        accelerator=accelerator, train_loss=train_loss,
        pred_images=output["images_pred"], gt_images=gt_images,
        pred_depths=output["depths_pred"], gt_depths=gt_depths,
        pred_opacity=output["opacity_pred"], config=config,
        lpips_loss_module=lpips_loss_module, lpips_img_size=config.img_size,
    )
    accelerator.backward(loss)
    if accelerator.sync_gradients:
        accelerator.clip_grad_norm_(transformer.parameters(), config.max_grad_norm)
    optimizer.step(); lr_scheduler.step(); optimizer.zero_grad()
    return loss.item()

(e) Dynamic flipped supervision:gen3c_dynamic_sdg.py --flip_supervision

def build_dynamic_supervision_trajectories(base_trajectories, flip_supervision: bool):
    trajectories = []
    trajectories.append({name: {**cfg, "flip_supervision": False}
                         for name, cfg in base_trajectories.items()})
    if flip_supervision:
        n = len(base_trajectories)
        flipped = {}
        for name, cfg in base_trajectories.items():
            flipped[name] = {**cfg, "traj_idx": cfg["traj_idx"] + n, "flip_supervision": True}
        trajectories.append(flipped)
    return trajectories
 
 
def maybe_flip_input_for_supervision(video, depth, mask, w2c, intrinsics, flip_supervision: bool):
    if not flip_supervision:
        return video, depth, mask, w2c, intrinsics
    return (video.flip(dims=[0]), depth.flip(dims=[0]), mask.flip(dims=[0]),
            w2c.flip(dims=[0]), intrinsics.flip(dims=[0]))

3.8 Code-to-paper mapping

Code reference: main @ 52e50798 (2026-04-18) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
官方 Lyra 1.0 入口与复现实验说明Lyra-1/README.mddemo / training / model weights / dataset workflow
训练主循环与 self-distillation student optimizationLyra-1/train.pymain(), inner train_step()
3DGS decoder / latent reconstruction networkLyra-1/src/models/recon/model_latent_recon.pyLatentRecon, forward_gaussians(), forward()
Gaussian attribute decoding、opacity pruningLyra-1/src/models/recon/model_latent_recon.pygaussian_processing(), gaussian_pruning()
RGB / LPIPS / depth / opacity lossLyra-1/src/models/utils/loss.pycompute_loss(), compute_depth_loss()
Plücker/time latent encoding helpersLyra-1/src/models/utils/model.pyencode_plucker_vae(), encode_latent_time_vae(), get_model_blocks()
Camera rays / pixel subsampling / .ply exportLyra-1/src/models/utils/render.pyget_plucker_embedding_and_rays(), subsample_x_and_rays(), save_ply()
3DGS rendering backendLyra-1/src/rendering/gs.py, Lyra-1/src/rendering/gs_deferred.pyGaussianRenderer, GaussianRendererDeferred
Inference and export pipelineLyra-1/sample.pyload_model(), main_single()
Dynamic flipped supervision generationLyra-1/cosmos_predict1/diffusion/inference/gen3c_dynamic_sdg.py--flip_supervision, trajectory duplication and input flipping
Progressive training configsLyra-1/configs/training/*.yaml3dgs_res_704_1280_views_121_multi_6*.yaml, default.yaml

4. Experimental Setup (实验设置)

  • Training data / scale:作者不使用现成真实 multi-view datasets 来训练 3DGS decoder,而构建 Lyra dataset。3D setup 使用 59,031 images;4D setup 使用 7,378 videos。每张图/视频合成 6 条 camera trajectories,得到 354,186 videos for 3D44,268 videos for 4D。文本 prompts 由 LLM 采样,覆盖 indoor/outdoor、humans、animals、realistic / imaginative content;输入图像由 image diffusion model 生成,动态视频由 Cosmos / Wan 生成并用 ViPE 标注 camera poses / depth。
  • Baselines:主表比较 ZeroNVSViewCrafterWonderlandBolt3D;附录额外比较 BTimer (GEN3C)。作者说明很多 baseline 没有源码可在其 out-of-distribution Lyra set 上统一重跑,因此主表主要沿用各论文公开 protocol / reported comparisons。
  • Metrics:使用 PSNR(越高越好,重建像素保真)、SSIM(越高越好,结构相似性)、LPIPS(越低越好,perceptual distance)。主任务是 single image-to-3D novel-view rendering,在 RealEstate10K、DL3DV、Tanks-and-Temples 上评测;附录在 static/dynamic Lyra dataset 上评测。
  • Training config:核心 resolution / sequence setup 为 ;decoder 为 16 layers、hidden dim 512、hybrid Transformer/Mamba-2;latent VAE compression ;optimizer config 在开源默认配置中为 AdamW、LR 、bf16、DeepSpeed、batch size 4 默认,多阶段最终 stage batch size 1。论文未详细说明完整训练 GPU type/count;README 仅说明 Lyra 在 H100 / A100 上测试,inference full offloading 最大观察显存约 43GB。

Progressive training setup(Table 3)

StageSteps
Static 117117410k
Static 24914942.5k
Static 34914922.5k
Static 44914912.5k
Static 512119157.5k
Static 61211—6917k
Dynamic 7121612110k

5. Experimental Results (实验结果)

5.1 Main benchmark:single image-to-3D novel-view rendering

MethodRE10K PSNR↑RE10K SSIM↑RE10K LPIPS↓DL3DV PSNR↑DL3DV SSIM↑DL3DV LPIPS↓T&T PSNR↑T&T SSIM↑T&T LPIPS↓
ZeroNVS13.010.3780.44813.350.3390.46512.940.3250.470
ViewCrafter16.840.5140.34115.530.5250.35214.930.4830.384
Wonderland17.150.5500.29216.640.5740.32515.900.5100.344
Bolt3D21.540.7470.234------
Ours21.790.7520.21920.090.5830.31319.240.5700.336

结论:Lyra 在三个 benchmark 的所有可比 metric 上都优于已列 baseline。提升最大的是 DL3DV / Tanks-and-Temples 上的 PSNR,相比 Wonderland 分别从 16.64→20.09、15.90→19.24,说明 self-distilled video prior 对复杂 scene-level novel-view rendering 有明显帮助。

Figure 6 解读:图 6 展示 image-to-3DGS 生成后的 5 个 novel views。重点不是单帧 photorealism,而是同一显式 3DGS 从多个视角渲染时能保持较一致的场景结构。

Figure 10 解读:图 10 与 BTimer (GEN3C) 做 qualitative comparison。BTimer 是 pixel-space feed-forward 3D baseline,使用同一 GEN3C 生成视频但只能 subsample 少量帧;Lyra 直接吸收多轨迹 latent,因此在极端视角下 artifacts 更少、细节更稳定。

5.2 Lyra dataset 上的 static / dynamic 附加结果

SettingMethodPSNR↑SSIM↑LPIPS↓
Static Lyra datasetBTimer (GEN3C)16.320.5800.427
Static Lyra datasetOurs24.920.8340.183
Dynamic Lyra datasetBTimer (GEN3C)20.290.6870.315
Dynamic Lyra datasetOurs23.070.7790.231

静态 Lyra dataset 上,Ours 相比 BTimer (GEN3C) 提升 +8.60 PSNR / +0.254 SSIM / -0.244 LPIPS;动态 Lyra dataset 上提升 +2.78 PSNR / +0.092 SSIM / -0.084 LPIPS。动态提升较小但仍稳定,说明 time-conditioned 3DGS decoder 可以从 monocular video 扩展到 4D scene generation。

5.3 Ablation:哪些组件最关键

MethodPSNR↑SSIM↑LPIPS↓
Ours24.770.8370.224
real data only19.080.6590.413
self-distill. + real data24.740.8230.236
w/o depth loss24.310.8110.247
w/o opacity pruning24.550.8200.237
w/o LPIPS loss23.740.7660.370
w/o multi-view fusion17.730.6320.446
w/o Mamba-224.580.8180.241
w/o latent 3DGSOOMOOMOOM

关键发现:

  • self-distillation 比真实数据更重要:real data only 只有 19.08 / 0.659 / 0.413;加真实数据到 self-distillation 也没有超过纯 self-distillation,说明 GEN3C teacher 生成的监督已经足够多样且一致。
  • multi-view fusion 是最大结构性贡献:去掉后 PSNR 从 24.77 降到 17.73,LPIPS 从 0.224 升到 0.446;这证明不能把 6 条轨迹分别重建再硬合并,必须让 tokens 在 reconstruction blocks 内互相 attend / mix。
  • latent-space decoder 是可扩展性的前提:pixel-space latent 3DGS ablation 直接 OOM,因为 views 对 pixel-space attention 不可承受;latent compression 是能处理 726 views 的关键。

Figure 7 解读:图 7 展示同一个 extreme novel viewpoint 的 ablations。w/o self-distillation 的模型泛化差,w/o multi-view fusion 的视角一致性明显破坏,w/o LPIPS loss 的细节和高频纹理更差;对应 Table 2 的数值变化。

Figure 11 解读:图 11 聚焦 depth loss。没有 depth supervision 时,RGB 渲染可能仍看起来可接受,但 depth map 变平,几何退化;加入 ViPE depth loss 后,rendered depth 更有层次,解释了 Table 2 中 w/o depth loss 的退化。

5.4 Application:simulation export

Figure 12 解读:图 12 展示 Lyra 生成的 3DGS scene 被导入 Isaac Sim 5.0 的结果。作者流程是:text → generated 3DGS → export .ply → 通过 3DGUT / .usdz 导入 Isaac,说明 Lyra 目标不只是视觉生成,而是服务 embodied AI / simulation 数据引擎。

5.5 Limitations / conclusions

作者明确指出,Lyra 的生成规模与一致性仍受 camera-controlled video diffusion model 能力上限约束;如果 teacher video model 的 long-range consistency 或 geometry 质量不足,student 3DGS 会继承这些问题。未来方向包括把 autoregressive techniques 融入大规模生成,以及在 reconstruction network 中显式建模 motion / tracking 来改善动态视觉质量。伦理上,作者也承认生成式 3D/4D 内容存在误用风险,建议 provenance tracking、dataset documentation 和严谨评测。

总体结论:Lyra 证明了 video diffusion model 的 latent 里包含可蒸馏的 3D structure;通过冻结 teacher、训练 3DGS decoder,可以在不依赖真实多视角数据、不做 per-scene optimization 的情况下得到 static / dynamic explicit 3D scenes,并在多个 benchmark 和 Lyra dataset 上超过现有 single-image-to-3D / video-to-4D baselines。