
Gaussian Splat3D Gaussian Splatting是近期在三维重建和实时渲染领域热度很高的新技术。把游戏录屏变成可自由旋转视角的独立场景听起来像特效实际操作路径已经比较成熟。这里以 GTA: San Andreas 的游戏画面为数据来源介绍从录屏、抽帧、相机位姿恢复、高斯泼溅训练到视频查看的完整流程。整个过程重点不在于游戏本身而在于如何把一段普通的游戏画面转换成可交互的三维模型这也是标题里 [video] 这类演示画面的常见制作思路。1. 先理解 Gaussian Splatting 在游戏场景重建中的位置1.1 什么是 3D Gaussian Splatting一句通俗话3D Gaussian Splatting 把三维场景表示成许多个带有颜色和透明度的“小椭圆体”渲染时根据观察角度把它们投影到屏幕上并叠加合成从而生成新视角画面。技术定义是它用一组可微分的三维高斯分布表示场景每个高斯包含位置、协方差、颜色球谐系数和不透明度。训练过程通过最小化渲染图像与真实图像之间的差异不断调整这些参数。相比传统网格重建它不需要显式构造拓扑结构因此更容易处理树木、栅栏、烟雾这类复杂物体。在 GTA: San Andreas 这类游戏场景中玩家看到的画面其实是游戏引擎实时生成的。如果我们把一段游戏录屏作为训练数据用相邻帧之间共有的特征点反推相机位置再用高斯泼溅重建出场景就能得到一个脱离游戏引擎限制、可以自由旋转观察的静态场景版本。标题中的 [video] 正是这种效果的常见展示方式录屏、重建、渲染后再输出成视频。1.2 与 NeRF、传统重建的差异NeRF 通过神经网络隐式表示场景渲染慢但质量高。3DGS 显式存储高斯参数渲染速度接近实机要求近年来被大量用于三维重建和实时查看。传统摄影测量需要生成密集网格和纹理贴图流程长而且对反射、透明物体的表现较弱。下表简要对比三者的特点。技术方案场景表示渲染速度内存占用适合场景传统网格重建三角网格 纹理取决于引擎优化高建筑物、地形等规则场景NeRF神经网络权重慢需要逐像素采样依赖模型规模高质量静态场景3D Gaussian Splatting三维高斯集合快可实时与高斯数量相关复杂静态场景、游戏录屏重建1.3 为什么游戏录屏适合作为重建数据游戏录屏并不是通常相机采集的数据但恰好满足三维重建的基本条件有大量重叠视角、有足够纹理特征、相机运动连续可估计。与真实相机相比游戏画面没有镜头畸变和自动曝光漂移只要关闭动态模糊、HUD 和景深训练结果通常会很干净。所以整个实践可以拆成一条明确链路视频帧 - COLMAP 特征提取与相机位姿恢复 - 稀疏点云 - 3D Gaussian Splatting 训练 - 渲染器查看/导出视频。这条链路在开源工具中已经比较成熟修改的地方主要是数据采集方式、COLMAP 参数和训练迭代策略。下面从环境准备开始。2. 环境准备确认硬件、安装依赖并编译 3D Gaussian Splatting2.1 硬件要求训练 Gaussian Splatting 主要压力在 GPU 显存。通常 8GB 显存可以处理小场景16GB 以上会更轻松。CPU 与内存主要用于 COLMAP 特征匹配和点云三角化数据量大时会明显影响耗时。环节最低要求推荐配置场景说明GPUNVIDIA GTX 1060 6GBRTX 3060 12GB 或更高训练和渲染都需要 CUDA内存16GB32GBCOLMAP 对大图集匹配内存占用较高硬盘20GB 可用空间50GB 以上视频、抽帧图片、训练输出驱动支持 CUDA 11.8 或 12.x最新稳定版驱动PyTorch 需要对应 CUDA 运行时如果只有 CPU也可以运行官方推导流程但训练时间会非常长不建议新手尝试。实际项目中先确认nvidia-smi能正常显示 GPU 和驱动版本再安装 PyTorch可以避免版本不匹配导致 CUDA 不可用。2.2 创建 Python 环境并安装依赖常见开源实现基于 Python 3.8 到 3.10。下面的命令创建一个独立虚拟环境避免污染系统 Python。conda create -n gaussian_splat python3.8 -y conda activate gaussian_splat安装 PyTorch 时推荐先到 PyTorch 官网选择与本机 CUDA 版本匹配的命令。以 CUDA 11.8 为例pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118然后安装项目依赖pip install plyfile tqdm tensorboardGaussian Splatting 仓库还依赖 COLMAP 提供的可执行文件。Linux 环境可以通过包管理器尝试安装sudo apt install colmapWindows 上需要下载 COLMAP 发布版并把可执行文件路径记下来后面convert.py会用到。如果包管理器安装的 COLMAP 版本与 3DGS 脚本不兼容训练前会看到colmap命令找不到或参数错误解决办法是手动下载与脚本兼容的 COLMAP 版本。2.3 克隆并编译 3DGS 源码源码头完成后还需要编译 CUDA 扩展。以常见的开源仓库为例git clone https://github.com/graphdeco-inria/gaussian-splatting.git cd gaussian-splatting pip install submodules/diff-gaussian-rasterization pip install submodules/simple-knn如果是在 Windows 上需要先安装 Visual Studio 的 C 编译工具并确保 PyTorch 的 CUDA 环境能够被nvcc找到。编译报错通常不是项目本身问题而是缺少 C 编译器、CUDA Toolkit 或环境变量没有配置。可以先执行python -c import torch; print(torch.__version__, torch.version.cuda) python -c from diff_gaussian_rasterization import GaussianRasterizationSettings; print(ok)如果第二条输出正常说明 CUDA 扩展编译成功。这一步是整条链路里最容易卡住的位置不要直接跳到训练。2.4 验证最小环境闭环为了确认环境可用可以先准备一个几十张图片的小数据集跑通流程。不必用自己的游戏录屏可以用手机连续拍摄一个桌面物体或者从视频中抽 30 帧。只要特征点足够COLMAP 能恢复相机位姿训练脚本就能正常工作。小数据集训练时迭代次数可以降低到 5000 次目的不是追求最终质量而是验证从数据到模型的通路没有断。注意不要只验证程序能启动。要验证torch.cuda.is_available()返回 TrueCOLMAP 能生成database.db训练脚本能保存 checkpoint。任何一步失败都要先解决再继续。3. 数据采集从 GTA: San Andreas 录屏到抽帧3.1 明确重建目标静态场景优先GTA: San Andreas 的世界里有大量动态元素比如行人和车辆。Gaussian Splatting 本质上重建的是静态场景遇到移动物体时会出现多个残影叠加的“幽灵”效果。为了让录屏可用需要选择相对静止的区域或者通过抽帧避开动态主体。建议先选择一个不会经常刷出 NPC 的偏僻街区或者角色静止时缓慢转动视角拍摄。如果必须拍摄移动物体尽量保证它显著小于画面面积后续可以接受轻微的 ghosting。想恢复完整城市是不可能的数据采集阶段就要做取舍。3.2 录制参数与画面质量录制时优先保证画面清晰、运动平稳、曝光一致。可以打开游戏设置关闭动态模糊关闭景深关闭 HUD 或等待 HUD 消失。分辨率用 1080p 或 1440p帧率 30 或 60 都行重点是相邻帧之间的位移不要太大。移动速度让镜头每秒钟前进的距离约等于画面宽度的 1/5 到 1/3。视角变化围绕目标物体缓慢旋转尽量让不同帧之间有 70% 以上重叠。光照避免白天黑夜突然切换同一段录制固定游戏内时间。遮挡避免让角色或摄像机频繁被树木、墙体遮挡。3.3 从视频中抽帧原始录屏通常很大直接送入 COLMAP 不是最优做法。抽帧既能减少冗余也能让图像尺寸可控。使用 ffmpeg 抽帧是最常用的方式mkdir -p data/gta_san_andreas/images ffmpeg -i game_recording.mp4 -start_number 0 -vf fps5 -qscale:v 2 data/gta_san_andreas/images/%05d.jpg这个命令对 30fps 的视频每秒钟保留 5 帧。实际方向帧数太多会导致 COLMAP 匹配时间过长太少会导致视角不连续。一般 300 到 1000 张图足够一个中等街区场景。可以先用fps5后续查看图像数量再调整。需要说明-qscale:v 2保证 JPEG 压缩质量较高。如果视频本身是 1080p抽出的帧也是 1080p训练显存压力较大。可以在抽帧时缩放ffmpeg -i game_recording.mp4 -vf fps5,scale1280:-1 -qscale:v 2 data/gta_san_andreas/images/%05d.jpg1280 宽度的图像能降低 COLMAP 和训练的计算量同时保留足够纹理细节。3.4 目录结构与命名规范为了让后续脚本自动识别建议目录结构保持以下形式data/ └── gta_san_andreas/ ├── images/ │ ├── 00001.jpg │ ├── 00002.jpg │ └── ... ├── input/ # 可选如果使用 resize 功能的话 └── sparse/ # 由 COLMAP 或 convert.py 生成convert.py可以接受-s参数指向根目录默认读取根目录下的images。如果你的图像来自多个片段不要直接在同一个目录下乱序丢图建议把每个片段单独编号避免时间线跳跃导致 COLMAP 无法匹配。3.5 数据采集常见坑录制时开启 HUD血条、地图和武器图标会作为特征点参与匹配最终重建出悬浮在空中的文字或图标。快速甩动视角运动模糊会破坏特征点清晰度导致 COLMAP 匹配失败。画面中存在大面积玻璃或反光Gaussian Splatting 可以表达一部分反射但训练数据里视角变化太大时会出现伪影。帧与帧之间没有重叠如果每帧都是新区域COLMAP 无法建立匹配对会直接报“没有足够匹配”。4. 用 COLMAP 恢复相机位姿并生成稀疏点云4.1 COLMAP 的作用Gaussian Splatting 训练时需要知道每一张图像对应的相机内参和外参。COLMAP 是一个开源的 Structure-from-Motion 工具它通过特征提取、特征匹配、几何校验和光束法平差估计相机位置并生成稀疏点云。简单说它回答两个问题每一帧相机在哪里朝哪里看这一步失败的话后面训练脚本会因为缺少相机参数而无法启动。因此本章所有操作应以“生成sparse/0目录且里面有cameras.bin、images.bin、points3D.bin”为验收标准。4.2 官方脚本方式3DGS 仓库提供了convert.py它会在-s指定目录下自动运行 COLMAP 并生成训练所需文件。命令示例cd gaussian-splatting python convert.py -s ../data/gta_san_andreas如果 COLMAP 不在 PATH 中可以指定python convert.py -s ../data/gta_san_andreas --colmap_executable /path/to/colmapconvert.py默认还会对图像做 resize最长边限制在 1600 像素左右并生成images之外的新目录。如果你希望完全保持原始分辨率可以加--skip_resize。但要注意分辨率过高会明显拖慢训练并不一定能换来质量提升。4.3 手动执行 COLMAP 的流程如果convert.py与本地 COLMAP 版本不兼容可以手动执行以下三步mkdir -p data/gta_san_andreas/colmap_output colmap feature_extractor \ --database_path data/gta_san_andreas/colmap_output/database.db \ --image_path data/gta_san_andreas/images colmap exhaustive_matcher \ --database_path data/gta_san_andreas/colmap_output/database.db mkdir -p data/gta_san_andreas/colmap_output/sparse/0 colmap mapper \ --database_path data/gta_san_andreas/colmap_output/database.db \ --image_path data/gta_san_andreas/images \ --output_path data/gta_san_andreas/colmap_output/sparsefeature_extractor负责从每张图提取特征点exhaustive_matcher对所有图像对做匹配适合数据集小于 2000 张的情况mapper通过光束法平差逐步加入图像完成增量式重建。图像数量很大时可以改用sequential_matcher它会按顺序匹配相邻图像速度更快但要求视频抽帧顺序就是空间顺序。手动执行完成后需要把输出整理成训练脚本可以识别的结构。通常把colmap_output/sparse/0复制到data/gta_san_andreas/sparse/0。convert.py还会生成points3D和相机位姿文件训练脚本直接读取这份结果。4.4 COLMAP 结果检查COLMAP 完成后sparse/0下至少有三个文件文件内容cameras.bin相机内参焦距、主点、畸变images.bin每张图片对应的相机外参旋转和平移points3D.bin场景稀疏点云如果稀疏点云点数很少比如不到 1000 个点通常意味着图像质量或重叠度不足。可以先用colmap gui --database_path ... --image_path ...打开 GUI查看特征匹配可视化。看到大量红色误匹配时需要检查是否关闭了 HUD、是否有重复纹理或运动模糊。4.5 排错顺序COLMAP 失败或输出异常时按以下顺序排查图像是否清晰且数量足够。少于 30 张时建议补拍。图像尺寸是否过大。过大会导致内存不足但不是匹配失败主因。视频抽帧顺序是否连续。如果图片名乱序检查是否存在跳帧。特征提取日志中Extracted ... features平均点数是否太少低于 500 说明图像纹理不足。匹配阶段是否输出Averagely matched ...数值。匹配对太少时换低分辨率或增加重叠度。5. 训练 3D Gaussian Splatting 模型5.1 训练脚本与参数理解当 COLMAP 结果就绪后运行训练命令cd gaussian-splatting python train.py \ -s ../data/gta_san_andreas \ -m ../output/gta_scene \ --iterations 30000 \ --sh_degree 3 \ --densify_until_iter 15000 \ --densify_grad_threshold 0.0002-s指定数据集根目录-m指定输出目录。--iterations控制总迭代次数默认 30000小数据集可以减到 10000。--sh_degree是球谐阶数数值越大越能表达随视角变化的颜色但过大会增加参数并可能导致过拟合。--densify_until_iter控制高斯密度化持续到哪一轮太早停止会导致细节不足太晚则可能产生过多高斯点。5.2 参数速查表参数默认值作用调大影响调小影响iterations30000训练总迭代数训练更久可能更精细容易欠拟合sh_degree3球谐阶数表达更多视角相关颜色内存更少远看更平稳densify_until_iter15000密度化截止轮次产生更多高斯点点较少细节丢失densify_grad_threshold0.0002梯度阈值触发分裂/复制减少分裂点产生较少高斯更容易增加高斯点random_backgroundFalse背景随机化减少黑边可能影响透明区域默认黑背景实际项目中不建议一开始就过度调整超参数。先用默认值跑 10000 到 30000 次迭代观察输出质量再针对过拟合或细节缺失做微调。盲目把densify_grad_threshold调得非常小会让高斯点数量爆炸显存直接不够用。5.3 训练过程监控训练时终端会输出类似Iteration: 1000 Loss: 0.023的日志同时 TensorBoard 可以显示渲染图像与真实图像的对比。开启 TensorBoardtensorboard --logdir ../output/gta_scene在浏览器打开默认地址后可以看三块内容损失曲线是否持续下降。渲染图像与真实图像是否逐渐接近。高斯点数量是否合理增长。如果损失下降很慢先检查是否真的在读训练集而不是在空场景上训练。可以在 TensorBoard 里看到训练图像如果图像是纯色或噪声说明 COLMAP 结果或数据路径有问题。5.4 评估指标训练结果可以用三个指标衡量但要注意指标只能反映数值差异不能完全代表视觉效果指标全称含义通常范围PSNR峰值信噪比渲染图与真实图的像素误差20 到 35 越大越好SSIM结构相似性亮度、对比度、结构相似程度0.6 到 0.99 越大越好LPIPS感知相似度基于深度网络的感知距离0 到 1 越小越好如果 PSNR 低但 SSIM 较高往往说明颜色偏色明显如果 PSNR 高但 LPIPS 高可能画面锐度不足。具体项目里以上三项都只是参考最终要以新视角渲染是否连续、边缘是否稳定为准。5.5 训练常见坑Out of Memory图像分辨率太高或高斯点过多。解决方式是降低抽帧分辨率减少迭代次数或使用更大显存。Loss 出现 NaN通常由数据异常或梯度爆炸导致。先检查图像是否包含损坏文件再尝试降低学习率。训练完画面是模糊的特征是高频细节不足检查视频是否被过度压缩或图像分辨率太低。checkpoint 找不到train.py会按迭代数保存 checkpoint如果手动中断后再次启动要确认输出目录不为空否则会重新开始。6. 渲染结果、查看 3D 场景并导出视频6.1 使用点云查看器确认重建质量训练完成后输出目录会包含point_cloud.ply或point_cloud/iteration_30000/point_cloud.ply。可以用常见点云查看工具打开先确认稀疏结构是否正确再进入实时渲染。3DGS 仓库配套的 SIBR Viewer 可以加载训练好的模型。在编译后的源码目录运行 GUI 版或直接执行可执行文件然后打开point_cloud/iteration_30000/point_cloud.ply。如果一切正常可以看到用高斯点渲染的场景并能从任意视角观察。如果无法启动 GUI 或没有图形环境可以用render.py生成固定相机轨迹下的渲染图像python render.py \ -m ../output/gta_scene \ --skip_train \ --skip_test这个命令默认会使用数据集中预留的测试视角渲染并把输出写到output/gta_scene/test/ours_30000/。查看这些图片可以从不同角度判断重建质量。6.2 生成自定义相机轨迹并导出视频render.py本身使用数据集提供的测试轨迹。如果想让相机围绕场景移动需要准备一个包含相机位姿的输入。常见做法是把用户自定义的相机参数写进脚本或者使用第三方工具根据点云生成轨迹。简单场景下也可以不写复杂轨迹脚本直接把训练好的模型放入支持 3DGS 的查看器手动转动视角并录屏。录屏时保持路径平滑就能作为最终演示视频。下面用 ffmpeg 把一组渲染出的图像序列合成视频ffmpeg -framerate 30 -i ../output/gta_scene/test/ours_30000/%05d.png \ -c:v libx264 -pix_fmt yuv420p gaussian_splat_gta.mp4这个命令把%05d.png按 30 帧播放编码为 H.264。-pix_fmt yuv420p是为了确保视频播放器兼容。如果渲染图像是 PNG 透明背景合成前应先确认背景色被正确填充。6.3 把场景放回游戏的两种实际思路标题中的 “in GTA: San Andreas” 可能指把重建出的高斯场景作为一个静态物体放回游戏也可能只是指游戏录屏重建后的视频演示。两种思路难度差异很大。第一种是视频合成思路你用高斯模型渲染出一段自由视角视频再与 GTA 游戏画面进行剪辑或叠画处理。这种思路只涉及常规视频工具实现成本低适合演示和教学。第二种是真正集成进游戏需要开发一个运行时库把 3DGS 的渲染结果接入游戏引擎的渲染管线还要处理遮挡、光照和交互。GTA: San Andreas 本身是老游戏没有官方 3DGS 扩展接口普通玩家很难做到无缝嵌入。实际项目里大多数公开演示是用视频或独立查看器实现的并不是让游戏原生渲染高斯场景。6.4 验证结果的标准动画视频或查看器里符合预期的表现是视角转动时画面没有明显撕裂或跳变。远处建筑边缘稳定近处植被没有严重重影。从侧面看时原本只在正面出现的细节不会消失成空洞。帧率足够在线查看器至少保持 24 帧以上。如果出现大面积黑色空洞通常是数据覆盖不足或高斯点太少。如果画面像奶油一样糊通常是训练不足或图像分辨率太低。7. 常见问题排查清单7.1 按阶段分表的排错指南阶段问题现象可能原因检查方式处理建议数据采集COLMAP 匹配非常少画面重叠不足、HUD、运动模糊查看抽帧图像序列重新录制关闭 HUD减慢移动数据采集图像数量过多内存不足fps 抽帧太高统计 images 数量降低 fps减少图集COLMAP单独图片没有特征点纹理不足或过度压缩打开单张图观察提高录制码率增加细节COLMAPmapper 输出 sparse 为空图像无法形成连贯场景查看 feature_extractor 日志调整运动轨迹增加重叠训练CUDA out of memory分辨率高或高斯点爆炸