生图3D类

3D 高斯泼溅把「点」换成了「线」:SFU 团队让重建结果长出连续的细丝,头发 PSNR 直接高 2.7 dB

2026年11月11日1 次阅读
3D 高斯泼溅把「点」换成了「线」:SFU 团队让重建结果长出连续的细丝,头发 PSNR 直接高 2.7 dB

3分钟看懂

一句话结论:SFU、多伦多大学这批做图形学的人,把 3D 高斯泼溅(3DGS)里最基本的积木——一个"点"——换成了"一小段线",再把许多小段连成折线。论文 11 月 9 日挂上 arXiv,方法叫 Spaghetti Splatting(意大利面泼溅,名字来自它能把细长结构拉成一根根面条)。

  • 谁做的:George Shramko、Shrisudhan Govindarajan、Rudy Lam、Yizheng Xie、Daniel Rebain、David B. Lindell、Andrea Tagliasacchi,单位是西蒙弗雷泽大学(SFU)、Wayve Labs、英属哥伦比亚大学、多伦多大学。
  • 解决什么:3DGS 用一堆散点表示场景,遇到电线、网兜、头发这种"又细又连续"的东西,只能靠密集的碎点去凑,凑出来的东西放大看是断续的、抖的。
  • 唯一的新意:不是在点的基础上加参数,而是把积木本身换了。点变成线段之后,线段可以首尾相连成一根完整的丝,而且从数学上说,这个表示把 3DGS 完整包含在内。
  • 现在能用吗:还不能。官方项目页写得很直白——代码 11 月 23 日才放出来。今天能看的是论文全文和网页上的三个在线场景。

先说清楚:3DGS 的"点"哪里不够用

3D 高斯泼溅这两年是三维重建里最热的一条线:拍一圈照片,算法吐出几百万个"高斯点",每个点有自己的位置、大小、朝向和透明度,渲染时把它们从近到远叠起来,就得到一张照片级别的画面。快、可编辑、能进浏览器,所以被 Blender、UE、各种扫描 App 一路接了进去。

问题出在"点"这个前提上。一个高斯点在空间里是个小小的椭球,它擅长表达"一团东西"——墙面、桌面、皮肤。但它不擅长表达"一条东西"。

一根电线在真实世界里是一根连续的细管,到了 3DGS 里就变成沿着电线撒的一串小椭球。要让这根电线看起来不断,就得撒得足够密;撒密了,点的数量暴涨,而且每个点的形状、朝向都要各自去拟合,稍微换个角度看,接缝处就开始闪烁、变糊。头发更是极端例子:几万根发丝,每一根都要连续,散点表示几乎不可能做到。

论文里的对照图说得很清楚:同样是排水格栅的钢筋、洋葱网兜的网线,3DGS 类方法给出的是"沿着一根线的散点",Spaghetti Splatting 给出的是"跟着线走的一整段"。

做法:把点拉成线,再把线接成折线

论文用了一个很漂亮的视角来组织这件事。

传统 3DGS 里的一个高斯点,本质上是两个东西卷在一起:一个"零尺寸的点"(数学上叫狄拉克质量),加一个"高斯形状的模糊核"。卷积之后,那个无限小的点在画面上变成了一小团柔和的斑。

既然"点"和"核"是两个独立的零件,那就可以分别换:

  • 换核:高斯核换成 Beta 核,就是另一篇工作(Deformable Beta Splatting)做的事。
  • 换点:把那个"零尺寸的点"换成一截有长度的线段,核保持高斯——这就是 Spaghetti Splatting。

再往前一步:把一截截线段首尾连起来,就是一根折线。而折线可以逼近任意曲线。所以场景的表示从"一堆散点"变成了"一堆可学习的折线"。

这里有个数学上的小甜头:一个点,就是长度为零的线段。所以这个表示天然把 3DGS 包在里面,作者称它是 3DGS 的严格超集。换句话说,它不是"另一个流派",而是把原来的流派当成一个特例收编了。

