AI Hero Club

视觉与三维场景 · 第 6 章

已自行标记完成0 / 8

仅保存在当前浏览器;完成标记不代表通过项目验收。

本章提纲 3 个小节
全课目录 8 章
完整课程计划 ↗
视觉与三维场景 / 课程计划 ↗

CHAPTER 06 / 8建议学习 120 分钟

从点到场:表示、可见性与渲染假设

同一组点换成网格、体场或 Gaussian 后,可见性与渲染分别增加了哪些假设?

本章要解决的 3 个问题
  • 比较点云、网格、体素与辐射场
  • 推导深度缓冲和体渲染权重
  • 明确当前Gaussian渲染器能解释的图像类型
课程项目 ZIP ↓

场景表示、深度顺序与可见性

三角化输出十二个带颜色描述子的三维点,还不是完整场景。表示规定程序能够保存什么,渲染规定它如何产生图像,二者共同决定能被数据辨识的内容。一个点云可精确记录中心,却不提供连续表面或不透明轮廓;同一个点集可被解释为发光粒子、表面采样或体密度中心,得到不同画面。因此从点到图像必须先公开成像假设,不能仅给一个“场景”名称掩盖缺失结构。

点云是位置及附属属性的集合,容易从稀疏匹配得到;若直接画一个像素会有孔洞,需要点尺寸或重建表面的规则。三角网格额外给顶点之间的拓扑连接,并定义片内插值;边如何连接不是从无序点列表自动唯一决定。体素把空间切为格子,每格保存占据或密度;三维分辨率每轴翻倍,格子数约增八倍。连续隐式场则用函数查询坐标,仍需采样、等值面或体积分来形成可见输出。

不透明表面渲染沿每个像素射线只取最近交点。最小教学版本把点投到最近像素,深度缓冲初始为无穷,若当前深度更小就覆盖。这个规则是离散可见性,不模拟透明混合与阴影。项目独立实现并测试深度缓冲,以说明“远点不能盖过近点”的条件;主照片却由可加的发光 Gaussian 产生,二者不会被混称为同一渲染器。不同物理模型需分别验收。

算例一:最近深度和透明混合不同

两点投影到同一像素,深度分别四米和二米。深度缓冲先见四米再见二米,结果二米;倒换输入顺序仍二米,因此对不同深度的点顺序无关。若两点具有半透明度,则远点仍可能贡献颜色,深度缓冲会错误丢弃它。若深度完全相同,颜色覆盖还需要明确相等时的规则,不能只凭比较运算偶然先后决定材质含义。项目测试只检查最小深度,不声称完整表面光栅化。

对连续体积,令射线参数 s 表示距离,密度 sigma 非负,单位为每米。把一小段长度 ds 的透射比例近似为一减 sigma 乘 ds,分段相乘再取连续极限得到指数衰减。到位置 s 的透射率 T 是此前密度线积分取负指数;局部颜色贡献是透射率乘密度乘颜色再积分。这里颜色表示被该段散射或发出的有效辐射,忽略真实多次散射,是采用的体渲染模型而非任意材质的完整物理。

T(s)=exp⁡ ⁣(−∫0sσ(r(t)) dt),C=∫0LT(s)σ(r(s))c(r(s),d) ds+T(L)cbgT(s)=\exp\!\left(-\int_0^s\sigma(r(t))\,dt\right),\qquad C=\int_0^L T(s)\sigma(r(s))c(r(s),d)\,ds+T(L)c_{bg}
r 是射线,d 是方向,颜色可依赖位置与方向,密度非负。

若每段内部密度与颜色近似常数,段长为 delta,段不透明度 alpha 等于一减 exp 负 sigma delta;前段剩余透射率是所有一减 alpha 的乘积。第 i 段权重为此前透射率乘本段 alpha,颜色为这些权重乘颜色的和,再加剩余背景。权重非负,总和加背景权重为一,可用递推证明:加入一段只把已有剩余量拆成新贡献与新剩余。这一归一性是程序检查,而不是可随便删掉的细节。

