Hunyuan-GameCraft: High-dynamic Interactive Game Video Generation with Hybrid History Condition

Paper: arXiv:2506.17201 Code: Tencent-Hunyuan/Hunyuan-GameCraft-1.0 Code reference: main @ 9a35ecf4 (2025-11-28)

1. Motivation (研究动机)

Hunyuan-GameCraft 关注的是“可交互游戏视频生成”:给定一张起始图和文本描述,模型需要按玩家连续输入的移动/视角控制生成后续画面。它不是只追求短视频画质,而是同时要求高动态场景、动作可控、长时一致、推理足够快;这些约束叠加后,现有 video diffusion / controllable video 方法会暴露明显短板。

Figure 1 解读:这张 teaser 展示了论文的目标形态:模型从单张场景图和 prompt 出发,连续接收 与视角方向键,生成多段相互衔接的 gameplay 视频。关键不只是“画面动起来”,而是每一步动作都要改变摄像机位置或朝向,同时保持同一 courtyard 场景的几何与外观记忆。

当前方法的问题主要有三类:第一,许多 camera-controlled video 方法(如 CameraCtrl、MotionCtrl、WanX-Cam)可以做单段相机运动,但缺少游戏交互里的多步动作耦合与长时历史记忆;第二,已有 game world model 往往局限于特定游戏或低维离散动作,难以泛化到 100+ AAA 游戏风格;第三,扩展到长视频时,training-free 自回归容易场景崩塌,强 history conditioning 又会牺牲动作响应。

论文用表格直接对比了 Hunyuan-GameCraft 与 GameNGen、GameGenX、Oasis、Matrix、Genie 2、GameFactory、Matrix-Game:Hunyuan-GameCraft 的定位是 AAA Games、720p、continuous action space,并且同时具备 scene generalizable、scene dynamic、scene memory。这个组合是动机的核心:如果模型要成为 playable interactive generation 的基础组件,它必须在泛化、动态、记忆三者之间同时成立,而不能只优化其中一项。

值得研究的原因在于,interactive video generation 一旦可控、长时稳定且低延迟,就可以把静态图像或 prompt 扩展成可探索的 3D/4D 场景原型:游戏预演、虚拟摄影、开放世界内容生成、艺术风格世界探索都可以从“离线生成视频”变成“按输入滚动生成世界”。论文最后也承认当前动作空间仍偏探索类移动,尚未覆盖 shooting、throwing、explosion 等 game-specific actions;这说明它更像第一步通用 interactive game video world model,而不是完整游戏引擎替代品。

2. Idea (核心思想)

核心洞察是:游戏里的键盘/鼠标离散输入可以先统一映射到连续相机运动空间,再以 Plücker/camera trajectory 形式注入 video diffusion backbone;长视频不是靠单图反复 extrapolate,而是把“单帧、上一段 clip、多段历史 clip”混合成 hybrid history condition,让模型同时学会动作响应和场景记忆。

Hunyuan-GameCraft 的三项关键创新是:一是将 、方向键、Space 等输入转成共享 camera representation,减少不同游戏控制协议之间的割裂;二是在 HunyuanVideo 的 MMDiT latent token 上加入轻量 camera encoder 输出,实现动作条件与图像条件的 early token addition;三是用 hybrid history-conditioned training + PCM distillation,把长时自回归和交互延迟都纳入同一框架。

它与 Matrix-Game 的根本区别在于,Matrix-Game 更偏 Minecraft/有限 action space 的交互世界模型;Hunyuan-GameCraft 则以 HunyuanVideo 这类大规模 T2V foundation model 为 backbone,用连续 camera space 和 100+ AAA 游戏数据提升跨场景泛化。它与 CameraCtrl/MotionCtrl/WanX-Cam 的区别在于,后者主要做单段 camera-controlled video,而本文显式处理动作序列、历史片段条件和长视频滚动生成。

更具体地说,本文把“可交互”拆成两个同时优化的子问题:第一,当前 action 必须在短时间内改变下一段视频的相机轨迹,所以 action representation 要足够连续、可插值、与三维几何对齐;第二,长视频不能每段都重新从单帧开始,否则场景身份、物体位置和空间结构会随自回归漂移,所以模型必须看到历史 latent。难点是这两者互相拉扯:history 越强,画面越稳但越容易沿着上一段惯性继续;action 越强,响应越快但越容易丢失场景记忆。Hybrid history condition 的思想就是把这个 trade-off 变成训练分布本身,让模型在 single-frame、single-clip、multi-clip 条件之间学习平衡。

