协方差矩阵:3DGS 里“椭球的形状说明书“

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. 从三维到二维:投影改变了什么?

相机拍照时,要做两件事:

  1. 图元中心落在图像的哪个位置?
  2. 图元的形状在图像上是多大、朝哪斜的椭圆?

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. 小结:四句话记住协方差

  1. 协方差不只是尺度表,它同时记录范围和方向。
  2. Σ=RSSTRT\Sigma=RSS^TR^TΣ=RSSTRT:先缩放、再旋转,保证矩阵合法,便于优化。
  3. 投影靠雅可比矩阵 :Σ2D≈JWΣWTJT\Sigma_{2D}\approx JW\Sigma W^TJ^TΣ2D≈JWΣWTJT,把三维椭球变成二维椭圆。
  4. 屏幕上的椭圆不是真实表面,它只是高斯在某个视角下的投影表示。

如果你能不看笔记把这四点讲清楚,3DGS 里与协方差相关的部分就基本掌握了。进一步的练习:自己推一遍 JJJ 的三个偏导项,再用一个简单椭球,改变相机距离、焦距或旋转角,看看 Σ2D\Sigma_{2D}Σ2D 是怎么变化的。


相关推荐
Solange__2 小时前
城市更新方案怎么用AI生成3D街区预演?从底图、体块到公众网页展示
人工智能·游戏·3d·ai·自然语言处理·1024程序员节·关卡设计
北里闻箫2 小时前
推荐一款游戏引擎,一剑十八年引擎(YiJian18-Engine) - 跨平台2D/3D ECS 游戏引擎
3d·游戏引擎
总要学点什么18 小时前
第79篇:数据可视化-模拟迁徙效果——把三十条航线画成会飞的弧
3d·信息可视化·数据挖掘·数据分析·gis·webgl·cesium
BSD_HY20 小时前
智能家居中控面板的结构暗战:薄膜开关为什么还没退场
矩阵·智能家居·薄膜开关·源头工厂
limit00751 天前
三维模型悬空与切片偏移的排查顺序
低代码·3d·arcgis·web3·安卓·webgl
LiuPig刘皮哥1 天前
小可爱xiaokeai3D陪玩视觉设计方案
人工智能·3d·虚拟陪伴·虚拟偶像·xiaokeai
Wanda12141 天前
机器人与机电一体化3D数字孪生机器-Day7
人工智能·3d·机器人·数字孪生
3D阅阅三维模型轻量化及浏览平台1 天前
3D阅阅重磅更新:DXF二维图一键转三维,轻量化审图闭环了
3d·钣金加工·二维转三维·dxf转三维·钣金报价
茉莉玫瑰花茶1 天前
线性代数 [ 矩阵与线性变化 ]
线性代数·math·1024程序员节