一个巧劲:线段可以无限劈开,画面不变

实时渲染最怕的是"贵"。线段比点复杂,怎么保证速度?

论文的答案是给线段找一个闭式解:在高斯核下,一截线段沿着某条相机光线的"光学厚度",可以用误差函数(erf)直接算出来,不需要采样积分。但闭式解要求每一对"线段—像素"都单独算,太慢。

于是他们做了一个近似:对每一帧,在每条线段的中点把透视投影线性化一次(这就是经典 EWA 泼溅的老办法),然后按深度缩放投影出来的核。这样既快,又顺手把 Beta 核也一起支持了。

更关键的是合成规则。渲染时线段是前后叠起来的,透明度 α = 1 − e^(−τ)。如果一截长线段被劈成两半、密度不变,那么 τ 被拆成 τ₁ 和 τ₂,两半叠起来的透射率是

(1 − α₁)(1 − α₂) = e^(−τ₁−τ₂) = 1 − α

结果和原来那一整段完全一样。这意味着优化过程中可以随手把一截长线段劈成两截,渲染出来的图一个像素都不变,密度场和透明度都被严格保留。这个性质在工程上很值钱:细长结构需要"短段"来贴合弯曲,粗大区域需要"长段"来省开销,而算法可以在训练中自由地在两者之间切换。

数字:赢是赢了,但赢得很客气

评测铺在三个数据集上:Mip-NeRF 360(通用真实场景)、Shelly(细长结构多)、Fuzzy(毛发、绒状物)。FPS 在 RTX 4090 上测,测试分辨率下统计。

PSNR 越高越好、FPS 越高越好:

  • Mip-NeRF 360:Spaghetti(Beta 核)28.78,DBS+SV8 28.71,3DGS-MCMC+SV8 28.39
  • Shelly:Spaghetti(高斯核)37.38,DBS+SV8 37.22,3DGS-MCMC+SV8 37.10
  • Fuzzy:Spaghetti(高斯核)35.03,3DGS-MCMC+SV8 35.00,DBS+SV8 34.98

看出问题了吗——在通用场景上它只是"险胜",差距在 0.03 到 0.39 dB 这个量级。这不是那种"全面吊打"的论文,作者自己也没这么写,摘要里用的词是 "remains competitive with the state-of-the-art on general scenes"(在通用场景上与当前最优保持竞争力)。

速度上要诚实:

  • Mip-NeRF 360:Spaghetti(Beta)129 FPS,3DGS-MCMC+SV8 198 FPS,Spaghetti(高斯)177 FPS
  • Shelly:Spaghetti(高斯)452 FPS,3DGS-MCMC+SV8 464 FPS
  • Fuzzy:Spaghetti(高斯)415 FPS,3DGS-MCMC+SV8 422 FPS

也就是说,在细长结构多的数据集上,速度基本追平;在通用大场景上,用 Beta 核会明显变慢。如果你要的是"通用场景又快又好",这篇现在还不是那个答案。

真正亮的地方:头发

论文最有说服力的数字不在通用场景,在头发。

数据集是 GeomHair 里挑的 8 款发型,加上 Yuksel 的卷发模型,每款放在头部网格上渲染 100 个视角。对比对象是 Gaussian Haircut(专门做头发的高斯方法):

  • PSNR:32.25 vs 29.56,高 2.7 dB
  • SSIM:0.940 vs 0.923
  • LPIPS:0.043 vs 0.064(越低越好)
  • 发丝 F1(2mm 阈值):61.2 vs 46.9,高 14.3 点
  • 发丝 F1(3mm / 4mm):80.3 / 88.9 vs 63.5 / 72.7

F1 这个指标在这类任务里比 PSNR 更能说明问题——它衡量的是"重建出来的发丝和真实发丝在几何上对不对得上"。高 14 个点,意味着很多原来糊成一团或者断掉的地方,现在真的接上了。

