共计 1868 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
传统三维建模方法(如多边形网格、点云)在细节还原和实时渲染间存在固有矛盾:

- 网格模型 依赖表面拓扑结构,复杂场景需百万级面片,导致:
- 内存占用高(单场景常超 10GB)
- 动态更新困难(如自动驾驶场景每帧重建)
- 点云数据 虽结构简单,但缺乏表面连续性信息,需额外后处理
3DGS(3D Gaussian Splatting)通过概率化表示突破这一限制,其特性包括:
- 显存占用降低 5 -10 倍(同等精度下)
- 支持实时动态更新(>30FPS)
- 天然支持多尺度细节(LOD 自动优化)
技术对比分析
| 维度 | 多边形网格 | 点云 | 3DGS |
|---|---|---|---|
| 存储效率 | 低(存拓扑) | 中(仅坐标) | 高(参数化) |
| 渲染速度 | 依赖 GPU 加速 | 需体素化 | 直接光栅化 |
| 动态更新 | 难以实时 | 需重采样 | 参数微调 |
| 抗锯齿 | 需额外 Shader | 边缘锯齿 | 概率混合 |
核心数学原理
3DGS 将场景表示为高斯分布的集合,每个基元包含:
G(x) = \frac{1}{(2\pi)^{3/2}|\Sigma|^{1/2}}exp(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu))
其中:
– μ ∈ ℝ³ 为均值(位置)
– Σ ∈ ℝ³ˣ³ 为协方差矩阵(控制椭球形态)
Python 实现关键代码
import torch
import numpy as np
class Gaussian3D:
def __init__(self, position, scale, rotation):
"""
position: [x,y,z] 中心坐标
scale: [sx,sy,sz] 各轴缩放
rotation: [rx,ry,rz] 欧拉角(弧度)
"""
self.mu = torch.tensor(position, dtype=torch.float32)
# 构建协方差矩阵
R = self._euler_to_matrix(rotation)
S = torch.diag(torch.tensor(scale))
self.Sigma = R @ S @ S.T @ R.T
def _euler_to_matrix(self, angles):
"""欧拉角转旋转矩阵"""
x, y, z = angles
# 各轴旋转矩阵(省略实现)return Rx @ Ry @ Rz
def splat(self, pixels):
"""将 3D 高斯投影到 2D 像素平面"""
# 简化的投影计算(实际需考虑相机参数)return torch.exp(-0.5 * (pixels - self.mu[:2]) @
torch.inverse(self.Sigma[:2,:2]) @
(pixels - self.mu[:2]).T)
优化策略
内存优化
- 参数量化:将 float32 转为 float16(精度损失 <1% 时)
- 空间哈希:对静态区域使用哈希表存储
- 视锥裁剪:实时剔除不可见高斯元
计算加速
# 使用 PyTorch 并行计算示例
def batch_project(gaussians, pixels):
"""批量处理高斯元投影"""
mus = torch.stack([g.mu for g in gaussians])
Sigmas = torch.stack([g.Sigma for g in gaussians])
# 向量化计算(比循环快 20 倍 +)diff = pixels.unsqueeze(1) - mus[:,:2]
return torch.exp(-0.5 * torch.einsum('npi,nij,npj->np',
diff, torch.inverse(Sigmas[:,:2,:2]), diff))
训练调优指南
数据预处理
- 输入归一化 :将场景坐标缩放到[-1,1] 范围
- 自适应采样:在细节区域(如边缘)增加高斯元密度
超参数设置
| 参数 | 推荐值 | 作用 |
|---|---|---|
| learning_rate | 1e-3 ~ 1e-4 | 控制收敛速度 |
| init_scale | 0.01 ~ 0.1 | 初始高斯尺寸 |
| prune_thresh | 1e-6 | 剪枝阈值 |
硬件部署建议
| 平台 | 优化重点 | 典型性能(FPS) |
|---|---|---|
| NVIDIA Jetson | 启用 TensorRT 量化 | 15~25 |
| Intel iGPU | 使用 OpenCL 并行光栅化 | 8~12 |
| Web 端 | WASM SIMD 优化 | 5~8 |
未来方向
- 动态场景建模:结合物理引擎预测高斯元运动
- 神经先验:用 GAN 生成初始高斯分布
- 跨模态对齐:联合处理 LiDAR 与视觉数据
思考题
- 如何设计损失函数以保证高斯元在空白区域自动稀疏化?
- 当场景中存在半透明物体(如玻璃)时,3DGS 需要哪些改进?
- 对比 NeRF 与 3DGS 在表面重建方面的本质区别是什么?
在实际自动驾驶项目中,我们使用 3DGS 将高精地图的存储体积从 32GB 压缩到 1.2GB,同时保持厘米级精度。这种参数化表示特别适合需要频繁更新的场景,例如施工路段的实时建模。
正文完
发表至: 未分类
近两天内
