3DGS学习(四)—— 快速高斯光栅化

文章介绍了如何通过快速高斯光栅化技术,利用视锥体和相机位姿确定3D数据在2D空间的投影,通过协方差矩阵变换实现3D到2D的渲染过程。着重讨论了像素级别操作、alpha融合和并行化策略以提升效率,如使用瓦片并行处理高斯分布的渲染计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速高斯光栅化

参考文章:https://zhuanlan.zhihu.com/p/678877999
原论文:EWA Splatting

确定视锥体

确定相机位姿进一步确定视锥体,有利于剔除视锥体以外的部分,防止出现浪费的计算。

3D -> 2D (splatting)

  • 该过程将3D空间内的3D椭球投影到2D空间中进行渲染,该过程主要对表示椭球的协方差矩阵乘上变换矩阵加以实现。类比到现实生活中,就好像将雪球用力掷向墙壁,啪的一声绽开,在墙上留下了一个中心密集,向四周逐渐变浅变稀疏的雪块。
    在这里插入图片描述

  • 从3d协方差矩阵 Σ \Sigma Σ 到2d协方差矩阵 Σ ′ {\Sigma}^{\prime} Σ 的变换公式为
    Σ ′ = J k M Σ M T J k T \mathbf{\Sigma}^{\prime}=\mathbf{J}_k\mathbf{M}\mathbf{\Sigma}\mathbf{M}^T\mathbf{J}_k^T Σ=JkMTJkT
    具体推导过程可以参考文章:3d gaussian splatting 中的数学推导

  • 从像素级别的操作来理解渲染过程。
    对于给定坐标 x x x的像素点,我们可以通过视图变化计算出所有在该位置重叠的高斯的深度并排序,最后对排列好的高斯进行alpha融合,返回该像素点最后的颜色值。
    C = ∑ i ∈ N c i α i ′ ∏ j = 1 i − 1 ( 1 − α j ′ ) C=\sum_{i\in\mathcal{N}}c_i\alpha_i^{\prime}\prod j=1^{i-1}\left(1-\alpha_j^{\prime}\right) C=iNciαij=1i1(1αj)
    由于排序过程难以并行化,3dgs使用一些措施来提高效率。

  • 使用瓦片(图像块)来代替像素级别的精度,每个块(tiles)包含16*16个像素。对于覆盖多个块的高斯,作者复制高斯并为他们分配标识符。

  • 每个块独立排序并计算颜色值,该过程可并行执行。
    图片摘自知乎@目难忘
    图片摘自知乎@目难忘

### 关于3D 高斯溅射 (Gaussian Splatting) 技术及其应用 #### 3D 高斯溅射技术概述 3D 高斯溅射是一种用于实时光辐射场渲染的新方法。该技术利用三维高斯分布来近似场景中的点光源和其他几何特征,从而实现高效的实时渲染效果[^1]。 在具体实施方面,这项工作由 Kerbl 等人在2023年提出的一种显式辐射场技术——即3D Gaussian Splatting(简称3DGS),其核心在于采用可微分的3D高斯形状基元作为基本单元来构建和描述复杂的3D场景结构[^3]。相比传统的方法如体素网格或其他类型的离散化表示法,此方法能够更自然地适应各种尺度的变化,并且允许更加精细和平滑的表现形式。 对于具体的算法流程而言,在给定一组输入数据之后(例如来自LiDAR传感器获取到的空间坐标),程序会自动拟合一系列最优参数化的3D高斯基元以最佳匹配原始观测值;随后借助GPU加速下的快速光线追踪机制完成最终图像合成过程。整个过程中涉及到的关键操作包括但不限于: - **初始化阶段**:根据初始猜测设定各基元的位置、方向以及强度属性; - **优化迭代**:反复调整上述各项参数直至达到预设收敛条件为止; - **渲染输出**:运用基于瓦片划分策略的光栅化引擎生成目标视角下所见景象。 值得注意的是,由于完全摒弃了以往依赖大量样本点进行逐像素预测的方式(比如NeRF模型),因此不仅大幅减少了不必要的计算开销,同时也显著提升了整体性能表现水平,使得即使是在资源受限环境下也能流畅运行复杂度较高的可视化任务。 ```python import numpy as np from gaussian_splatting import GaussianSplattingRenderer, load_point_cloud_from_file def main(): point_cloud_path = 'path_to_lidar_data.ply' points = load_point_cloud_from_file(point_cloud_path) renderer = GaussianSplattingRenderer() renderer.fit(points) image = renderer.render() if __name__ == '__main__': main() ``` 这段Python代码展示了如何加载LiDAR扫描得到的数据集并调用`gaussian_splatting`库来进行处理与展示。实际项目开发时可根据需求定制更多功能特性,如支持多种文件格式读取解析、增加交互界面设计等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜡笔小新配吉良吉影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值