因此,这篇论文的新意不只是“把按键接到视频模型上”,而是把 interactive game generation 组织成一个有几何中间变量、有历史 latent 记忆、有推理加速路径的统一系统:continuous camera space 负责可控性,CameraNet token addition 负责把控制低成本注入 MMDiT,hybrid mask/latent conditioning 负责长时一致,PCM 负责把系统推向可交互延迟。

3. Method (方法)

3.1 Overall framework:从图像、prompt、动作到长视频

Hunyuan-GameCraft 建在 HunyuanVideo 上,整体 pipeline 是:输入 reference image 与 prompt;把键盘/鼠标动作转成连续相机轨迹;用轻量 action/camera encoder 把轨迹编码成与 video latent 对齐的特征;把 image/action features 在 patchify 后加到 MMDiT token;如果要生成长视频,就把历史 latent 作为 head condition,与当前 noisy chunk 和 binary mask 一起送入 denoising;最后可用 PCM distilled checkpoint 把标准多步采样压缩到 8 steps。

Figure 4 解读:图中左侧是输入端:reference image、prompt、键盘/鼠标信号。中间先把 action 转成连续 camera space,再通过 action encoder 与 image latent 对齐;右侧的 variable mask indicator 用 表示历史帧、 表示待预测帧。这个设计把 image-to-video 起始生成和 long video extension 放在同一 denoising 形式里,避免为首段生成和后续扩展维护两个模型。

直觉上,本文不是让 Transformer 自己从离散按键中“猜”三维运动,而是把人类控制先投影到 camera trajectory 这个更接近视频几何变化的中间层。这样做的好处是动作条件与画面变化之间有明确结构:前进/后退对应相机平移,左右/上下看对应相机旋转;模型学习的是“给定相机运动后如何渲染下一段视频”,而不是在 token 层直接记忆每个游戏的控制语义。

3.2 Dataset construction:让 foundation video model 学到游戏交互分布

Figure 3 解读:数据管线包含四步:Scene and Action-aware Data Partition、Data Filtering、Interaction Annotation、structured captioning。它把 2–3 小时的游戏录屏切成可训练的短片段,过滤低质量/过暗/异常片段,再重建相机轨迹并生成层级 caption,因此模型拿到的不只是视频帧,还包含动作与文本语义。

真实游戏数据来自 100+ AAA first-person perspective titles,包括 Assassin’s CreedRed Dead RedemptionHogwarts LegacyCyberpunk 2077 等。论文用 PySceneDetect 将 2–3 小时 gameplay recording 切成 6 秒 coherent clips,总规模超过 1M 个 1080p clips;再用 RAFT 的 optical flow gradients 检测 rapid aiming 等动作边界,使片段与动作变化更对齐。

过滤阶段使用 quality assessment 去掉 low-fidelity clips,使用 OpenCV luminance filtering 去掉暗场景,并使用 VLM 做 gradient detection 以从多个视角过滤异常样本。交互标注阶段用 Monst3R 重建 6-DoF camera trajectories,给每个 clip 标注 frame-by-frame position/orientation;captioning 阶段用 game-specific VLM 生成两级描述:约 30 字的短摘要和 100+ 字的详细描述,训练时随机采样。

论文还构建了约 3,000 条高质量 synthetic motion sequences,从 curated 3D assets 渲染不同起点、速度、平移、旋转及组合轨迹。合成数据主要补充精确几何与相机控制先验;真实游戏数据提供动态物体、复杂光照和画面真实感。为了缓解 forward-motion bias,作者使用 start-end vectors stratified sampling 平衡 3D 方向分布,并用 temporal inversion augmentation 增加 backward motion 覆盖。

3.3 Continuous action space:把离散输入统一成连续相机运动

论文定义动作空间 为相机参数空间 的一个子集: 其中 是平移/旋转方向的单位向量, 控制平移速度与旋转角速度,上界分别是 。论文特意去掉 roll 维度,因为常见 first-person / exploration 游戏中玩家更常控制 yaw/pitch 与平移,roll 对交互直觉和稳定训练都不是必要自由度。

