OpenUSD usdVol 中的 ParticleField3DGaussianSplat:3D 高斯泼溅(3DGS)粒子场模式详解
【免费下载链接】OpenUSDUniversal Scene Description项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSD
本文基于 OpenUSD 官方文档 ParticleField3DGaussianSplat.md 展开,结合pxr/usd/usdVol下的模式定义源码(schema.usda)、C++ 模式头文件与实现(particleField3DGaussianSplat.h、particleField3DGaussianSplat.cpp)进行深度解读。读完本文,你将理解该模式如何用一组"内置应用模式(applied schema)"描述原始 3D 高斯泼溅数据、如何使用projectionModeHint与sortingModeHint两个渲染提示属性调优画面表现,并掌握在 USDA 与 C++ 两个层面操作该模式的完整方法。
一、模式定位:面向 3D 高斯泼溅的具体粒子场
ParticleField3DGaussianSplat是 usdVol 模式域中一个具体(concrete)的粒子场模式,用于表示原始 3D Gaussian Splats(3DGS,即 2023 年的 3D 高斯泼溅论文所描述的技术)数据。根据 模式文档 与 schema.usda 中的类定义:
- 它继承自
ParticleField基类 prim(inherits = </ParticleField>,而ParticleField又继承自Gprim); - 它自带一组自动应用的应用模式(applied schemas),用于提供 3DGS 论文所需的全部数据属性;
- 它还包含若干可选的渲染提示(rendering hints),用于告知渲染器应该如何投影、排序这些高斯泼溅点。这些提示通常与数据训练时所做的选择相关联。
从 schema.usda 可以看到该模式声明了 6 个内置的prepend apiSchemas:
class ParticleField3DGaussianSplat "ParticleField3DGaussianSplat" ( inherits = </ParticleField> ... prepend apiSchemas = [ "ParticleFieldPositionAttributeAPI", "ParticleFieldOrientationAttributeAPI", "ParticleFieldScaleAttributeAPI", "ParticleFieldOpacityAttributeAPI", "ParticleFieldKernelGaussianEllipsoidAPI", "ParticleFieldSphericalHarmonicsAttributeAPI" ] ) { ... }这意味着只要你在舞台上定义了一个ParticleField3DGaussianSplatprim,上述 6 个应用模式就自动附加在其上,无需手动操作。C++ 侧对应的注册逻辑见 particleField3DGaussianSplat.cpp,其中TfType注册和UsdSchemaBase别名("ParticleField3DGaussianSplat")使IsA查询和按 prim 类型名查找类型成为可能。该模式在 plugInfo.json 中以schemaIdentifier: ParticleField3DGaussianSplat注册到插件系统。
其父类ParticleField的定位(见 ParticleField 文档)是"粒子场家族"的共同基类:所有派生粒子场模式都必须提供 Position、Kernel、Radiance 三类属性(形式不限),并可选提供 Orientation、Scale、Opacity 等属性。ParticleField3DGaussianSplat正是这一约定在"原始 3DGS 技术"上的具体落地。usdVol 的 overview 文档 也明确指出:ParticleField是为了支持 3D Gaussian Splats 这类光场(lightfield)技术而引入的,并设计上可扩展到 NeRF 等后续技术。
二、内置应用模式与数据属性
ParticleField3DGaussianSplat本身只直接声明了 2 个属性(两个渲染提示,见后文),其余数据属性全部来自 6 个内置应用模式。以下逐一说明(类型与语义依据 schema.usda 中各应用模式的声明,以及 particleField3DGaussianSplat.h 中生成的便捷访问器)。
1. 粒子位置:ParticleFieldPositionAttributeAPI
positions(point3f[]):每个粒子在局部空间中的位置;该数组的长度决定了粒子场中的粒子数量。positionsh(point3h[]):半精度(half)版本,用于减小数据占用;schema 明确约定"如果 float 版本可用,数据消费者应优先使用 float 版本"。- 若未提供任何位置数据,则该粒子场不包含任何粒子;其他逐粒子数据(scale、orientation 等)若过长会被截断到粒子数,若过短则整段数据被丢弃并回退到默认值。
2. 粒子朝向:ParticleFieldOrientationAttributeAPI
orientations(quatf[])/orientationsh(quath[]):每个粒子的四元数朝向,用于旋转其高斯椭球 kernel。- 长度应与 positions 一致;缺失或无效时应应用"零旋转"默认值。
3. 粒子缩放:ParticleFieldScaleAttributeAPI
scales(float3[])/scalesh(half3[]):施加到 kernel 上的仿射线性缩放因子。- 注意 schema 特别说明:这里的 scales 是线性尺度(与 USD 其他地方一致),不是3DGS 相关 PLY 文件中常见的对数(log)格式;缺失时默认为单位缩放。
4. 粒子不透明度:ParticleFieldOpacityAttributeAPI
opacities(float[])/opacitiesh(half[]):每个粒子的不透明度,取值范围 [0, 1],采用传统(线性)图形学意义;不是PLY 文件中那种需要 sigmoid 激活函数处理的变换数据。- 缺失时默认为全不透明(1.0)。
5. 高斯椭球 kernel:ParticleFieldKernelGaussianEllipsoidAPI
该应用模式不带属性,它是一个类型标记(marker schema),声明该粒子场使用的是"高斯椭球核"。其文档(schema.usda 与 ParticleFieldKernelGaussianEllipsoidAPI.md)给出了无变换 kernel(恒等位置/缩放/旋转、不透明度为 1)在点p处的不透明度定义g(u=0; o=1; x = p.length()):由于标准差为 1,3-σ 点位于 3.0,即99.7% 的 splat 支持范围落在半径为 3 的球形区域内;每个 splat 的不透明度与高斯衰减相乘,旋转与缩放把高斯球变换为椭球,位置则把峰值衰减从原点平移。
6. 球谐辐照度:ParticleFieldSphericalHarmonicsAttributeAPI
这是 3DGS 视角相关颜色的承载方式,属性见 ParticleFieldSphericalHarmonicsAttributeAPI.md:
| 属性 | 类型 | 说明 |
|---|---|---|
radiance:sphericalHarmonicsDegree | int(uniform) | 球谐最高阶数,全部粒子共用;回退值 3。阶数 N 意味着每个粒子有(N+1)*(N+1)个系数 |
radiance:sphericalHarmonicsCoefficients | float3[] | 展平的球谐系数数组,按粒子分组,每粒子 N 个连续系数,Y(m,l)先按 order (m) 排序、再按 index (l) 排序 |
radiance:sphericalHarmonicsCoefficientsh | half3[] | 半精度版本,float 版本可用时应优先使用 float |
长度约定:系数数组长度 = 位置数据长度 ×(degree+1)*(degree+1);过长截断、过短忽略;若完全缺失,粒子应使用 degree 0 下对应 DC 信号(0.5, 0.5, 0.5)的球谐系数。渲染器可以根据 degree 计算每粒子元素大小,从而按粒子"条带化(stripe)"读取该数组。
三、本模式专属的渲染提示属性
文档的主体内容是ParticleField3DGaussianSplat自带的两个uniform token属性。两者在 schema.usda 中均标记了customData = { string group = "Metadata" },即被归类为**元数据(Metadata)**而非渲染数据——它们只是提示,渲染器完全可以忽略,但它们"通常与训练数据时做出的选择对应",对调优渲染很关键。
projectionModeHint
USD 类型:token;回退值:perspective;允许值:perspective、tangential(见 schema.usda 中 allowedTokens)。
渲染提示,说明如何投影高斯以获得透视正确的画面:
perspective:透视投影,类似标准物体从摄像机视角渲染——高斯点按深度进行缩放与形变。tangential:切向投影,把成像平面视为观察球面的切线;高斯点被正交投影,能更好地保留形状与尺度,有助于减少新视角合成(novel view synthesis)等特定应用中的畸变。
C++ 侧通过GetProjectionModeHintAttr()/CreateProjectionModeHintAttr()访问,创建时类型固定为SdfValueTypeNames->Token、可变性为SdfVariabilityUniform(particleField3DGaussianSplat.cpp)。
sortingModeHint
USD 类型:token;回退值:zDepth。光栅化器通常按从后到前(back-to-front)的顺序绘制高斯点,该属性提示相对于摄像机排序高斯点所用的度量方式。
官方 文档 中列出了两个取值;而对照当前 schema.usda 与 C++ 头文件注释,允许值实际包含三个:
zDepth:按粒子位置变换到摄像机局部空间后的 Z 分量排序(最常用,也是 3DGS 光栅化器的典型做法);cameraDistance:按粒子到摄像机的欧氏距离排序;rayHitDistance:按摄像机到射线击中粒子位置的距离排序(用于光线追踪场景);从源码注释看,不支持光线追踪的光栅化器可将该值按cameraDistance处理。
这三个 token(zDepth、cameraDistance、rayHitDistance)均已发布在 tokens.h 的UsdVolTokens中,C++ 代码里可直接用UsdVolTokens->zDepth等形式取值,编译器可校验拼写。
四、继承属性一览
按 官方文档 的分组,ParticleField3DGaussianSplat从各祖先模式继承的属性如下:
继承自 Gprim
| 属性 | USD 类型 | 回退值 |
|---|---|---|
doubleSided | bool | False |
orientation | token | rightHanded |
primvars:displayColor | color3f[] | — |
primvars:displayOpacity | float[] | — |
继承自 Boundable
| 属性 | USD 类型 |
|---|---|
extent | float3[] |
继承自 Xformable
| 属性 | USD 类型 |
|---|---|
xformOpOrder | token[] |
继承自 Imageable
| 属性 | USD 类型 | 回退值 |
|---|---|---|
proxyPrim | rel(relationship) | — |
purpose | token | default |
visibility | token | inherited |
这些继承属性赋予了ParticleField3DGaussianSplat完整的 GPrim 能力:变换(xformOp:系列 +xformOpOrder)、包围盒(extent)、可见性(visibility)、用途(purpose,例如render)、显示用途的 primvars 与代理 prim 等——也就是说,粒子场可以像普通几何体一样被定位、缩放、裁剪与组织。
五、USDA 用法示例
usdVol 的 overview 文档 给出了一个最小可用的ParticleField3DGaussianSplatprim 示例,其属性按"位置(含数量)→ 可选 kernel 控制属性 → 辐照度 → 渲染提示"组织:
def ParticleField3DGaussianSplat "GSplat" { # Particle positions (and count) point3f[] positions = [(0, 0, 0), ... (0, 1, 1)] # Some optional attributes that control the kernel instance quatf[] orientations = [(1, 0, 0, 0), ... (0, 0, 1, 0)] float3[] scales = [(1, 1, 1), ... (1, 0.5, 0.7)] float[] opacities = [1, ... 0.8] # Radiance attributes (from ParticleFieldSphericalHarmonicsAttributeAPI) uniform int radiance:sphericalHarmonicsDegree = 2 float3[] radiance:sphericalHarmonicsCoefficients = [ (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), ... (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1)] # Render hints specific to ParticleField3DGaussianSplat uniform token projectionModeHint = "perspective" uniform token sortingModeHint = "zDepth" }使用要点(均出自 schema 文档的约定):
positions是必需的:它同时承担"位置"与"粒子数量"两个职责;orientations、scales、opacities的长度必须与之匹配(过长截断、过短整段丢弃并回退默认值)。- 球谐系数长度 = positions 长度 × (degree+1)²:示例中
degree = 2意味着每粒子 9 个系数,与示例数组每粒子 9 项的写法一致。 - 数据精度选择:若已有 float 精度数据,请使用
positions/orientations/scales/opacities/radiance:sphericalHarmonicsCoefficients;*h后缀版本用于减小 footprint,两者同时存在时消费者应优先 float 版本。 - 两个渲染提示按训练方式取值:
projectionModeHint与sortingModeHint应如实反映数据训练时所用的投影/排序策略(如 3DGS 训练普遍采用透视投影 + z 深度排序,即示例中的默认组合)。
六、C++ 与 Python API 用法
C++ 模式类UsdVolParticleField3DGaussianSplat定义在 particleField3DGaussianSplat.h,核心 API 包括:
Get(stage, path)/Define(stage, path):分别在已存在路径上获取、或在指定路径定义该模式的 prim(实现,Define会写入 prim 类型名ParticleField3DGaussianSplat);GetProjectionModeHintAttr()/GetSortingModeHintAttr():获取两个渲染提示属性(实现);- 每个应用模式的便捷访问器:如
ParticleFieldPositionAttributeAPI()、GetPositionsAttr()/CreatePositionsAttr()、GetPositionshAttr()、GetScalesAttr()、GetRadianceSphericalHarmonicsCoefficientsAttr()等(头文件),与 6 个内置应用模式一一对应。
头文件中还提供了一组自定义(非生成)方法,用于在 float/half 双版本属性之间做选择,见 particleField3DGaussianSplat.h 与 particleField3DGaussianSplat.cpp:
UsesFloatPositions()、UsesFloatOrientations()、UsesFloatScales()、UsesFloatOpacities()、UsesFloatRadianceCoefficients();- 判断逻辑(私有辅助
_UsesFloatAttr):读取 float 版本属性在最早时间样本(无时间样本时取默认值)的数组,若GetArraySize() > 0则优先使用 float 版本并返回 true,否则返回 half 属性/token 与 false。这正是"float 可用时优先 float"约定的程序化实现。
Python 侧,该模式经wrapParticleField3DGaussianSplat.cpp等 SWIG 封装导出,UsdVol模块(wrap 注册、插件信息 plugInfo.json)中的类名为UsdVolParticleField3DGaussianSplat,可在脚本中直接Define并写入上述属性。
七、关键文件索引
| 内容 | 路径 |
|---|---|
| 本文核心参考(生成的模式文档) | ParticleField3DGaussianSplat.md |
| 基类模式文档 | ParticleField.md |
| 应用模式文档(kernel / 球谐) | ParticleFieldKernelGaussianEllipsoidAPI.md、ParticleFieldSphericalHarmonicsAttributeAPI.md |
| 模式定义(prim 类型与属性声明) | schema.usda |
| C++ 模式头文件 / 实现 | particleField3DGaussianSplat.h、particleField3DGaussianSplat.cpp |
| 发布 token(zDepth/cameraDistance/rayHitDistance/perspective/tangential 等) | tokens.h |
| 模块概览与粒子场最佳实践(含 USDA 示例) | overview.md |
| usdVol 用户文档目录 | usdVol 文档目录 |
小结:ParticleField3DGaussianSplat通过"具体模式 + 6 个自动应用模式"的组合,把 3DGS 论文中的位置、朝向、缩放、不透明度、高斯椭球核与球谐辐照度统一纳入 USD 的稀疏属性体系,并用两个可被忽略但信息量十足的Metadata组 token 提示(投影模式、排序模式)衔接训练侧与渲染侧的约定;理解其继承链(Gprim → ParticleField → ParticleField3DGaussianSplat)与各应用模式的 float/half 双版本属性约定,是正确编写和消费 3D 高斯泼溅 USD 资产的关键。
【免费下载链接】OpenUSDUniversal Scene Description项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSD
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考