前言:为什么 NeRF 会'死'?
NeRF 的本质是在'猜'。它通过发射无数条光线,去问神经网络:'这个点的颜色是什么?密度是多少?'这种基于 Ray Marching(光线步进)的机制,注定了它的计算量是巨大的。
3DGS 的本质是在'画'。它把场景表示为成千上万个 3D 高斯球(椭球体)。渲染时,直接把这些球'泼(Splat)'到屏幕上,利用 GPU 的排序和 Alpha 混合,瞬间成像。
原理对比:
| 特性 | 3DGS | NeRF |
|---|---|---|
| 核心机制 | 光栅化 (Rasterization) | 光线步进 (Ray Marching) |
| 优化方式 | 投影、排序 & Alpha 混合 | 神经网络 (MLP) 积分 |
| 输入数据 | 点云初始化 -> 3D 高斯球集合 | 相机 -> 采样点 (x,y,z) |
| 输出计算 | 屏幕分块 (Tiles) -> 像素 (并行计算) | 颜色 & 密度 -> 像素 |
一、核心数据结构:什么是'高斯球'?
在代码中,一个 3DGS 场景本质上就是一个巨大的 Python List,里面存了数百万个'点'。但这个点不是普通的点,它带有 4 类关键属性。
我们定义一个 GaussianModel 类:
import torch
class GaussianModel:
def __init__(self, num_points):
# 1. 位置 (XYZ) - 决定球在哪
self._xyz = torch.nn.Parameter(torch.zeros(num_points, 3))
# 2. 不透明度 (Opacity) - 决定球有多实
self._opacity = torch.nn.Parameter(torch.zeros(num_points, 1))
# 3. 几何形态 (Covariance) - 决定球是扁的还是圆的
# 为了优化方便,拆分为 缩放 (Scale) 和 旋转 (Rotation)
self._scaling = torch.nn.Parameter(torch.zeros(num_points, 3))
self._rotation = torch.nn.Parameter(torch.zeros(num_points, 4)) # 四元数
# 4. 颜色 (Spherical Harmonics) - 决定不同角度看是什么颜色
._features_dc = torch.nn.Parameter(torch.zeros(num_points, , ))
._features_rest = torch.nn.Parameter(torch.zeros(num_points, , ))


