# 3DGS的表示(1)

【部分摘录】原文 (opens new window)

# 如何表示Gaussian?


# 1D→3D?

1D高斯即正态分布:

Nμ,σ(x)=12πσexp((xμ)22σ2)N_{\mu,\sigma}(x)=\frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)

其图像为一个单钟形对称曲线,均值μ\mu控制对称轴进而控制图形位置,标准差σ\sigma控制密度集中程度。对一段xx区间进行积分可以得到分布中的数据落在这一区间的概率,其中绝大多数落在[μ3σ,μ+3σ]\left[ \mu -3\sigma ,\mu +3\sigma \right](概率:0.9974)。

从其形式可知,高斯分布只有两个参数μ,σ\mu,\sigma,所以一组μ,σ\mu,\sigma可以确定一个1D高斯分布函数,进而对应一条1D线段[μ3σ,μ+3σ]\left[ \mu -3\sigma ,\mu +3\sigma \right],其位置决定于μ\mu、长度决定于σ\sigma,通过改变μ,σ\mu,\sigma可以表达1D数轴上不同位置和长度的线段。

3D高斯的正态分布:

Nμx,σx,μy,σy,μz,σz(x,y,z)=1(2π)3/2σxσyσzexp((xμx)22σx2(yμy)22σy2(zμz)22σz2)N_{\mu_x,\sigma_x,\mu_y,\sigma_y,\mu_z,\sigma_z}(x,y,z) =\frac{1}{(2\pi)^{3/2}\sigma_x\sigma_y\sigma_z} \exp\left(-\frac{(x-\mu_x)^2}{2\sigma_x^2} -\frac{(y-\mu_y)^2}{2\sigma_y^2} -\frac{(z-\mu_z)^2}{2\sigma_z^2}\right)

这个形式其实是这三个变量为互不相关的独立变量,且椭球的坐标系和世界坐标系平行的情况。

但在本文中的3D Gaussian点可以旋转,所以它的对称轴(后文称为 模型坐标系 )不一定和世界坐标系重叠。

这源于协方差Cov

方差表示沿着某个方向的不确定性大小,方差大→这个方向拉得更长。

方差:三个方向独立,不可以旋转,此时Cov=0

协方差:三个方向相关,可以旋转。

3D Gaussian公式:

首先复习联合概率密度函数:

p(x1,,xn)=1(2π)n/2Σ1/2exp[12(Xμ)TΣ1(Xμ)]p(x_1,\ldots,x_n)=\frac{1}{(2\pi)^{n/2}|\Sigma|^{1/2}} \exp\left[-\frac{1}{2}(\vec{X}-\vec{\mu})^T \Sigma^{-1}(\vec{X}-\vec{\mu})\right]

三维的情况,用 x=[x,y,z]T\vec{x}=[x,y,z]^T 表示三维空间中的坐标:

p(x)=1(2π)3/2Σ1/2exp[12(xμ)TΣ1(xμ)]p(\vec{x})=\frac{1}{(2\pi)^{3/2}|\Sigma|^{1/2}} \exp\left[-\frac{1}{2}(\vec{x}-\vec{\mu})^T \Sigma^{-1}(\vec{x}-\vec{\mu})\right]

此时协方差矩阵Σ\Sigma为:

Σ=[σx2Cov(x,y)Cov(x,z)Cov(y,x)σy2Cov(y,z)Cov(z,x)Cov(z,y)σz2]\Sigma= \begin{bmatrix} \sigma_x^2 & \mathrm{Cov}(x,y) & \mathrm{Cov}(x,z) \\ \mathrm{Cov}(y,x) & \sigma_y^2 & \mathrm{Cov}(y,z) \\ \mathrm{Cov}(z,x) & \mathrm{Cov}(z,y) & \sigma_z^2 \end{bmatrix}

其中 μ\vec{\mu} 是椭球中心(控制世界空间位置平移),协方差矩阵 Σ\Sigma 控制椭球在3轴向的伸缩和旋转(模型坐标系),协方差矩阵的特征向量就是椭球对称轴(即,特征向量代表椭球三个主轴方向)

