你再也找不到更详细的3DGS教程了 —— 一万九千字长文解析3DGS

参考:

https://www.bilibili.com/video/BV1MF4m1V7e3/

https://blog.csdn.net/2401_86810419/article/details/148811121

https://www.bilibili.com/video/BV1cz421872F?t=233.9

https://wuli.wiki/online/SphHar.html

https://zhuanlan.zhihu.com/p/467466131

特别指出的是SY__007的3DGS较真系列,对本文有极大的启发和参考价值,下文有很多截图也直接来自视频,强烈推荐大家移步小破站,去观看视频。

做雪球?

What is splatting?

关于Splat,在英语中作抛雪球打击到墙面的拟声词。

Splatting是一种体渲染的方法:将3D物体渲染到2D平面

与NeRF中的渲染方法的差异:

NeRF中使用Ray-casting(类似射线求积分):是计算像素点收到发光粒子的影响来生成图像。

3DGS中使用Splatting这种主动的方法,计算发光粒子如何影响像素

Splatting算法的核心:

  1.选择雪球

  2.抛掷雪球:从3D投影到2D,得到足迹(footprint)

  3.加以合成,得到最终的图像

一:为什么使用核(雪球,Gaussian):

基于Gaussian的数学性质:

1.Gaussian本身是闭合的椭球,经过仿射变换后依旧是封闭的

2.高维Gaussian降维(沿某个轴进行积分)之后依旧是Gaussian

对于椭球Gaussian:

                                                          

其中x是三维空间中的点,

μ是高斯分布的均值向量,表示Gaussian的中心点位置

Σ是协方差矩阵,描述Gaussian在3D空间中的形状和方向,它是半正定的

为什么这是一个椭球?

首先去了解 协方差矩阵。

对于Gauss分布:

一维:形状由 均值&方差 决定

高维:形状由 均值&协方差矩阵 决定

对于协方差矩阵:

                                                         

  1. 是一个对称矩阵,决定高斯分布形状

  2. 对角线上元素为x轴/y轴/z轴的方差

  3. 反斜对角线上的值为协方差,表示x和y,x和z........的线性相关程度

这里直接用SY__007写的:

抛雪球

如何进行参数变换?

从3D->像素的过程:

观测变换

观测变换:从世界坐标系-->相机坐标系

投影变换

投影变换:正交投影 、透视投影

正交投影:

对于立方体[l,r]*[b,t]*[f,n]

1.平移到原点

2.立方体缩放至[-1,1]^3的正方体空间内

总的来说就是进行了仿射变换,

如题所给的例子的仿射变换即是:

M_{ortho}=AB

A这里是缩放矩阵

B为平移矩阵

在正交投影中,我们没有考虑对于原本的长方体的长和宽的比例不同,导致的缩放比例不同,其实产生了畸变,这个问题会在之后的视口变换解决

透视投影:

透视投影需要满足近大远小的条件

对于视锥,我们先把他变换为‘立方体’,再进行正交投影

                          

数学过程实在懒得写了,这里直接放上作者手稿一张

问题?:

透视投影是非线性的,也就是非放射变换,但是高斯椭球经过仿射变换后是高斯,但非仿射变换就不一定。

                                                      ​​​​​​​

视口变换:

我们从简化的图形渲染管线开始:

3D 顶点 → 模型变换 → 视图变换 → 投影变换 → 裁剪 → 标准化设备坐标 → 视口变换 → 屏幕像素

之前的变换已经将顶点从”模型局部坐标“转换成NDC空间坐标,以OpenGL为例,正交投影下为[-1,1]×[-1,1]×[-1,1]

视口变换的目的就是把可见区域的标准化坐标,映射到显示器的实际像素区域,让图形真正显示在屏幕上。

视口变换的数学实现

核心是缩放+平移的组合,把NDC范围映射到屏幕视口的像素范围:

(1)以OpenGL经典的[-1.1]立方体为例(xy对应屏幕二维,z用于深度缓冲):

  • NDC的x范围:x_{ndc}\in [-1,1]

  • NDC的y范围:y_{ndc}\in [-1,1]

  • NDC的z范围:z_{ndc}\in [-1,1](或者[0,1],这取决于深度缓冲装置)

(2)目标视口的像素范围

假设屏幕视口的:

  • 左下角像素坐标:(x0,y0)(比如窗口内视口偏移,或全屏时 (0,0))

  • 宽度:width(像素数,如 800 )、高度:height(像素数,如 600 )

  • 深度范围(可选,用于深度缓冲):[zNear,zFar](比如 [0,255] 或浮点深度 )

(3)视口变换矩阵与公式

视口变换通过缩放矩阵+平移矩阵,实现对标准化坐标(x_{ndc},y_{ndc},z_{ndc}),变换后得到屏幕像素坐标(x_{vp},y_{vp},z_{vp})

                                      

用矩阵形式(齐次坐标下)可以表示为:

               

对于M_{viewport}进行拆解