released code 中,hymm_sp/sample_inference.pygenerate_motion_segment() 支持 forward/backward/left/right/rotate_left/rotate_right/rotate_up/rotate_down,把每个 action 转成一段 positions/rotations;ActionToPoseFromID() 再把 action id 映射成 pose list。随后 GetPoseEmbedsFromPoses() 通过 camera intrinsics、relative pose 和 ray_condition() 生成 Plücker embedding 与 unconditional Plücker embedding。

3.4 Action control injection:轻量 CameraNet + token addition

论文尝试过 Token Addition、Token Concatenation、Channel-wise Concatenation,最终采用 Token Addition。原因是 Plücker embeddings 已经在时间和空间上与 video latent 对齐,直接在 patchified token 初期加 control signal 就能得到强控制能力,同时计算更轻。

released code 的 hymm_sp/modules/cameranet.py 中,CameraNet 先用 nn.PixelUnshuffle(downscale_coef) 把空间分辨率压到 latent 尺度,再通过两层 1x1 Conv2d + GroupNorm + ReLU 编码,并在中间用 compress_time() 做时间下采样;最后 final_projcamera_in 把特征投影到 MMDiT latent token 所需通道。hymm_sp/modules/models.py 中的 HYVideoDiffusionTransformerimg = self.img_in(img) 后,如果有 camera_condition,就调用 self.camera_net(camera_condition) 得到 camera_latents,并执行 img = img + camera_latents

如果去掉这一模块,模型仍可能根据 reference image 生成漂亮视频,但动作输入和具体画面变化会弱耦合:前进可能只变成随机动态,旋转可能无法稳定改变视角;如果改成 concat,控制可能仍可用,但 token 长度/通道会增加,效率和显存更差。

3.5 Hybrid history-conditioned long video extension

Figure 5 解读:图中比较三种长视频扩展方式:(i) training-free single-image inference 反复外推,历史上下文太弱;(ii) streaming generation 使用滚动窗口与非均匀噪声,和本文的 image-to-video backbone / causal VAE 兼容性差;(iii) hybrid history condition 把历史 latent 作为 head condition,逐 chunk denoise 新片段,是本文采用的方案。

每个自回归 step 被定义为 chunk latent denoising:当前要生成的 noisy chunk 接收两个条件,一是 head latent(可以是单帧、上一段 clip、或更长历史 clip),二是 action/camera signals。历史 head latent 在 noise schedule 中保持 clean,不参与加噪;待预测 chunk 则通过 flow matching 逐步去噪。额外的 binary mask 用 标记历史区域、 标记预测区域,告诉 Transformer 哪些 latent 是条件,哪些 latent 要生成。

Figure 6 解读:单图 training-free 外推会出现明显质量崩塌;只用 history clip condition 虽然更稳定,却容易被历史运动惯性“拖住”,导致动作控制退化;hybrid history condition 同时混合单帧、单 clip、多 clip 三种条件,在红框区域表现出更好的动作响应和历史保持。

训练时 hybrid history condition 的比例是:single historical clip ,multiple historical clips ,single frame 。这个比例体现了 trade-off:更多历史信息提升 temporal coherence 和 fidelity,但也会削弱对新 action 的响应;加入 single frame 条件能保留初始 image-to-video 能力,加入多历史条件能提升长时记忆,主比例给 single clip 则在稳定与控制之间折中。

released code 的推理路径与论文设计一致但只覆盖 inference:hymm_sp/sample_batch.py 会把输入图片或输入视频编码成 raw_ref_latents / raw_last_latents,循环 action_list 调用 HunyuanVideoSampler.predict(return_latents=True),再用返回的 ref_latents / last_latents 更新下一段生成的历史条件。pipeline_hunyuan_video_game.py 中会构造 gt_latents_concatmask_concat,当 last_latents 是多帧时,把当前 latents 前半段与 condition 前半段替换为 last_latents,再把 [latents, gt_latents_concat, mask_concat] 在 channel 维 concat 后送入 transformer。

3.6 Accelerated generative interaction:PCM 与 CFG distillation

