ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Spirula Studio 的 SH 旋转符号约定全解:Ivanic-Ruedenberg 递归与 Condon-Shortley 相位

Spirula Studio 的 SH 旋转符号约定全解:Ivanic-Ruedenberg 递归与 Condon-Shortley 相位 Spirula Studio 的 SH 旋转符号约定全解Ivanic-Ruedenberg 递归与 Condon-Shortley 相位【免费下载链接】spirula-studioCross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA.项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studioSpirula Studio 是一款跨厂商的 3D Gaussian Splatting3D 高斯泼溅训练器能把视频/照片训练成 splat 模型并进一步导出网格支持 Vulkan 与 CUDA 后端。本文深入它的 SH 旋转实现讲清 Ivanic-Ruedenberg 递归闭式解与 Condon-Shortley 相位这两个符号约定是如何咬合在一起的。为什么 SH 系数必须跟着模型一起旋转 3DGS 里每个高斯的颜色分两部分DC 分量零阶球谐固定颜色与视角无关高阶球谐系数l 1..4描述从哪个方向看是什么颜色的视角相关项在高斯处沿相机→高斯的单位方向d求值colour(d) Σ c_lm · Y_lm(d)几何一旋转方向就从d变成R·d。如果只转几何、不动这组系数高光会钉在旧世界里物体在它下面打转。于是旋转后的系数c必须满足对任意d都成立colour(R·d) colour(d)这是整个实现的出发点完整的推导见 docs/notes/sh-rotation.md。频带旋转矩阵 M_l旋转不串频带球谐旋转有一个漂亮的性质不同频带band之间不混合。对每个l存在一个正交的(2l1) × (2l1)矩阵M_l(R)满足Y_l(R·d) M_l(R) · Y_l(d)。代入上式后可以直接解出系数变换c_l M_l(R) · c_l由此带来两个实用结论零阶DC 颜色和透明度在任何摆放变换中都原封不动平移和等比缩放不改变任何方向真正起作用的是旋转R。闭式解Ivanic-Ruedenberg 递归求M_l最直观的办法是采样法在球面上取大量方向分别在d和R·d处求值基函数再解一个最小二乘问题。它显然正确但每次旋转都要解一次线性方程组精度还受限于采样密度。Spirula Studio 采用的是Ivanic-Ruedenberg 递归J. Phys. Chem. 100:6342, 1996含 1998 勘误只用一阶矩阵M_1和上一阶M_(l-1)就能递推出高阶M_l——闭式解无需采样l1..4 全部频带只需几百次乘法。工程上更划算的是一次建矩阵处处复用一次摆放对应整个模型的一次旋转矩阵只建一次之后每个高斯每频带每通道只是一次矩阵-向量乘四阶时共 3 × (9 25 49 81) 次乘法。核心实现在 src/core/ShRotation.cpp由 src/checkpoint/SplatTransform.h 消费。符号约定陷阱Condon-Shortley 相位 ⚠️问题出在递归的原始出处上Ivanic-Ruedenberg 递归是针对不带 Condon-Shortley 相位的实球谐写的。在那个无相位基里一阶频带是(y, z, x)M_1就是行、列同序置换后的R本身。但 Spirula Studio 的着色器 src/shaders/harmonics.slang 的基函数带着相位它的一阶频带是(-y, z, -x)一般地每个Y_lm比无相位版本多一个(-1)^m的因子。设S_l为这些符号构成的对角矩阵则两套基的旋转矩阵相差一次共轭M_l^engine S_l · M_l^plain · S_l也就是说M_l的第(m, n)个元素恰好当m n为奇数时变号。src/core/ShRotation.cpp 先无相位地跑完递归最后再套上这层共轭跳过这一步是经典错误而且是安静的错误一阶和三阶频带会错在符号上随手看一眼渲染画面根本发现不了。项目里是在写任何 C 之前就用原型代码抓住它的——无相位版本每个频带误差达到 1 的量级共轭后的版本与采样拟合一致到 1e-15。双重验证从单元测试到端到端渲染符号约定对不对光靠推导不够Spirula Studio 用了两层防线第一层单元测试对采样拟合。src/core/tests/sh_rotation_test.cpp 把harmonics.slang里 25 个基函数常数对常数地誊抄进测试覆盖随机旋转加每个轴的 90°/180° 旋转检查每个频带矩阵与采样最小二乘拟合一致实测 2.8e-15矩阵正交性、M(R1·R2) M(R1)·M(R2)组合律0~4 阶随机系数经apply()旋转后满足colour(R·d) colour(d)。第二层真实渲染闭环。src/backend/tests/engine/splat_transform_render.cpp 渲染一个视角依赖很强的随机场景用transform_splats把相似变换烘焙进 splat再把相机做同样的变换重新渲染——两张图必须一致实测 3DGS / mip / 3DGUT、针孔 / 鱼眼、SH 3 阶 / 4 阶下平均差异仅 3e-7。对照组只移动几何而不动 SH差异为 0.07~0.13肉眼可辨证明测试确实看得见它要测的东西。核心文件一览 内容路径推导与验证思路设计笔记docs/notes/sh-rotation.mdSH 旋转矩阵与系数变换src/core/ShRotation.h、src/core/ShRotation.cpp引擎实际求值的 25 个实球谐基函数src/shaders/harmonics.slang模型摆放/相似变换入口src/checkpoint/SplatTransform.h符号约定单元测试src/core/tests/sh_rotation_test.cpp端到端渲染验证src/backend/tests/engine/splat_transform_render.cpp一句话总结Ivanic-Ruedenberg 递归给你高效的闭式旋转矩阵Condon-Shortley 相位则要求最后补一次对角共轭——少了它高斯会带着错位的光转起来而这正是 Spirula Studio 用原型和双层测试提前堵死的坑。【免费下载链接】spirula-studioCross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA.项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表