1.缩放部分:

  • x方向:\frac{width}{2}把[-1,1]缩放为[0,width]范围;

  • y方向:\frac{height}{2}把[-1,1]缩放为[0,height]范围,但考虑到屏幕坐标系一般y轴"向下为上”(与NDC相反),所以使用(1-y_{ndc})反转;

  • z方向:\frac{zFar-zNear}{2}把[-1,1]缩放为[zNear,zFar](深度缓冲的实际范围)

2.平移部分

  • x 平移x0+\frac{width}{2},让缩放后的 [0,width] 起点对齐视口左下角 x0;

  • y 平移 y0+\frac{height}{2},同理对齐视口左下角 y0;

  • z 平移zNear + \frac{zFar - zNear}{2} ,让缩放后的深度对齐 zNear 起点。

视口变换的实际作用:
  • 从虚拟坐标到物理屏幕

  • 支持多视角渲染

  • 深度缓冲的落地

光栅化:

1.光栅化的位置:渲染管线‘矢量-->像素’转换

简单渲染管线流程为:

3D 顶点 → 变换(模型/视图/投影)→ 裁剪 → 标准化设备坐标(NDC)→ 光栅化 → 像素着色 → 帧缓冲 → 屏幕

  • 前面的变换,把顶点转成抽象的数学坐标(如NDC空间下的[-1,1]立方体)

  • 光栅化要解决:如何把这些矢量图元拆解成屏幕上的离散像素,让每个像素知道“属于哪个图元,该染什么颜色”

2.光栅化的核心任务:图元的“离散化”

(1)输入:图元的“数学描述”

以三角形为例(图形学的最基础图元,复杂模型由三角形拼接),输入是三个顶点的坐标(NDC或视口变换后的屏幕坐标),以及顶点附带的属性(颜色、法向量、纹理坐标等)。

(2)输出:像素的“归属与属性”

输出是覆盖这些三角形的所有像素,并为每个像素插值计算属性(比如/顶点颜色查指出像素颜色,纹理坐标插值出采样位置),供后续像素着色器处理。

3.光栅化的关键步骤

(1)三角形 setup(配置)

计算三角形的边方程和包围盒

  • 先找出三角形在屏幕上的最小包围矩形(AABB),只遍历这个范围内的像素,减少计算量;

  • 推导三角形三条边的数学方程(如ax+by+c=0),用于判断i像素是否在三角形内

(2)三角形traversal(遍历)

  • 对包围盒捏的每个像素(或'采样点'),用便方程判断是否在三角形内(比如OpenGL的“winding order”规则,或计算重心坐标)。

  • 若像素在三角形内,就标记为属于该三角形,并进入属性插值阶段

(3)属性插值

三角形三个顶点有属性(如颜色C_0,C_1,C_2、纹理坐标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921825.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python,遗传算法与神经网络架构搜索:基于DEAP的自动模型设计

引言:当进化论遇见深度学习——自动化的黎明在深度学习的蛮荒时代,我们是“手工匠人”。我们依靠直觉、前辈的经验(ResNet 为什么是152层而不是153层?)、大量的试错以及那么一点点玄学,在架构的黑暗森林中摸…

Vue框架技术详解——项目驱动概念理解【前端】【Vue】

Vue3框架 是前端渲染框架浏览器向服务器第一次发送请求,就会将所有页面的样式全部返回到浏览器vue中会将所有js文件最后打包成一个js文件,当前访问其中一个页面时,其他页面的样式也已经返回到浏览器中了,下次切换页面时&#xff…

HTML 网页静态托管 API 接口文档(可集成到智能体Agent)

HTML 网页静态托管 API 接口文档(可集成到智能体Agent) 接口概述 本接口用于将HTML代码转换为可访问的网页,支持通过API密钥进行身份验证。 API 密钥申请地址: https://www.cuobiezi.net/user/api_keys/apply API接口信息 接…

springboot vue sse消息推送,封装系统公共消息推送前后端方法

概述 1、封装springboot全局的消息推送接口; 注:1)由于原生HTML5 EventSource 不支持添加header,所以要把连接创建接口加入身份验证白名单,并在接口内添加自己校验token2)后台需定时心跳,保证链…

LeetCode 每日一题 2025/9/1-2025/9/7

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录9/1 1792. 最大平均通过率9/2 3025. 人员站位的方案数 I9/3 3027. 人员站位的方案数 II9/4 3516. 找到最近的人9/5 2749. 得到整数零需要执行的最少操作数9/6 3495. 使数组元…

小迪安全v2023学习笔记(八十讲)—— 中间件安全WPS分析WeblogicJenkinsJettyCVE

文章目录前记服务攻防——第八十天中间件安全&HW2023-WPS分析&Weblogic&Jetty&Jenkins&CVE应用WPS - HW2023-RCE&复现&上线CS介绍漏洞复现中间件 - Weblogic-CVE&反序列化&RCE介绍利用中间件 - Jenkins-CVE&RCE执行介绍漏洞复现CVE-20…

