OpenUSD usdVol 中的 ParticleField3DGaussianSplat:3D 高斯泼溅(3DGS)粒子场模式详解
2026/9/17 7:32:05 网站建设 项目流程

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 高斯泼溅数据、如何使用projectionModeHintsortingModeHint两个渲染提示属性调优画面表现,并掌握在 USDA 与 C++ 两个层面操作该模式的完整方法。

一、模式定位:面向 3D 高斯泼溅的具体粒子场

ParticleField3DGaussianSplat是 usdVol 模式域中一个具体(concrete)的粒子场模式,用于表示原始 3D Gaussian Splats(3DGS,即 2023 年的 3D 高斯泼溅论文所描述的技术)数据。根据 模式文档 与 schema.usda 中的类定义:

  • 继承自ParticleField基类 priminherits = </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

  • positionspoint3f[]):每个粒子在局部空间中的位置;该数组的长度决定了粒子场中的粒子数量
  • positionshpoint3h[]):半精度(half)版本,用于减小数据占用;schema 明确约定"如果 float 版本可用,数据消费者应优先使用 float 版本"。
  • 若未提供任何位置数据,则该粒子场不包含任何粒子;其他逐粒子数据(scale、orientation 等)若过长会被截断到粒子数,若过短则整段数据被丢弃并回退到默认值。

2. 粒子朝向:ParticleFieldOrientationAttributeAPI

  • orientationsquatf[])/orientationshquath[]):每个粒子的四元数朝向,用于旋转其高斯椭球 kernel。
  • 长度应与 positions 一致;缺失或无效时应应用"零旋转"默认值。

3. 粒子缩放:ParticleFieldScaleAttributeAPI

  • scalesfloat3[])/scaleshhalf3[]):施加到 kernel 上的仿射线性缩放因子
  • 注意 schema 特别说明:这里的 scales 是线性尺度(与 USD 其他地方一致),不是3DGS 相关 PLY 文件中常见的对数(log)格式;缺失时默认为单位缩放。

4. 粒子不透明度:ParticleFieldOpacityAttributeAPI

  • opacitiesfloat[])/opacitieshhalf[]):每个粒子的不透明度,取值范围 [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:sphericalHarmonicsDegreeint(uniform)球谐最高阶数,全部粒子共用;回退值 3。阶数 N 意味着每个粒子有(N+1)*(N+1)个系数
radiance:sphericalHarmonicsCoefficientsfloat3[]展平的球谐系数数组,按粒子分组,每粒子 N 个连续系数,Y(m,l)先按 order (m) 排序、再按 index (l) 排序
radiance:sphericalHarmonicsCoefficientshhalf3[]半精度版本,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允许值perspectivetangential(见 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(zDepthcameraDistancerayHitDistance)均已发布在 tokens.h 的UsdVolTokens中,C++ 代码里可直接用UsdVolTokens->zDepth等形式取值,编译器可校验拼写。

四、继承属性一览

按 官方文档 的分组,ParticleField3DGaussianSplat从各祖先模式继承的属性如下:

继承自 Gprim

属性USD 类型回退值
doubleSidedboolFalse
orientationtokenrightHanded
primvars:displayColorcolor3f[]
primvars:displayOpacityfloat[]

继承自 Boundable

属性USD 类型
extentfloat3[]

继承自 Xformable

属性USD 类型
xformOpOrdertoken[]

继承自 Imageable

属性USD 类型回退值
proxyPrimrel(relationship)
purposetokendefault
visibilitytokeninherited

这些继承属性赋予了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 文档的约定):

  1. positions是必需的:它同时承担"位置"与"粒子数量"两个职责;orientationsscalesopacities的长度必须与之匹配(过长截断、过短整段丢弃并回退默认值)。
  2. 球谐系数长度 = positions 长度 × (degree+1)²:示例中degree = 2意味着每粒子 9 个系数,与示例数组每粒子 9 项的写法一致。
  3. 数据精度选择:若已有 float 精度数据,请使用positions/orientations/scales/opacities/radiance:sphericalHarmonicsCoefficients*h后缀版本用于减小 footprint,两者同时存在时消费者应优先 float 版本。
  4. 两个渲染提示按训练方式取值projectionModeHintsortingModeHint应如实反映数据训练时所用的投影/排序策略(如 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询