αi=1−e−σiδi,Ti=∏j<i(1−αj),C=∑iTiαici+[∏i(1−αi)]cbg\alpha_i=1-e^{-\sigma_i\delta_i},\quad T_i=\prod_{j<i}(1-\alpha_j),\quad C=\sum_iT_i\alpha_ic_i+\left[\prod_i(1-\alpha_i)\right]c_{bg}
按由近到远顺序组合;换顺序通常改变颜色。

算例二:两层体积的颜色与顺序

前层为红色,alpha 等于零点五;后层为蓝色,alpha 也为零点五,背景黑。前层贡献红色零点五,后层透射率只剩零点五,所以蓝色贡献零点二五,背景剩余零点二五但为黑。最终 RGB 是零点五、零、零点二五。若交换红蓝深度,结果变成零点二五、零、零点五。把颜色直接相加得到零点五、零、零点五会遗漏可见性,无法与体渲染等同。

NeRF 原始方法用网络把三维位置与观察方向映射为密度与颜色,再沿射线采样并优化多视角像素误差。位置编码、体积权重和视角依赖各承担不同职责;“有一个坐标输入神经网络”并不足以构成 NeRF 实现。本项目不实现该网络、射线体积分或层次采样,因此只用它作机制比较,不把当前亮斑拟合称为已训练 NeRF,也不据小场景速度推断其训练性能。

原始 3D Gaussian Splatting 用显式三维各向异性 Gaussian 表示场景,结合投影协方差、可见性排序、颜色表示与密度控制做优化。这里的项目仅保留“小量三维 Gaussian 参数通过投影得到像素核并可微拟合”这个局部机制。它没有各向异性协方差、球谐方向颜色、分裂剪枝、不透明层排序和高效 GPU 光栅化,不能仅因为名字有 Gaussian 就声称完整复现原论文。

我们的场景被明确定义为稀疏透明发光珠。每个珠子有三维中心、三个强度通道和一个正半径;投影中心来自一般 P,屏幕半径近似焦距乘世界半径除相机深度。像素强度是背景加所有二维 Gaussian 核乘颜色的和,没有前后遮挡。数据生成与拟合共享这项受控假设,因此它适合验证信息链和优化机制,但自然场景的遮挡与反射不在解释范围。

I(u,v)=b+∑iciexp⁡ ⁣[−(u−ui)2+(v−vi)22si2],si=fri/ZiI(u,v)=b+\sum_i c_i\exp\!\left[-\frac{(u-u_i)^2+(v-v_i)^2}{2s_i^2}\right],\qquad s_i=fr_i/Z_i
c_i 为三通道发光强度;此式可加,没有 alpha 可见性乘积。

屏幕半径公式也有近似条件。它把局部投影当各向同性,忽略珠子深度方向的扩展和画面边缘的透视各向异性;当半径相比深度很小、区域不太偏离光轴时较合理。严格线性化可把三维协方差用投影雅可比前后相乘得到二维协方差,下一章写出该关系。这里像素生成器本身直接用这条半径规则,因此“模型内精确拟合”与“现实球体精确投影”要分开。

图像全局 MSE 容易被大量黑背景稀释。亮点只有数百像素,即使位置明显偏移,整幅小图平均误差也可能不大。项目同时记录观测前景区域上的误差与几何中心误差,避免背景占比决定成功。前景掩码使用固定观测阈值,不根据预测哪里容易就选择哪里。若改表示为不透明物体,还必须补轮廓、深度与遮挡检查,不能沿用当前尾部光斑指标当作表面质量。

表示选择影响欠定性。只有中心点的几何不能约束其真实颜色、半径与遮挡;仅用几张光度图像,也可能用不同半径与强度组合得到类似总能量。引入更多视角、已知尺度、合理先验和独立评价可减少歧义,但不凭空证明唯一。课程把可学习参数限制为每珠七个,固定已标定相机,目的是让每个梯度与失败能追到具体假设,不将小参数实验夸大为完整现实场景恢复。