为降低交互延迟,论文采用 Phased Consistency Model (PCM),把原始 diffusion sampling 和 classifier-free guidance 蒸馏为 8-step consistency model。CFG distillation 的目标写作: 这里 是 prompt, 是 CFG weight,学生模型 被训练成直接输出 guided velocity/score,推理时不再需要额外执行 unconditional/conditional 两次前向来组合 guided output。论文报告最高 speedup,并达到 6.6 FPS;released repo 的 scripts/run_sample_batch_distill.sh 使用 weights/gamecraft_models/mp_rank_00_model_states_distill.pt--infer-steps 8--cfg-scale 1.0--use-fp8,对应蒸馏推理设置。

论文公式与 released code 实现差异:论文描述的是训练期的 hybrid ratios 与 CFG distillation objective,但 GitHub repo 当前只发布 inference / Gradio / distilled checkpoint,没有 optimizer、loss.backward() 或 distillation training loop;因此笔记中的蒸馏 loss 来自论文公式,不能从 code 复现训练。另一个可见差异是论文实验写系统运行在 fps、每个 chunk 为 33-frame clips;released sample_batch.py 保存视频时 save_videos_grid(..., fps=24),同时 inference launch script 使用 --video-size 704 1216 近似 720p,而不是训练论文中的表述形式。

3.7 Pseudocode:按 released code 还原关键组件

3.7.1 Action-to-camera trajectory / Plücker embedding

import torch
 
 
def build_camera_condition(action_id, action_speed, height, width, start_index=0, step=1):
    # hymm_sp/sample_inference.py: ActionToPoseFromID + GetPoseEmbedsFromPoses
    pose_list = ActionToPoseFromID(action_id, value=action_speed)
    plucker, uncond_plucker, poses = GetPoseEmbedsFromPoses(
        pose_list,
        target_height=height,
        target_width=width,
        target_length=33,
        flip=False,
        start_index=start_index,
        step=step,
    )
    cam_latents = plucker.unsqueeze(0).to(torch.bfloat16).cuda()
    uncond_cam_latents = uncond_plucker.unsqueeze(0).to(torch.bfloat16).cuda()
    return cam_latents, uncond_cam_latents, poses

3.7.2 CameraNet token addition