注:在数学上每个高斯分布都覆盖整个空间,当它是椭球是因为它的等高线是椭球。计算的时候显然不能每个像素点上对每个高斯点都采个样,所以实际使用中会把距离中心较远的地方截掉(本文是在概率积分99%99\%的等高线截),截了就看着是一个中心透明度高周围透明度低的椭球。

论文中的定义方式:

G(x)=exp(12xTΣ1x)G(\vec{x})=\exp\left(-\frac{1}{2}\vec{x}^T\Sigma^{-1}\vec{x}\right)

和标准形式对比可以看到:

  • 默认模型坐标中心在坐标系原点,方便旋转放缩,放入世界坐标系时再加上平移

  • 去掉了指数部分前面的归一化系数,所以在空间上的积分不为1,而是在 x=[0,0,0]T\vec{x}=[0,0,0]^T 处值等于1,所以是一个中间不透明(G(x)G(\vec{x}) 值为1),越往四周越透明的椭球。

    • 论文中用一个不透明度值α\alpha控制Gaussian点整体的透明度,可以让Gaussian点中间也透明

# 如何表示Gaussian颜色?


球谐函数SH:一组基函数

像泰勒展开、傅里叶展开中也是一组基函数构成的:

比如泰勒展开以多项式函数系 {1,xx0,(xx0)2,(xx0)3,,yn=(xx0)n,}\left\{1,x-x_0,(x-x_0)^2,(x-x_0)^3,\ldots,y_n=(x-x_0)^n,\ldots\right\} 为基函数,

在对函数f(x)f(x)的泰勒展开中:

f(x)=f(x0)0!+f(x0)1!(xx0)+f(x0)2!(xx0)2++f(n)(x0)n!(xx0)n+=n=0f(n)(x0)n!(xx0)n\begin{aligned} f(x)&=\frac{f(x_0)}{0!}+\frac{f'(x_0)}{1!}(x-x_0)+\frac{f''(x_0)}{2!}(x-x_0)^2+\cdots+\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n+\cdots\\ &=\sum_{n=0}^\infty\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n \end{aligned}

{f(x0)0!,f(x0)1!,f(x0)2!,,f(n)(x0)n!,}\left\{\frac{f(x_0)}{0!},\frac{f'(x_0)}{1!},\frac{f''(x_0)}{2!},\ldots,\frac{f^{(n)}(x_0)}{n!},\ldots\right\} 就是这组基函数的系数。

有了基函数,就可以把任意一个函数,描述成几个基函数的加权和了。

这里用的是二维直角坐标系下的函数y=f(x)y=f(x)举例,而拓展到极坐标系函数r=f(θ)r=f(\theta)也有多种基函数。

再扩展到三维坐标系下,函数z=f(x,y)z=f(x,y)表示一个平面,同样有二维傅里叶级数等二维基函数;而三维极坐标系即球面坐标系函数r=f(θ,ϕ)r=f(\theta,\phi)对应的则通常是一个凹凸不平的球面(半径rr随方向角(θ,ϕ)(\theta,\phi)变化且方向角范围为[π,π][-\pi,\pi]),也同理可以用一系列基函数近似表示,这些基函数称为“球面基函数”。

而球谐函数(Spherical Harmonics)就是最有名的球面基函数。球谐函数有很多很好的性质,比如正交性,旋转不变性,就和傅里叶级数里的基函数一样完美。

这里以原文作者举例的二维SH表示的各基函数,可以形象的看到越复杂的基函数可以表示的二维方向可以更多。

二维球谐函数基函数

三维基函数同理:

三维球谐函数基函数

用于记录空间中某个点从不同方向看过去的不同颜色,这在点云渲染中非常有用,3DGS就是用球谐函数记录空间中的Gaussian点在不同方向的颜色。

实际应用中的球谐函数基函数一般只用到二阶或三阶。 二阶是4个系数,拓展到rgb,每个颜色通道一个系数,就是4 * 3 = 12个系数。 三阶是9个系数,拓展到rgb就是9 * 3 = 27个系数。

为啥不用更高阶的SH?一方面是因为更多的系数会带来更大的存储压力、计算压力,而一般描述变化比较平滑的环境漫反射部分,用3阶SH就足够了;另一方面则是因为SH的物理含义不是特别好理解,高阶SH容易出现各种花式Artifact,美术同学一般都会认为这种表现属于bug。