一个合格场景档案同时保存几何、表示类型、坐标单位、相机、成像假设、未知区域与生成图片。如果只有渲染截图,无法判断它是否由预存二维图粘贴;如果只有点云坐标,无法判断像素是否被解释。下一章用可微渲染把两者连接,并用留出视图验证,同样保留投影矩阵和实际输入文件,确保结果能从观测重新计算。

可加发光模型还有一个易核查的非物理饱和边界:多个亮核重合时强度可能超过一。保存八位图片会裁剪到一,训练若仍用未裁剪预测便无法完全解释被裁剪像素。当前场景稀疏、单核峰值零点七二,避免了显著重叠饱和;这是一项数据设计条件。扩展到密集场景时需记录饱和掩码或采用匹配的相机响应,不能把裁剪后的图片当无条件线性观测。

独立运行两层体渲染权重与守恒检查;不把可加亮斑当作 alpha 混合。
front_alpha,back_alpha=.5,.5
weights=[front_alpha,(1-front_alpha)*back_alpha]
bg=(1-front_alpha)*(1-back_alpha)
assert sum(weights)+bg==1
print({'red':weights[0],'blue':weights[1],'background_weight':bg})

TRY IT YOURSELF

练习一:体素成本

一个边长二米的立方区域用每边一百格表示,总格数多少?分辨率每边提高到二百,存储增为几倍?若每格四个float32数,忽略开销各多少字节?

提示 1
稠密三维网格的格数随每边分辨率的哪次方增长?
提示 2
先计总格数再乘每格四个float32,比较两版比值;别把稀疏结构成本直接套用稠密公式。
对照参考解答
一百的三次方是一百万格,二百的三次方是八百万格,所以增八倍。每格四乘四等于十六字节,分别约一千六百万和一亿二千八百万字节。这是稠密数组的成本,不包括索引和梯度;稀疏结构可减少空区域存储,但会引入遍历与分配开销,不能直接认为所有表示都按该公式增长。

TRY IT YOURSELF

练习二:权重归一

三层alpha依次零点二、零点五、零点五,计算三层颜色权重及背景权重,证明总和为一。

提示 1
每层贡献前还剩多少透射率?不能直接把alpha相加。
提示 2
递推w_i=T_i alpha_i、T下一=T_i(1−alpha_i),最后加背景并用逐步守恒检查总和。
对照参考解答
第一层权重零点二,进入第二层透射零点八,权重零点四;进入第三层透射零点四,权重零点二;最终背景透射零点二。相加为一。每一步把上一透射 T 分成 T alpha 与 T(一减alpha),二者之和仍为 T,由此归纳得到任意层数的权重加背景为一。只把三层alpha相加会得一点二,忽略了前层遮挡。

TRY IT YOURSELF

练习三:实现声明

项目训练七参数小Gaussian珠子,能否称为“完整3DGS”或“训练NeRF”?按渲染和参数各指出缺失项。

提示 1
先按实际渲染公式与参数化描述本项目,而非按Gaussian名称分类。
提示 2
分别核查排序透射、协方差、密度控制与辐射场/射线积分,明确哪些机制并未实现。
对照参考解答
不能。当前是少量固定数量、各向同性、视角无关强度的可加投影核,不含真实alpha排序或各向异性协方差,也不做分裂、剪枝与GPU光栅化。它没有位置方向到密度颜色的辐射场网络,也没有射线体积分与层次采样,因此不构成NeRF。可准确称为CPU三维发光Gaussian拟合原理项目,并报告其固定相机与合成观测条件。

CHECK YOUR UNDERSTANDING

检验理解

先作答,再决定是否展开解析。选择题用于发现理解缺口;独立实现与迁移任务仍需另行检验。

1. 稀疏点云是否自动定义连续物体表面?

查看解析无序点位置不决定点间的真实连接与隐藏表面。
2. 两层alpha混合是否与深度顺序无关?

查看解析后层贡献受前层透射影响;特殊相同颜色等情况可例外。
3. 当前主项目的渲染假设是什么?

查看解析这是公开受限模型,不能用名称替代未实现机制。
4. 为何报告前景MSE而不只全图MSE?

查看解析前景由固定观测掩码决定,补充全局平均的盲点。

自行标记用于记录学习进度,不代表通过项目验收。