THE MATHEMATICS OF DYNAMIC GAUSSIANS
让时间
进入高斯。
4D Gaussian Splatting / Mathematical Field Notes
从一个三维椭球到随时间变化的像素。
把关键数学、推导直觉与当前 renderer 的实现约定,放在同一条线上。
READ THIS FIRST
先约定符号,再推公式。
空间用三维列向量,时间用独立的标量。先理解共同的投影与合成,再选择具体动态表示。
世界坐标中的 Gaussian 中心,3×1
空间协方差,3×3;单位是长度平方
屏幕协方差,2×2;单位是像素平方
归一化时间、时间中心、时间核宽度
像素处 alpha、到达该层前的透射率
旋转/线性变换、投影 Jacobian
- 参数与协方差
- 相机与投影
- 椭圆与合成
- 时间与运动
- 损失与梯度
THE PRIMITIVE
用协方差描述一个椭球。
中心决定位置,协方差决定形状与方向,不透明度决定该基函数对图像的贡献。
这里是未归一化的核,不是概率密度。Splat 的 opacity 单独学习,不能额外乘概率密度归一化系数后仍期待相同亮度。
log-scale 保证理论尺度为正;sigmoid 将基准 opacity 映射到 0–1。实际实现仍需防止溢出与下溢。
rₖ 是旋转矩阵的第 k 列。正尺度时 Σ 正定;轴向量外积求和与矩阵乘法等价,适合直接写进 shader。
这里采用 q=(w,x,y,z)、右手系、主动旋转与列向量,且 ‖q‖=1。内存中的行/列布局和参考实现可能采用转置约定;最终应比较轴向量和 Σ,而非只比较名为 R 的数组。
WORLD → CAMERA → PIXELS
把三维不确定性投影到屏幕。
本节推导采用 OpenCV 风格相机轴:x 向右、y 向下、z 向前。与 wgpu 的视图和裁剪空间衔接时,需要显式处理轴向和投影约定。
下标 cw 明确表示 world→camera。相机中心不是平移项 t;camera→world 位姿需要先求逆。
fx、fy 是像素单位焦距;cx、cy 是主点。此处忽略镜头畸变,标定与缩放后的图像内参必须一致。
由 Y−E[Y]=A(X−μ),再对外积取期望得到。平移消去,因此不影响协方差。
J 在 Gaussian 中心处求值。ε 是像素方差;当前 shader 使用 0.3。透视是非线性的,所以这是一阶近似,不是任意透视变换都精确保留 Gaussian。
h=PV[μ,1]ᵀ,δh=PV[aₖ,0]ᵀ。将导数按 viewport 尺寸换成像素,再对三条投影轴做外积求和。这个形式把视图坐标的符号差异包含在 P、V 中。
fx=fy=100,中心为 (1,2,10),Σc=diag(1,4,9):
非零的交叉项来自离轴投影。即使三维协方差是对角矩阵,投影椭圆也可能发生旋转。
THE SCREEN FOOTPRINT
从协方差到一个像素的权重。
协方差告诉我们形状;逆协方差定义到中心的“加权距离”。
正定要求 a>0、ac−b²>0。接近奇异时,逆矩阵会放大误差;需要与 renderer 一致的滤波和数值下限。
空间核指数含 1/2。当前 fragment shader 另做 alpha≤0.99 和 alpha<1/255 的丢弃;以下训练推导先忽略这些分段操作。
特征向量是主轴方向,√λ 是对应方向的像素标准差。k=3 给出常用的 3σ 覆盖;当前实现对 sigma 额外设了 192px 上限。
仅在 o(t)≥αmin 时有非空范围。固定 3σ quad 与阈值支持集不完全相同;“Gaussian 理论无限支持”与有限 GPU footprint 需要区分。
ORDER MATTERS
为什么透明度必须按顺序合成。
下式按近→远排列。颜色与 alpha 的贡献受前面所有层的透射率影响。
graphics pipeline 使用远→近顺序时,shader 输出 RGB×alpha,再配置 premultiplied blending。重复乘 SrcAlpha 会让颜色额外变暗。
红、蓝两层 alpha 都为 0.5,背景为黑。交换顺序改变结果,所以普通 atomic-add 不能代替有序透明合成。
第二式来自分段恒定密度的射线积分,帮助理解 transmittance。3DGS 通常直接学习 opacity 并评估投影核,不能把它说成对每个三维 Gaussian 都做了精确物理射线积分。
THIS VIEWER · STG-LITE
让位置、旋转和可见性随时间变化。
下面采用本项目 PLY/WGSL 的实际参数化。归一化时间 t 不自动等于物理秒。
D 是有来源的时间尺度。例如 loader 使用 frame/N 时,通常需与 N/fps 对齐,而不是擅自换成最后一帧时间。当前研究模型 PLY 不携带 fps/时长,播放器的 10 秒映射仍需追溯验证。
注意指数没有 1/2。若用标准 Gaussian 的标准差 σt 表示同一核,则 σt=ρ/√2。论文写 exp(−sτ·Δt²),这里 sτ=ρ⁻²;代码对 ρ 还有最小值保护。
m₁ 是相对模型时间的系数;只有空间单位与 D 都明确后,才能解释为米/秒。改变归一化规则时,多项式系数也必须对应变换。
q₀ 与 ω 均为四维系数,且需 u(t)≠0。这里 ω 不是刚体公式中的三维角速度;该模型也不是一般意义上的 SLERP。
归一化会去掉沿 q 自身方向的变化分量;分母接近零时梯度不稳定。不要跳过零范数与有限值检查。
同一条轨迹,不同的时间权重
这是二维示意:标记沿三次轨迹移动,亮度随时间核变化;不是完整的训练或 rasterizer。
时间权重 w(t) = 1.0000
TWO OTHER FORMULATIONS
“加上时间”,还有不同的数学方式。
下面两种表示用于比较;当前 STG-Lite viewer 没有实现这两套 decoder。
形变网络:由规范空间预测动态参数
这是方法族的接口表示。Wu et al. 使用时空特征编码与 deformation decoder;平移、尺度、旋转各 head 的增量域和激活规则必须按实现核对。
原生 4D Gaussian:联合分布 → 固定时刻的 3D 切片
z=[xᵀ,t]ᵀ;均值 μ₄=[μxᵀ,μt]ᵀ。A 为 3×3 空间块,b 为 3×1 时空交叉项,c>0 为时间方差。四维旋转不等于一个三维四元数。
第一式让空间中心随时间线性移动;第二式是条件协方差,不是直接拿 A。对单个固定的联合 Gaussian,条件协方差不随 t 变化。
对二次型配方即可得到。这里均指未归一化核;时间边缘项必须保留,决定该 primitive 在该时刻的权重。条件化后再走三维投影与合成。
设 μ₄=0,条件中心是 (t,0,0),时间权重是 exp(−t²/2)。时空相关性 b 编码了这个简单运动。
APPEARANCE ≠ GEOMETRY
几何决定覆盖,外观决定颜色。
不同 Gaussian 方法存储的颜色信息不同。相同字段名不一定有相同激活方式。
Yℓm 为球谐基,a 为 RGB 系数;v 必须是按实现约定的单位观察方向。不要把这条外观函数理解成可重光照的材质。
这是 STG 完整版特征渲染的概念式;特征组成与 decoder 输入要跟源码核对。当前 Lite 使用直接 RGB,没有在运行时调用这个 MLP。
PIXEL ERROR → PARAMETERS
渲染是前向过程,训练把误差传回来。
先固定点集合、排序与可见性分支,理解局部梯度。完整训练还包含分段裁剪、离散的密度控制与具体实现的梯度路径。
M 为参与 L1 平均的像素通道数;R 为方法特定的正则,可能为零。这是常见目标结构,不是所有 4DGS 共享的一套固定 loss。训练相机、时间采样与 mask 必须记录。
推导:d=p−μ,∂(−½dᵀQd)/∂μ=Qd,再乘指数本身。这里固定协方差,忽略 clamp/cutoff。
利用 d(C⁻¹)=−C⁻¹(dC)C⁻¹。这里固定投影中心且 C 对称;若只存独立的 (a,b,c),交叉项 b 的导数要合并两个对称元素的贡献。
本式固定外观与 opacity,只展开投影均值和协方差两条路径。J 随三维位置变化,C=JΣcJᵀ 也随位置变化;只乘 Jᵀ 会漏掉后者。SH/decoder 若使用位置相关的观察方向,还需补外观路径。转回世界坐标的梯度要乘对应旋转的转置。
Bᵢ 是从第 i 层后面开始、按自身透射率合成的尾部颜色,包含背景。增加前景 alpha 会增加本层贡献,同时遮住后面颜色。此式假定排序固定。
这些是数学函数的局部导数。官方 STG 训练在部分时间路径上使用 detach;“纸面上可导”不等于实现对所有变量都传播该梯度。
选 float64 的小例子,避开深度交换、near plane、cutoff 和 clamp 边界;比较多个 h 的误差趋势。单一 h 恰好接近不能证明整个 backward 正确。
FROM EQUATIONS TO CODE
会解释,也要能检查。
建议先完成六个小练习,再沿同一顺序走读 renderer。
- 投影。从 u=fx·x/z+cx 推出 J 的第一行,说出单位。
- 协方差。从期望定义证明 Cov(AX+b)=AΣAᵀ,解释为什么透视需要近似。
- 混合。手算红蓝两层各 0.5 alpha,解释前后顺序的差别。
- 时间。把归一化轨迹改成秒,检查速度系数与时间核宽度。
- 条件化。完成第 6 节的 Schur 补例子,说清它与 STG 三次轨迹的差异。
- 梯度。固定排序,对 μ、C 或 opacity 做一次 finite difference。
| 阶段 | 当前仓库位置 | 核对什么 |
|---|---|---|
| 参数读入 | src/lib.rs · parse_stg_ply | 字段、log-scale、logit、wxyz |
| 时间求值 | ResearchSplat::sample / vs_main | CPU 与 GPU 的同一运动和时间核 |
| 投影椭圆 | projected_axis / vs_main | 齐次导数、轴外积、像素单位 |
| 像素合成 | fs_main / blend state | 指数、cutoff、预乘、排序 |
| 原生宿主 | src/stg_pass.rs | 矩阵、viewport、时间契约 |
| 教学训练 | scripts/train_toy_stg.py | 前向、loss、backward、导出 |
PRIMARY SOURCES
继续读原始材料。
公式采用统一符号重新整理;涉及具体方法时,以上述论文与本项目实际代码约定为准。
本页使用原生 MathML 排版,公式和字体不依赖外部脚本。较长公式可在框内横向滚动;支持复制 LaTeX 与打印。建议使用现代 Chrome、Edge、Firefox 或 Safari。