1. 为什么需要协方差?
假设你要用三维图元表示苹果树上的一小段枝条。
只记录一个中心点 μ=(x,y,z)T\boldsymbol\mu=(x,y,z)^Tμ=(x,y,z)T 是不够的,它只告诉你"枝条在这附近",却没说:
- 图元沿哪个方向延伸得长?
- 哪个方向窄?
- 它是正的还是斜的?
协方差矩阵 Σ\SigmaΣ 就是把这三类信息打包进一个 3×3 矩阵:延伸多远、朝哪个方向、各方向是否一样粗。
可以把它想成图元的"形状说明书",而中心 μ\boldsymbol\muμ 只是"地址"。
2. 从球到椭球
三维高斯的表达式是:
G(x)=exp−12(x−μ)TΣ−1(x−μ) G(\mathbf{x})=\exp\left-\\frac12(\\mathbf{x}-\\boldsymbol\\mu)\^T\\Sigma\^{-1}(\\mathbf{x}-\\boldsymbol\\mu)\\right G(x)=exp−21(x−μ)TΣ−1(x−μ)
不用急着啃公式,先看它的"等高面":把所有 GGG 值相同的点连起来,得到一个壳。
- 各向同性 (三个方向尺度相同):壳是球。
- 各向异性 (三个方向尺度不同):壳是椭球,可以细长,也可以扁平。
对果树枝条来说,各向异性很重要:枝条沿延伸方向长,垂直方向窄。如果所有图元都只能是球,就得用大量小球去拼一根细枝;用细长椭球,少量图元就够了。
一点提醒:细长椭球并不自动等于真实枝条,它只是一个有方向、有范围的表示单元。
3. 读懂协方差矩阵的每个数
3.1 对角线:各方向的"方差"
设
Σ=(900010000.25) \Sigma=\begin{pmatrix}9&0&0\\0&1&0\\0&0&0.25\end{pmatrix} Σ= 900010000.25
对角线上的 9、1、0.25 是方差,开方才是标准差:
| 方向 | 方差 | 标准差(延伸程度) |
|---|---|---|
| x | 9 | 3 |
| y | 1 | 1 |
| z | 0.25 | 0.5 |
所以这个椭球沿 x 方向最长,沿 z 方向最薄,像一块沿 x 拉长的扁面包。
3.2 非对角线:椭球"歪"了
如果椭球不与坐标轴对齐,而是斜着放,矩阵里就会出现非零的非对角线元素,例如
Σ=(210120000.5) \Sigma=\begin{pmatrix}2&1&0\\1&2&0\\0&0&0.5\end{pmatrix} Σ= 210120000.5
这里的 1 表示 x 和 y 方向"相关":椭球在 xy 平面里不再沿 x 或 y 轴,而是沿一条斜线。
更严格地说:
- 特征向量给出椭球的主轴方向;
- 特征值给出沿各主轴的方差。
这个例子在 xy 平面的特征值是 3 和 1,主轴沿 45° 方向。
4. 为什么不直接学协方差,而要学"旋转 + 缩放"?
理论上可以直接优化 Σ\SigmaΣ 的元素,但协方差必须是对称正定的(尺度必须为正)。梯度下降随便改几个数,很容易改出非法矩阵,比如出现负的"方差",椭球直接崩溃。
3DGS 的做法是换一种写法:
Σ=R S STRT \boxed{\Sigma = R\,S\,S^T R^T} Σ=RSSTRT
- S=diag(sx,sy,sz)S=\mathrm{diag}(s_x,s_y,s_z)S=diag(sx,sy,sz):三个方向的尺度(实现中存对数再取 exp,保证为正)。
- RRR:旋转矩阵,由四元数转换而来。
这样无论优化器怎么更新尺度和四元数,Σ\SigmaΣ 都合法。
可以用一个比喻:橡皮泥球先沿三个轴拉伸(S),再整体旋转到某个朝向(R)。
数值例子
取 s=(3,1,0.5)s=(3,1,0.5)s=(3,1,0.5),不旋转时:
Σ=diag(9,1,0.25) \Sigma=\mathrm{diag}(9,1,0.25) Σ=diag(9,1,0.25)
绕 z 轴旋转 45° 后:
Σ=(540450000.25) \Sigma=\begin{pmatrix}5&4&0\\4&5&0\\0&0&0.25\end{pmatrix} Σ= 540450000.25
对比一下:
- 旋转前:对角矩阵,没有非对角项。
- 旋转后:出现了非对角项 4。
- 但椭球的三个轴长(3、1、0.5)完全没变,只是方向变了。
所以协方差同时编码了"尺度"和"方向",不是简单地存三个长度。
5. 从三维到二维:投影改变了什么?
相机拍照时,要做两件事:
- 图元中心落在图像的哪个位置?
- 图元的形状在图像上是多大、朝哪斜的椭圆?
5.1 中心的投影
用针孔相机模型:
u=fxXcZc+cx,v=fyYcZc+cy u=f_x\frac{X_c}{Z_c}+c_x,\qquad v=f_y\frac{Y_c}{Z_c}+c_y u=fxZcXc+cx,v=fyZcYc+cy
这只解决了"在哪",没解决"多大、朝哪"。
5.2 为什么不能直接截取协方差的左上角?
很多人第一反应是:取 3×3 协方差的左上 2×2 不就是 2D 协方差了吗?不行,原因有两个:
- 透视是非线性的:同样大的椭球,离相机近的投影大,远的投影小。
- 朝向也影响投影形状:正对着相机和侧着对相机,椭球的"影子"不一样。
可以想象用手电筒照一个椭球,墙上的影子随椭球的距离和朝向变化。
6. 投影协方差公式:三步看懂
经典公式是:
Σ2D≈J W Σ3D WTJT \boxed{\Sigma_{2D}\approx J\,W\,\Sigma_{3D}\,W^T J^T} Σ2D≈JWΣ3DWTJT
拆成三步:
第一步:把协方差转到相机坐标系
Σc=W Σ3D WT \Sigma_c = W\,\Sigma_{3D}\,W^T Σc=WΣ3DWT
WWW 是世界到相机变换的旋转部分(3×3)。平移只改变中心位置,不影响形状,所以不用管。这一步只改变朝向,不改变轴长。
为什么要左右各乘一次?因为协方差在线性变换 AAA 下满足 Cov(Ax)=A Cov(x) AT\mathrm{Cov}(A\mathbf{x})=A\,\mathrm{Cov}(\mathbf{x})\,A^TCov(Ax)=ACov(x)AT。
第二步:求投影函数的雅可比矩阵
透视投影是非线性的,但在高斯中心附近可以近似成线性。雅可比矩阵 JJJ 描述"三维位置动一点点,像素位置怎么动":
J=(fxZc0−fxXcZc20fyZc−fyYcZc2) J=\begin{pmatrix}\dfrac{f_x}{Z_c}&0&-\dfrac{f_xX_c}{Z_c^2}\\2mm0&\dfrac{f_y}{Z_c}&-\dfrac{f_yY_c}{Z_c^2}\end{pmatrix} J= Zcfx00Zcfy−Zc2fxXc−Zc2fyYc
这是个 2×3 矩阵,直观含义是:
- 第一、二列:改变 XcX_cXc 或 YcY_cYc,像素按 f/Zcf/Z_cf/Zc 的比例移动,越远越小。
- 第三列:改变深度 ZcZ_cZc,会同时影响水平和垂直位置。
第三步:把线性变换作用到协方差
Σ2D≈J Σc JT \Sigma_{2D}\approx J\,\Sigma_c\,J^T Σ2D≈JΣcJT
结果是 2×2 矩阵,正好是屏幕上的二维椭圆。
整个流程如下:
世界坐标系 3D 协方差 Σ_3D
│ 旋转到相机坐标系: Σ_c = W Σ_3D Wᵀ
▼
相机坐标系 3D 协方差 Σ_c
│ 局部线性化投影: Σ_2D ≈ J Σ_c Jᵀ
▼
图像平面 2D 协方差 Σ_2D(一个椭圆)
注意:这是一阶局部近似,不是对整个三维高斯做严格的透视积分。当高斯很大、深度变化很剧烈时,近似误差会变大。
7. 二维协方差如何变成图像上的椭圆?
看两个例子:
例 1
Σ2D=(4001) \Sigma_{2D}=\begin{pmatrix}4&0\\0&1\end{pmatrix} Σ2D=(4001)
水平标准差 2,垂直标准差 1,得到一个横向的椭圆。
例 2
Σ2D=(2.51.51.52.5) \Sigma_{2D}=\begin{pmatrix}2.5&1.5\\1.5&2.5\end{pmatrix} Σ2D=(2.51.51.52.5)
它的特征值是 4 和 1,对应标准差 2 和 1,主轴沿 45° 方向,是一个倾斜的椭圆。非对角项 1.5 就是"椭圆歪了"的信号。
对任意像素 p\mathbf pp,这个二维高斯给出的响应为:
g(p)=exp−12(p−μ2D)TΣ2D−1(p−μ2D) g(\mathbf p)=\exp\left-\\tfrac12(\\mathbf p-\\boldsymbol\\mu_{2D})\^T\\Sigma_{2D}\^{-1}(\\mathbf p-\\boldsymbol\\mu_{2D})\\right g(p)=exp−21(p−μ2D)TΣ2D−1(p−μ2D)
再乘上图元的不透明度,就得到该像素处的有效 alpha,之后参与前向 alpha 混合。
8. 回到果树枝条:协方差能做什么,不能做什么
设想你在重建一根倾斜的枝条:
- 三维几何层面 :希望高斯长轴沿枝条方向,短轴沿横截面方向。旋转 RRR 和尺度 SSS 共同控制这种形状。
- 相机视角层面:从侧面看,椭球投影成细长椭圆;沿枝条方向看,则投影成近似圆点。投影协方差公式描述的正是这种变化。
- 结构层面 :即使渲染图像很逼真,也不保证这些椭球沿真实枝条的中心线排列,枝条的连续性、分叉和拓扑需要额外的结构约束。
如果你想进一步改进,可以沿三个层次思考:
| 层次 | 可探索的问题 |
|---|---|
| 协方差参数化 | 如何让高斯长轴更贴合枝条切向? |
| 核函数 | 能否设计更适合细长结构的响应函数,并合理投影到图像? |
| 拓扑约束 | 如何避免枝条断裂、错误连接或交叉处的歧义? |
需要区分的是:改协方差改的是空间形状 ,改核函数(如 GES 一类)改的是响应的数学形式,两者可以结合,但不是同一件事。
9. 小结:四句话记住协方差
- 协方差不只是尺度表,它同时记录范围和方向。
- Σ=RSSTRT\Sigma=RSS^TR^TΣ=RSSTRT:先缩放、再旋转,保证矩阵合法,便于优化。
- 投影靠雅可比矩阵 :Σ2D≈JWΣWTJT\Sigma_{2D}\approx JW\Sigma W^TJ^TΣ2D≈JWΣWTJT,把三维椭球变成二维椭圆。
- 屏幕上的椭圆不是真实表面,它只是高斯在某个视角下的投影表示。
如果你能不看笔记把这四点讲清楚,3DGS 里与协方差相关的部分就基本掌握了。进一步的练习:自己推一遍 JJJ 的三个偏导项,再用一个简单椭球,改变相机距离、焦距或旋转角,看看 Σ2D\Sigma_{2D}Σ2D 是怎么变化的。