Tsplat:在终端中运行高斯泼溅
速览
Tsplat 是一个工具,支持在命令行终端环境中执行高斯泼溅(Gaussian Splatting)渲染。这一工具使得开发者能够更便捷地在非图形界面环境下处理3D场景重建与可视化任务,提升了工作流的灵活性。
AI 深度解读
Tsplat:在终端中运行 3D Gaussian Splatting 的技术解析
背景
3D Gaussian Splatting (3DGS) 作为一种新兴的神经辐射场(NeRF)替代方案,凭借其极高的渲染速度和逼真的视觉效果,在计算机图形学领域引起了广泛关注。然而,传统的 3DGS 渲染通常依赖于强大的 GPU 加速和复杂的显示服务器环境,这使得在资源受限的设备、纯 CPU 环境或远程 SSH 会话中进行实时 3D 可视化变得极具挑战性。
近期,开发者 Darshan Makwana 发布了一个名为 Tsplat 的开源项目,旨在解决这一痛点。该项目使用 Rust 语言编写,完全基于 CPU 运行,无需 GPU 或显示服务器支持。它利用 Unicode 半块字符(half-blocks)或终端支持的图形协议,直接在命令行终端(Terminal)中渲染 3D 高斯泼溅场景。这一工具不仅让开发者能够在任何支持终端的环境中查看复杂的 3D 场景,还附带了一份详尽的技术教程,深入解析了 3D Gaussian Splatting 的前向传播(Forward Pass)管线。
核心内容
Tsplat 的核心价值在于其将复杂的 3D 渲染管线简化并移植到了纯 CPU 和终端环境中。以下是对原文中技术细节的完整解读:
1. 工具使用与安装
Tsplat 是一个基于 Rust 构建的工具,用户可以通过 cargo 直接安装或从源码编译。
- 安装方式:
cargo install --git https://github.com/darshanmakwana412/tsplat - 渲染对象:需要 INRIA 格式的
.ply场景文件。例如,可以使用预训练的“花园”场景进行测试。 - 基本命令:
tsplat path/to/scene.ply - 参数调整:
--max-splats 500000:调整默认的高斯点数量上限(默认为 200k)。--no-cap:移除高斯点数量限制。--raw-opacity:解决场景看起来“褪色”或对比度低的问题。
- 渲染回退机制:如果终端不支持任何图形协议,Tsplat 会回退到使用 Unicode 半块字符进行渲染,视觉效果可能类似 Minecraft 风格。
2. 3D Gaussian Splat 的数据结构
在 3DGS 中,场景由数十万个“高斯泼溅”组成。每个高斯泼溅可以被视为空间中一个带有颜色和透明度的定向椭球体(fuzzy colored blob)。
Tsplat 中定义的结构体 Splat 包含以下关键属性:
pos: Vec3:世界空间中的中心位置。scale: Vec3:沿每个局部轴的大小(以对数空间存储)。rot: Quat:方向,以单位四元数表示。color: Vec3:RGB 颜色(已从球谐函数解码)。opacity: f32:透明度,范围在 [0, 1] 之间(以 logits 形式存储)。
关于球谐函数(Spherical Harmonics, SH): 为了紧凑地编码视角相关的颜色外观,3DGS 使用球谐函数系数。SH 系数是定义在单位球面上的颜色函数的频域表示。INRIA 3DGS 格式存储到第 3 阶(Band 3),即每个高斯点包含 48 个系数(RGB 各 16 个)。
- Band 0 解码:最简单的 Band 0 解码公式为
(Vec3::splat(0.5) + SH_C0 * f_dc).clamp(Vec3::ZERO, Vec3::ONE),其中SH_C0是一个常数0.28209479177387814。
3. 前向传播管线(Forward Pass Pipeline)
前向传播的任务是将 3D 高斯点列表和相机参数转换为 2D 图像。Tsplat 详细拆解了这一过程:
步骤 1:构建 3D 协方差矩阵
给定原始的大小(scale)和旋转(rotation),需要构建 3D 协方差矩阵。
- 公式:$C_{3D} = M M^T$,其中 $M = R \cdot S$。
- $R$ 是从四元数转换来的 $3 \times 3$ 旋转矩阵,$S$ 是大小对角矩阵。
- 为何分解? 协方差矩阵必须是半正定的。通过分别存储无约束的尺度和旋转,再推导协方差,可以确保生成的矩阵始终有效,便于梯度下降优化。
步骤 2:投影到视图空间(View Space)
3D 协方差位于世界空间,需转换到视图空间(相机在原点,看向 -z 轴)。
- 位置变换:使用 $4 \times 4$ 视图矩阵乘以位置向量。注意,由于视图空间是右手系且看向 -z,相机前方的点 z 坐标为负。Tsplat 使用 $z_c = -p_{view}.z$ 作为正深度值用于后续排序。
- 协方差变换:使用视图矩阵的 $3 \times 3$ 部分 $W$ 进行基变换:$C_{3D_view} = W C_{3D} W^T$。这仅改变椭球的表达坐标系,不改变其形状。
步骤 3:投影到 2D 图像平面
透视投影是非线性的,3D 高斯投影后不再是精确的 2D 高斯。Tsplat 通过雅可比矩阵(Jacobian)进行局部线性化近似。
- 雅可比矩阵 J:映射 3D 点 $(x, y, z)$ 到像素坐标 $(u, v)$。由于稀疏性,只需计算非零项。
- 2D 协方差计算:$C_{2D} = (J C_{3D_view}) J^T$。
- 数值稳定性技巧(eps2d):在 $C_{2D}$ 的对角线上添加一个小常数(默认 0.3)。这确保了 2D 协方差矩阵是严格正定的(而非半正定),从而保证矩阵可逆,避免数值计算错误。
步骤 4:屏幕位置与逆协方差
- 屏幕坐标:通过透视除法计算 $(s_x, s_y)$。
- 逆协方差:计算 $C_{2D}^{-1}$ 用于后续的高斯函数评估。如果行列式 $\le 0$,则丢弃该高斯点。
步骤 5:后续管线简述
虽然原文主要聚焦于上述数学推导,但提到了完整的前向管线还包括:
- 计算边界框:由于 2D 高斯具有无限支撑集,需计算包围盒以限制渲染区域。
- 深度排序:确保正确的前后遮挡关系。
- 分块装箱(Tile Binning):优化内存访问模式。
- Alpha 混合:最终合成图像。
关键要点
- 纯 CPU 渲染:Tsplat 证明了 3D Gaussian Splatting 可以在没有 GPU 的情况下运行,极大地降低了硬件门槛。
- 终端可视化:通过 Unicode 字符或终端图形协议,实现了无需图形界面的 3D 场景查看,特别适合 SSH 远程调试或服务器端处理。
- 数学严谨性:项目不仅是一个工具,还附带了从协方差矩阵构建、视图空间变换、雅可比线性化投影到数值稳定性处理(eps2d)的完整数学推导。
- 数据结构优化:使用了四元数表示旋转、对数空间存储尺度、logits 存储透明度以及球谐函数编码颜色,这些都是 3DGS 高效训练和渲染的关键技术细节。
- 可配置性:支持调整高斯点数量上限和透明度渲染模式,以适应不同场景的