各webshell管理工具流量分析

哥斯拉哥斯拉是一个基于流量、HTTP全加密的webshell管理工具 特点 1.内置了3种Payload以及6种加密器,6种支持脚本后缀,20个内置插件 2.基于java,可以跨平台使用 3.可以自己生成webshell,根据管理来生成一些payload,然后…

pytest(1):fixture从入门到精通

pytest(1):fixture从入门到精通前言1. Fixture 是什么?为什么我们需要它?2. 快速上手:第一个 Fixture 与基本用法3. 作用域 (Scope):控制 Fixture 的生命周期4. 资源管理:Setup/Tear…

Java17 LTS 新特性用例

基于 Java 17 LTS 的 实用示例 以下是基于 Java 17 LTS 的 30 个实用示例,涵盖语言新特性、API 改进及常见场景。所有代码均兼容 Java 17 语法规范。 文本块(Text Blocks) String json = """{"name": "Java 17","type": &qu…

SpringBoot-Web开发-内容协商——多端内容适配内容协商原理HttpMessageConverter

其它篇章: 一:SpringBoot3-日志——日志原理&日志格式&日志级别&日志分组&文件输出&文件归档&滚动切割 二:SpringBoot3-Web开发-静态资源——WebMvcAutoConfiguration原理&资源映射&资源缓存&欢迎页&…

Spring MVC 类型转换与参数绑定:从架构到实战

在 Spring MVC 开发中,“前端请求数据” 与 “后端 Java 对象” 的格式差异是高频痛点 —— 比如前端传的String类型日期(2025-09-08)要转成后端的LocalDate,或者字符串male要转成GenderEnum.MALE枚举。Spring 并非通过零散工具解…

Spark提交任务的资源配置和优化

Spark 提交任务时主要可调的资源配置参数包括 Driver 资源(内存、CPU)、Executor 资源(数量、内存、CPU)以及 集群管理相关参数。配置和优化时一般结合集群硬件资源、数据规模、作业类型和作业复杂度(SQL / 机器学习&a…

机器学习06——支持向量机(SVM核心思想与求解、核函数、软间隔与正则化、支持向量回归、核方法)

上一章:机器学习05——多分类学习与类别不平衡 下一章:机器学习07——贝叶斯分类器 机器学习实战项目:【从 0 到 1 落地】机器学习实操项目目录:覆盖入门到进阶,大学生就业 / 竞赛必备 文章目录一、间隔与支持向量&…

AI集群全链路监控:从GPU微架构指标到业务Metric关联

点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,80G大显存,按量计费,灵活弹性,顶级配置,学生更享专属优惠。 引言:AI算力时代的监控挑战 随着深度学习模型规模的指…

K8s Ingress Annotations参数使用指南

Kubernetes Ingress Annotations 是与特定 Ingress 控制器(如 Nginx、Traefik、HAProxy 等)配合使用,用于扩展和定制 Ingress 资源行为的关键配置项。它们通常以键值对的形式添加在 Ingress 资源的 metadata部分。Ingress Annotations参数速查…

CodeBuddy Code深度实战:从零构建智能电商推荐系统的完整开发历程

项目背景与挑战作为一名有着多年全栈开发经验的技术人员,我最近接手了一个具有挑战性的项目:为某中型服装电商平台开发一套智能商品推荐系统。该系统需要在2个月内完成,包含以下核心功能:前端:React TypeScript构建的…

Day 19: 算法基础与面试理论精通 - 从思想理解到策略掌握的完整体系

Day 19: 算法基础与面试理论精通 - 从思想理解到策略掌握的完整体系 🎯 课程概述 核心目标:深度理解算法设计思想和核心原理,掌握面试高频算法概念,建立完整的算法知识体系 学习重点: ✅ 核心数据结构的本质理解和应用场景分析 ✅ 经典算法设计模式的思想精髓和解题策…

AI与AR融合:重塑石化与能源巡检的未来

在石化企业和新能源电站的巡检工作中,传统模式正被一场技术革命所颠覆。AI与AR( www.teamhelper.cn )的深度融合,不仅提升了巡检效率,更将巡检工作从被动响应转变为预测预防,开启了智能运维的新篇章。一、透…

滴滴二面(准备二)

手写防抖函数并清晰阐述其价值,确实是前端面试的常见考点。下面我将为你直接呈现防抖函数的代码,并重点结合滴滴的业务场景进行解释,帮助你向面试官展示思考深度。 这是防抖函数的一个基本实现,附带注释以便理解: func…

Kubernetes(四):Service

目录 一、定义Service 1.1 typeClusterIP 1.2 typeNodePort 1.3 typeLoadBalancer 1.4 typeExternalName 1.5 无标签选择器的Service 1.6 Headless Service 二、Kubernetes的服务发现 2.1 环境变量方式 2.2 DNS方式 Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的应用…