而且因为线段是连着的,输出的发丝可以直接拿去做物理模拟。这是散点表示给不了的东西:一串互不相干的椭球,你不知道哪几个属于同一根头发;一根折线,拓扑关系是现成的。

消融:哪一块真的在起作用

三数据集平均,PSNR / 连通段的平均长度(段数):

  • 完整模型:33.54 / 3.50
  • 去掉中点分裂:33.13 / 3.26
  • 去掉段克隆:32.54 / 4.00 —— PSNR 掉整整 1 dB,最伤的一块
  • 去掉折线合并:33.59 / 1.00 —— 画面指标没掉,但连通段长度从 3.50 崩到 1.00
  • 去掉吸引正则:33.57 / 2.77

这张表藏着一个容易误读的地方:去掉折线合并之后,PSNR 反而略升(33.59),但"每根丝有多长"从 3.50 掉到 1.00——也就是每段都变成了孤立的一小截。

这恰恰是这篇论文的要害:它的卖点不是画质分数,是"结构连不连"。如果你的评价标准只有 PSNR,你会得出"折线合并没用"的错误结论;而如果你要的是能拉出一根完整头发、能直接丢进物理解算器,这个模块就是全部意义所在。

怎么用 / 现在能不能用

现在不能。 官方项目页写得很清楚:

  • 论文:arXiv 2611.12716,已公开
  • 补充材料:预计 11 月 13 日
  • 代码:预计 11 月 23 日

GitHub 上的仓库 theialab/spaghetti-splatting 是 11 月 9 日建的,README 目前只有一句 "Code coming on November 23rd, 2026"。

今天能上手体验的只有项目页上的三个在线场景:room_300k、room_full、sauce(对,就是那盘意面)。需要说明的是,这些是预渲染好的 viewer,不是让你自己传照片去跑。

等到代码放开,从论文的描述看,训练流程和 3DGS 系的方法是一致的:30k 迭代(Mip-NeRF 360 的室外场景 20k),Shelly 和 Fuzzy 上把 primitive 上限压到 50 万,外观模型统一用 Spherical Voronoi 的 8 站点版本(SV8)。也就是说,复现的门槛主要在算力,不在奇怪的依赖。

适合谁,不适合谁

适合:

  • 做头发、毛发、植被、线缆、网格、织物重建的人——这是它的主场,也是它相对现有方法领先最明显的地方。
  • 需要"重建完还能做物理仿真"的管线。连通的折线能直接算,散点不行。
  • 研究型团队,想在一个干净的数学框架上继续改(作者明确留了"段间插值核""接纹理贴图""用前馈模型预测这种表示"三个口子)。

不适合:

  • 只想找个"今天就能跑、通用场景更强"的工具的人。代码还没放,通用场景也没明显优势。
  • 对帧率敏感的大场景 Web/移动端应用。Mip-NeRF 360 上 129 FPS 对 198 FPS,差距是实打实的。
  • 指望它自动恢复出正确的拓扑结构的人。论文结论里自己留了一句:关于"自动恢复拓扑"的更宽泛主张,还需要进一步评估。

几个要留意的坑

  • 别把"严格超集"读成"全面更强"。超集是表示能力上的包含关系,不是指标上的支配关系。
  • PSNR 单位是 dB,差 0.1 已经算可分辨。这篇在通用场景上的 0.03–0.39 dB,属于"同一档次内的波动",不要当成代际领先。
  • 头发那 2.7 dB 是特定数据集(8 款发型 + 1 个卷发模型)上的结果,不是"任意头发都高 2.7 dB"。
  • 高频颜色仍然靠堆短段。作者自己承认,要还原细密纹理,现在还得撒很多短线段,这会把 primitive 数量顶上去。
  • 代码 11-23 才放,补充材料 11-13。在那之前,所有"实测"都只能引用论文自己的数字。

参考来源

本文依据 arXiv 论文全文(含表格与消融数据)、官方项目页与代码仓库整理,未采用二手转述。

评论

0 条已公开
登录或注册后可以参与评论。

正在加载评论...