ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

球谐函数(SH)在Spirula Studio中的作用与旋转对齐原理

球谐函数(SH)在Spirula Studio中的作用与旋转对齐原理 球谐函数(SH)在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球谐函数Spherical Harmonics简称 SH是 Spirula Studio 这类跨厂商 3D Gaussian Splatting3D 高斯泼溅训练器中的核心色彩技术。Spirula Studio 是一款从视频到 Splat 再到 Mesh的开源重建工具基于 Vulkan/CUDA 后端、无需 Python 环境即可运行。本文将用大白话讲清楚两件事SH 在 3DGS 训练中到底负责什么以及当你旋转一个训练好的模型时SH 系数为什么要跟着一起转——这正是 Spirula Studio 中 ShRotation 模块要解决的漂亮问题。球谐函数在 3D Gaussian Splatting 中扮演什么角色先建立一个直觉3D Gaussian Splatting 中的每个高斯小贴片splat不只是一个固定的颜色——它的颜色会随观察方向变化金属反光、塑料柔光、织物漫反射都是典型例子。SH 就是描述颜色随视角变化的数学工具。具体拆解一个 splat 的颜色可以分成两部分组成部分SH 阶数系数数量每通道作用基础色DC 项0 阶l01不随视角变化的恒定颜色视角相关色彩1~4 阶3 / 5 / 7 / 9描述高光、反射等随视角变化的部分0 阶DC 项一个常数即底色旋转模型时它完全不动1~4 阶view-dependent bands每一阶 l 有 2l1 个基函数负责更细腻的光照变化Spirula Studio 支持最多 4 阶渲染时按--sh-degree截断阶数越高细节越强但参数越多。评估逻辑位于渲染着色器 shaders/harmonics.slang核心函数sh_coeffs_to_color训练时 GPU 会在每个像素上根据相机到高斯的单位方向实时算出最终颜色。这也是为什么 Spirula Studio 能在 8 GB 显存里量化训练 1000 万个 SH3 高斯——SH 系数支持 q8/q16 量化存储布局细节见 docs/notes/sh-quant-layout.md。旋转对齐原理为什么转模型时 SH 必须跟着转这是本文的重点也是新手最容易踩坑的地方。问题高光会留在原地假设你把一个训练好的模型整体旋转 90°。如果只旋转几何位置mean、姿态quat和尺度scale而不动 SH 系数会发生什么高光、反光会顽固地留在旧方向上——物体转过去了亮斑却还挂在原来的空中。视角相关的颜色游动了画面立刻穿帮。根本原因SH 颜色是在相机 → 高斯的方向 d 上求值的。模型被旋转矩阵 R 转走后旧方向 d 对应的新方向是 R·d所以系数必须变换以满足colour(R·d) colour(d) 对任意方向 d 都成立解法按波段乘以旋转矩阵关键数学事实是旋转不会混阶。每一阶 l 内部基函数之间用一个正交矩阵 M_l(R)大小 (2l1)×(2l1)描述关系Y_l(R·d) M_l(R) · Y_l(d)代入上面的要求就能推导出唯一解——系数也要左乘同一个矩阵c_l M_l(R) · c_l也就是说旋转模型 每一阶 SH 系数各自乘一个专属旋转矩阵。好在 0 阶是常数不动平移和均匀缩放不改变方向所以整个变换里唯一需要做的 SH 工作就是对 R 求 M_l。闭式解Ivanic-Ruedenberg 递推M_l 怎么求两种思路采样法在球面上采大量方向最小二乘解矩阵。简单但每次旋转都要解方程精度受采样限制递推法本项目的做法利用 Ivanic-Ruedenberg 递推公式J. Phys. Chem. 100:6342, 1996从 M_1 和 M_(l-1) 直接递推出 M_2…M_4几百次乘法就得到全部矩阵。Spirula Studio 在 core/ShRotation.cpp 中实现了递推法一次摆放只构建矩阵一次之后每个高斯只需做矩阵-向量乘法4 阶时共 3×(9254981) 次乘法快得几乎可以忽略。最容易错的细节符号约定递推公式是针对不带 Condon-Shortley 相位的实基函数写的1 阶基为 (y, z, x)而harmonics.slang用的基带相位1 阶基为 (−y, z, −x)。两者相差一个对角符号矩阵 S_l正确的引擎矩阵是M_l(engine) S_l · M_l(plain) · S_l跳过这个共轭变换是最经典的错误而且极其隐蔽1 阶和 3 阶系数只会差个符号肉眼看渲染几乎发现不了。开发团队在写任何 C 之前就用原型对比采样拟合抓出了这个问题——未共轭版本误差达 1 阶共轭后吻合到 1e-15。完整推导见设计笔记 docs/notes/sh-rotation.md。如何验证正确性双重测试闭环Spirula Studio 对这个模块用了单元测试 渲染级集成测试双保险纯数学测试core/tests/sh_rotation_test.cpp逐字转录 25 个基函数在随机旋转加各轴 90°/180° 旋转下验证——波段矩阵与采样最小二乘拟合一致实测 2.8e-15、矩阵正交、群性质 M(R1R2) M(R1)M(R2)、以及旋转系数后的颜色在 R·d 处等于原颜色在 d 处渲染闭环测试backend/tests/engine/splat_transform_render.cpp渲染一个强视角相关的随机场景 → 用相似变换烤进 splats → 相机反向移动同样变换 → 再渲染两帧必须一致实测平均差 3e-7覆盖 3dgs/mip/3dgut、针孔/鱼眼、SH 3 阶和 4 阶。同时设了一个只转几何不转 SH的对照组它必须明显不同差 0.07~0.13证明测试真的测到了该测的东西。在哪里用到从模型摆放到编辑工具这个机制的直接受益者是 SplatTransform——整个模型的位置摆放placement与编辑功能mean - s·R·mean t quat - q_R * quat scale - scale ln s SH - 逐波段旋转透明度与 DC 色保持不变只有视角相关波段跟着转。正如编辑功能规划文档 docs/notes/gui-editing-plan.md 中所说旋转 splat 几何只是三行代码而球谐函数必须逐波段与模型一起旋转才是其中唯一需要真功夫的部分。核心文件速查内容路径SH 旋转矩阵Ivanic-Ruedenberg 递推src/core/ShRotation.h / src/core/ShRotation.cpp模型整体变换几何 SHsrc/checkpoint/SplatTransform.hSH 求值着色器src/shaders/harmonics.slang原理推导与设计笔记docs/notes/sh-rotation.mdSH 量化存储布局docs/notes/sh-quant-layout.md数学单元测试src/core/tests/sh_rotation_test.cpp架构总览docs/architecture.md小结SH 的作用让每个高斯 splat 拥有随视角变化的颜色0 阶是恒定底色1~4 阶描述高光与反射旋转对齐转模型时每阶 SH 系数左乘该阶专属正交矩阵 M_l(R)保证高光跟随物体工程亮点用 Ivanic-Ruedenberg 闭式递推代替采样拟合一次建矩阵、全程只做矩阵-向量乘法并特别注意 Condon-Shortley 相位的符号共轭质量保障数学单测 端到端渲染闭环测试双重验证误差控制在 1e-15 / 3e-7 量级。理解了这个机制你就能明白 Spirula Studio 为什么敢把摆放/旋转训练好的 3DGS 模型做成日常编辑功能——因为球谐函数的旋转对齐从数学上已经被严格保证了。【免费下载链接】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),仅供参考
返回列表