import torch
import torch.nn as nn
from einops import rearrange
 
 
class CameraNet(nn.Module):
    def __init__(self, in_channels, downscale_coef, hidden_size, out_channels):
        super().__init__()
        start_channels = in_channels * (downscale_coef ** 2)
        self.unshuffle = nn.PixelUnshuffle(downscale_coef)
        self.encode_first = nn.Sequential(
            nn.Conv2d(start_channels, start_channels // 2, 1),
            nn.GroupNorm(2, start_channels // 2),
            nn.ReLU(),
        )
        self.encode_second = nn.Sequential(
            nn.Conv2d(start_channels // 2, start_channels // 4, 1),
            nn.GroupNorm(2, start_channels // 4),
            nn.ReLU(),
        )
        self.final_proj = nn.Conv2d(start_channels // 4, hidden_size, 1)
        self.camera_in = nn.Conv3d(hidden_size, out_channels, 1)
        self.scale = nn.Parameter(torch.ones(()))
 
    def forward(self, camera_states):
        b, f, c, h, w = camera_states.shape
        x = rearrange(camera_states, "b f c h w -> (b f) c h w")
        x = self.unshuffle(x)
        x = self.encode_first(x)
        x = compress_time(x, num_frames=f)
        x = self.encode_second(x)
        x = compress_time(x, num_frames=x.shape[0] // b)
        x = self.final_proj(x)
        x = rearrange(x, "(b f) c h w -> b c f h w", b=b)
        return self.camera_in(x) * self.scale
 
 
def inject_camera_tokens(img_tokens, camera_condition, camera_net):
    camera_latents = camera_net(camera_condition)
    return img_tokens + camera_latents

3.7.3 Hybrid history latent/mask construction

import torch
 
 
def build_hybrid_history_input(latents, gt_latents, last_latents):
    # pipeline_hunyuan_video_game.py: gt_latents_concat + mask_concat + last_latents overwrite
    frame_length = latents.shape[2]
    gt_latents = gt_latents.repeat(1, 1, frame_length, 1, 1)
    gt_latents_concat = gt_latents.clone()
 
    if frame_length == 10:
        gt_latents_concat[:, :, 1:, :, :] = 0.0
        mask_concat = torch.ones(gt_latents.shape[0], 1, frame_length, gt_latents.shape[3], gt_latents.shape[4], device=gt_latents.device)
        mask_concat[:, :, 1:, :, :] = 0.0
    else:
        half = frame_length // 2
        gt_latents_concat[:, :, half:, :, :] = 0.0
        mask_ones = torch.ones(gt_latents.shape[0], 1, half, gt_latents.shape[3], gt_latents.shape[4], device=gt_latents.device)
        mask_zeros = torch.zeros_like(mask_ones)
        mask_concat = torch.cat([mask_ones, mask_zeros], dim=2)
 
    if last_latents.shape[2] == 1:
        latents[:, :, 0, :, :] = last_latents[:, :, -1, :, :]
    else:
        half = latents.shape[2] // 2
        latents[:, :, :half, :, :] = last_latents
        gt_latents_concat[:, :, :half, :, :] = last_latents
 
    return torch.cat([latents, gt_latents_concat, mask_concat], dim=1)

3.7.4 Autoregressive multi-action sampling

@torch.no_grad()
def sample_game_video(sampler, prompt, ref_latents, last_latents, actions, speeds):
    all_segments = []
    for idx, (action_id, speed) in enumerate(zip(actions, speeds)):
        out = sampler.predict(
            prompt=prompt,
            is_image=(idx == 0),
            ref_latents=ref_latents,
            last_latents=last_latents,
            action_id=action_id,
            action_speed=speed,
            infer_steps=50,
            guidance_scale=2.0,
            return_latents=True,
            output_type="pt",
        )
        all_segments.append(out["samples"][0])
        ref_latents = out["ref_latents"]
        last_latents = out["last_latents"]
    return torch.cat(all_segments, dim=2)

3.7.5 CFG distillation objective(论文公式;released repo 未发布训练代码)

import torch
import torch.nn.functional as F
 
 
def cfg_distillation_loss(student, teacher, z_t, t, prompt, empty_prompt, cfg_weight):
    cond = teacher(z_t, t, prompt)
    uncond = teacher(z_t, t, empty_prompt)
    guided_target = (1.0 + cfg_weight) * cond - cfg_weight * uncond
    guided_student = student(z_t, t, prompt, cfg_weight=cfg_weight)
    return F.mse_loss(guided_student, guided_target)

3.8 Code-to-paper mapping

Code reference: main @ 9a35ecf4 (2025-11-28) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
Action string/id to camera pose sequencehymm_sp/sample_inference.pygenerate_motion_segment, ActionToPoseFromID
Camera pose to Plücker embeddinghymm_sp/sample_inference.pyGetPoseEmbedsFromPoses, ray_condition, get_relative_pose
Lightweight action/camera encoderhymm_sp/modules/cameranet.pyCameraNet.forward
Token-level camera addition in MMDiThymm_sp/modules/models.pyHYVideoDiffusionTransformer.forward, self.camera_net, img = img + camera_latents
Hybrid latent/mask conditioninghymm_sp/diffusion/pipelines/pipeline_hunyuan_video_game.pygt_latents_concat, mask_concat, last_latents overwrite, transformer call with cam_latents
Autoregressive multi-action extensionhymm_sp/sample_batch.pyreference encoding, action loop, predict(return_latents=True), update ref_latents / last_latents
Inference launch: original modelscripts/run_sample_batch_sp.sh8 GPU torchrun, --infer-steps 50, --cfg-scale 2.0, --video-size 704 1216
Inference launch: distilled modelscripts/run_sample_batch_distill.shdistilled checkpoint, --infer-steps 8, --cfg-scale 1.0, --use-fp8
Gradio deploymentscripts/launch_app_sp.sh, hymm_sp/gradio/*distributed worker, API server, UI

4. Experimental Setup (实验设置)

4.1 Datasets

训练数据由两部分构成。第一部分是真实 gameplay recordings:100+ AAA first-person perspective titles,论文列举了 Assassin’s CreedRed Dead RedemptionHogwarts LegacyCyberpunk 2077 等;通过 scene/action-aware partition 形成超过 1M 个 1080p、约 6 秒的 coherent clips。第二部分是 synthetic rendered data:约 3,000 条高质量 motion sequences,从 curated 3D assets 系统采样起点、平移、旋转、组合轨迹和速度,用于增强精确相机控制与几何先验。

评测集是 150 张 diverse images 和 12 种 action signals,来源于在线仓库,覆盖 gaming scenarios、stylized artwork、AI-generated content。这个设置不是传统固定 benchmark,而是为了测试跨游戏/跨风格场景下的 action controllability、visual quality 和 generalization。

4.2 Baselines

论文比较了两类 baseline。交互游戏模型包括 Matrix-Game(重点用于同类 sequential action / long-term consistency 对比),并在引言表中对比 GameNGen、GameGenX、Oasis、Matrix、Genie 2、GameFactory。camera-controlled video generation baselines 包括 CameraCtrl、MotionCtrl、WanX-Cam,用于单动作相机控制、画质和 RPE 对比。

4.3 Evaluation metrics

  • FVD ↓:Fréchet Video Distance,用于视频真实感/分布距离,越低越好。
  • RPE trans / RPE rot ↓:Relative Pose Error,在对预测轨迹与 ground truth 做 Sim3 Umeyama alignment 后评估平移与旋转控制误差。
  • Image Quality / Aesthetic / Temporal Consistency ↑:沿用 Matrix-Game 风格的视觉质量、美学与时序连续性分数。
  • Dynamic Average ↑:从 VBench 的 Dynamic Degree 改造而来,不再做二分类,而是直接报告 absolute optical flow values,以连续方式衡量动态强度。
  • Motion Smooth / User Study ranking ↑:Motion Smooth 衡量运动平滑性;user study 由 30 名 evaluator 匿名排名,5 表示最好、1 表示最差。

4.4 Training and inference config

论文训练设置:基于 HunyuanVideo,全参数训练,192 张 NVIDIA H20 GPUs,batch size 48,两阶段训练。第一阶段使用全部真实游戏数据和合成数据原始比例,训练 30k iterations,learning rate ;第二阶段引入 Sec. 3 的数据增强/分布平衡,将 learning rate 降到 ,继续 20,000 iterations。hybrid history condition 比例为 single historical clip 、multiple historical clips 、single frame 。系统按论文描述运行在 fps,每个视频 chunk 为 33-frame clips,720p 分辨率。

released repo 当前没有训练 launch/config,因此上述训练数字不能从 config.py 默认值推断,也不能用 repo 复跑训练;它们来自论文实验设置。repo 可复现的是 inference:scripts/run_sample_batch_sp.sh 使用 torchrun --nproc_per_node=8weights/gamecraft_models/mp_rank_00_model_states.pt--video-size 704 1216--cfg-scale 2.0--infer-steps 50scripts/run_sample_batch_distill.sh 使用 distilled checkpoint、--cfg-scale 1.0--infer-steps 8--use-fp8

5. Experimental Results (实验结果)

5.1 Main quantitative results

ModelFVD ↓Image Quality ↑Dynamic Average ↑Aesthetic ↑Temporal Consistency ↑RPE Trans ↓RPE Rot ↓Infer Speed ↑ (FPS)
CameraCtrl1580.90.667.20.640.920.130.251.75
MotionCtrl1902.00.687.80.480.940.170.320.67
WanX-Cam1677.60.7017.80.670.920.160.360.13
Matrix-Game2260.70.7231.70.650.940.180.350.06
Ours1554.20.6967.20.670.950.080.200.25
Ours + PCM1883.30.6743.80.650.930.080.206.6

主表说明两个 trade-off:标准 Hunyuan-GameCraft 在 FVD、Dynamic Average、Temporal Consistency、RPE trans/rot 上最强,尤其 Dynamic Average 从 Matrix-Game 的 31.7 提升到 67.2,说明游戏场景动态显著增强;PCM distilled 版本把 FPS 提升到 6.6,但 FVD 从 1554.2 退到 1883.3、Dynamic Average 从 67.2 降到 43.8,属于用部分视觉/动态质量换交互延迟。

Figure 7 解读:qualitative comparison 分三类:(a) 与 CameraCtrl/MotionCtrl/WanX-Cam 比单动作 camera control;(b) 与 Matrix-Game 比多动作序列和长时一致;(c) 展示 image-to-video generalization。蓝色高亮键表示当前按键,Hunyuan-GameCraft 的画面变化更贴合输入,同时保留同一场景的空间连续性。

5.2 User study

MethodVideo Quality ↑Temporal Consistency ↑Motion Smooth ↑Action Accuracy ↑Dynamic ↑
CameraCtrl2.202.402.162.872.57
MotionCtrl3.233.203.213.093.22
WanX-Cam2.422.532.442.812.46
Matrix-Game2.722.432.751.632.21
Ours4.424.444.534.614.54

30 名 evaluator 的匿名排名中,Hunyuan-GameCraft 在五个维度全部第一,且 Action Accuracy 达到 4.61;Matrix-Game 的 Action Accuracy 只有 1.63,说明它在多动作/连续动作场景下更容易失去输入对齐。

5.3 Ablation study

VariantFVD ↓DA ↑Aesthetic ↑RPE trans ↓RPE rot ↓
(a) Only Synthetic Data2550.734.60.560.070.17
(b) Only Live Data1937.777.20.600.160.27
(c) Token Concat.2236.459.70.540.130.29
(d) Channel-wise Concat.1725.563.20.490.110.25
(e) Image Condition1655.347.60.580.070.22
(f) Clip Condition1743.555.30.570.160.30
(g) Ours (Render:Live=1:5)1554.267.20.670.080.20

数据分布 ablation 说明 synthetic-only 的控制误差最低(RPE trans 0.07、rot 0.17),但动态和真实感差(FVD 2550.7、DA 34.6);live-only 动态最高(DA 77.2),但控制误差大(0.16/0.27)。最终 Render:Live=1:5 不是让某一指标极端最好,而是在 FVD、Aesthetic、RPE 和 DA 之间取得更实用平衡。

控制注入 ablation 中,Token Concat. 与 Channel-wise Concat. 都不如最终方案,说明“把已对齐的 camera feature 直接加到 token 初期”既简单又有效。历史条件 ablation 中,Image Condition 的 RPE trans 最低但 DA 低,Clip Condition 提升历史一致性却控制退化;最终 hybrid condition 结合两者优势,和 Figure 6 的定性观察一致。

5.4 Long video extension and applications

Figure 8 解读:长视频结果展示了 minute-level clips 的持续生成。每一段都以先前 latent 作为条件继续 denoise,因此画面不会像单图反复外推那样快速偏离初始场景;同时 action sequence 仍能改变移动方向或视角。

Figure 9 解读:third-person game video generation 说明方法不只适用于 first-person 相机漫游,也能扩展到更复杂的车辆/第三人称场景。这里的挑战是动作不仅改变视角,还会影响主体位置和背景相对运动。

Figure 10 解读:real-world image generalization 显示模型虽然用游戏数据强化交互,但仍继承 HunyuanVideo 的 foundation model 泛化能力。给定真实世界图像和 camera movement,模型可以生成高动态、相机控制较准确的视频,而不是只能处理训练中的游戏截图。

Figure 2 解读:补充多动作结果展示了多组 action sequence 下的生成稳定性。由于该图是高纵向 composite,使用较小宽度可以保留完整序列结构;它主要补足 Figure 1 的示例,说明模型在不同场景中都能按连续动作改变视角与位置。

5.5 Limitations and conclusion

作者明确指出当前 action space 主要面向 open-world exploration,缺少 shooting、throwing、explosions 等更丰富的 game-specific actions。换言之,Hunyuan-GameCraft 的强项是 camera/movement-conditioned video world exploration,而不是完整模拟所有游戏机制。未来方向是扩展数据集与动作空间,让模型从“可移动观看世界”走向“可产生更物理、更 playable 的游戏交互”。

整体结论是:Hunyuan-GameCraft 通过连续 action representation、hybrid history conditioning、PCM acceleration,把 interactive game video generation 的四个关键指标——动作可控、动态真实、长时记忆、低延迟——放进同一系统。实验数字显示标准模型质量与控制最强,distilled 模型延迟最优;二者合起来给出了一个可实际交互部署的 game video world model 雏形。