解析)
OpenUSD usdVol 之 ParticleFieldKernelGaussianSurfletAPI粒子场的平面高斯曲面片内核Gaussian Surflet Kernel解析【免费下载链接】OpenUSDUniversal Scene Description项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSD导读本文围绕 OpenUSD 仓库中usdVol模块的ParticleFieldKernelGaussianSurfletAPI模式展开深入讲解它如何为 ParticleField粒子场如 3D Gaussian Splats定义一个平面高斯曲面片内核每个粒子在局部 XY 平面上投影出具有高斯衰减的圆形光斑splat并支持通过旋转、缩放与透明度将内核实例变换为平面椭圆。读完本文你将掌握该内核的数学定义、与ParticleFieldKernelGaussianEllipsoidAPI、ParticleFieldKernelConstantSurfletAPI的差异、其在ParticleField/ParticleField3DGaussianSplat体系中的位置以及如何在 USD 场景usda与 C 代码中正确应用这一单次应用型single-applyAPI 模式。一、模式定位一个为 ParticleField 定义内核的 applied schemaParticleFieldKernelGaussianSurfletAPI是 OpenUSDusdVol模式域中的一个单次应用型 API 模式single-apply API schema。它的官方文档描述是Defines the Gaussian surflet kernel for a ParticleField.即为给定ParticleField定义高斯曲面片内核Gaussian surflet kernel。surflet 即 surface element曲面片/面元强调该内核的支撑区域是一个平面片状结构而不是三维体。从源码角度看该模式在 schema.usda 中被定义为继承自APISchemaBase并带有以下关键元数据apiSchemaType singleApply每个 prim 只能应用一次apiSchemaCanOnlyApplyTo [ParticleField]只能应用到ParticleField及其派生类型上reflectedAPISchemas/prepend apiSchemas中自动携带ParticleFieldKernelBaseAPI所有内核类 applied schema 都会自动应用这个基类模式便于校验工具强制要求一个 ParticleField 必须具备内核定义见 schema.usda 中ParticleFieldKernelBaseAPI的 doc 说明。在 USD 的ParticleField概念中内核kernel指实例化到每个粒子上的空间基函数与位置positions、方向orientations、缩放scales、透明度opacities、辐射度radiance共同构成一个完整的粒子场描述。ParticleFieldKernelBaseAPI正是为内核这一类特征提供的自动应用基类详见 schema.usda 对ParticleField的说明。二、内核的数学定义XY 平面上的高斯圆盘文档给出了该内核在未变换identity状态下的精确数学行为这是理解整个模式的核心An un-transformed kernel (i.e. identity position, scale, rotation, opacity) will define opacity at point p on the XY plane byg(u0;o1;x p.length()), with opacity off the XY-plane defined as 0.拆解如下定义域内核只在与粒子局部坐标系 XY 平面共面的点上定义非零不透明度偏离 XY 平面的位置不透明度恒为 0——这是 surflet平面片与 ellipsoid三维椭球最本质的区别。函数形式在 XY 平面内点p处的不透明度由g(u0; o1; x p.length())给出。其中u为每光斑不透明度乘数per-splat opacity取默认值 0 表示不额外衰减o为内核自身的整体不透明度opacity取默认值 1x p.length()为点p到原点的径向距离g(...)是以标准差为 1 的一维高斯函数即内核在 XY 平面上呈各向同性的高斯衰减分布。标准差与 3-sigma 支撑范围由于高斯函数的标准差为 13-sigma 点为 3.0因此 99.7% 的光斑splat支撑都落在 XY 平面上半径 3 的圆形区域circular disk of radius 3内。这意味着半径为 1 处1-sigma贡献约 68.3% 的积分支撑半径 2 处2-sigma贡献约 95.4%半径 3 处3-sigma累计 99.7%工程上可以近似认为半径 3 之外高斯衰减已可忽略渲染器通常据此确定每个粒子的影响范围与裁剪边界。这一数学定义与ParticleFieldKernelGaussianEllipsoidAPI形成鲜明对照后者在未变换状态下在整个三维空间按g(u0;o1;x p.length())定义不透明度支撑为半径 3 的球形区域见 schema.usda 的 doc。二者共享同一高斯公式与 3-sigma 约定区别仅在于支撑的维度平面 vs. 球体。三、逐粒子变换从圆盘到平面椭圆文档紧接着说明内核实例如何被每个粒子的属性所变换Per-splat opacity is multiplicative with the Gaussian falloff; rotation and scale will transform the Gaussian disk kernel into a planar ellipse, and position moves the per-splat peak falloff from the origin.对应到ParticleField的逐粒子属性体系见 schema.usda 中位置/方向/缩放/透明度四个 applied schema透明度opacity是乘法关系每个粒子自身的opacities值范围 [0,1]会与高斯衰减g(...)相乘共同决定该粒子的最终不透明度贡献。也就是说即使高斯函数在中心处取最大值粒子透明度为 0 时该粒子也不会产生任何可见贡献。旋转orientations将圆盘转为平面椭圆内核实例以粒子局部坐标定义粒子携带的四元数方向quatf[] orientations会把圆形高斯圆盘在空间里任意旋转使投影到世界空间后呈平面椭圆形态。这也是为什么ParticleFieldOrientationAttributeAPI的 doc 特别强调当内核不是旋转对称时方向属性是必要的——高斯 surflet 显然不是旋转对称的它只存在于一个平面内。缩放scales沿三个轴拉伸椭圆float3[] scales提供仿射线性缩放因子注意是线性缩放不是高斯 splat 常见 PLY 文件里的对数格式三个分量独立缩放后圆盘进一步变成长短轴可控的平面椭圆。需要注意文档中缩放会把高斯圆盘内核变换成平面椭圆的表述同时涵盖旋转与缩放两种作用——单独旋转使圆盘倾斜单独非均匀缩放直接产生椭圆二者组合则得到任意朝向的椭圆盘。位置positions移动峰值位置每个粒子的positions局部空间点决定内核实例的原点即把高斯衰减的峰值peak falloff从坐标原点移动到该粒子所在位置。综合起来每个粒子的完整内核实例可以看作一个以粒子位置为中心、以粒子方向为朝向、以粒子缩放为三轴尺度、以粒子透明度为整体权重的平面高斯椭圆盘。四、在 ParticleField 模式家族中的位置usdVol目前提供三种内核 applied schema全部以ParticleFieldKernelBaseAPI为自动应用基类且都只能应用到ParticleField模式名支撑区域未变换形态衰减形式源码位置ParticleFieldKernelGaussianSurfletAPIXY 平面半径 3 的圆形高斯盘标准差 1高斯gschema.usdaParticleFieldKernelGaussianEllipsoidAPI三维空间半径 3 的高斯球标准差 1高斯gschema.usdaParticleFieldKernelConstantSurfletAPIXY 平面半径 1 的均匀圆盘阶跃函数p.length() 1时为 1否则为 0schema.usda三者对比可见GaussianSurflet适合需要薄片状软边缘光斑的粒子技术如基于光场/平面片近似的表示GaussianEllipsoid是经典 3D Gaussian Splats3DGS所用的内核仓库中的具体类型ParticleField3DGaussianSplat自动应用的就是ParticleFieldKernelGaussianEllipsoidAPI而非 surflet 版本见 generatedSchema.usda 的apiSchemas列表ConstantSurflet提供有界、均匀、半径 1 的硬边圆盘是高斯曲面片的有界近似。从源码结构可以推断GaussianSurfletAPI与GaussianEllipsoidAPI是同一高斯公式、不同支撑维度的一对孪生模式而ConstantSurfletAPI是它们的有界简化版本三者共同覆盖了从软到硬、从平面到立体的内核需求。五、在 USD 场景中如何声明与使用ParticleFieldKernelGaussianSurfletAPI是单次应用型 API 模式使用方式与所有UsdAPISchemaBase派生模式一致。5.1 usda 场景写法在场景文件中通过apiSchemas元数据把模式应用到ParticleField及其派生 prim 上#usda 1.0 def ParticleField MySurfletField ( prepend apiSchemas [ ParticleFieldKernelGaussianSurfletAPI, ParticleFieldPositionAttributeAPI, ParticleFieldOrientationAttributeAPI, ParticleFieldScaleAttributeAPI, ParticleFieldOpacityAttributeAPI ] ) { # 粒子位置其数量决定粒子总数 point3f[] positions [(0, 0, 0), (0, 1, 1), (1, 0, 0)] # 逐粒子方向把高斯圆盘旋转成任意朝向的平面椭圆 quatf[] orientations [(1, 0, 0, 0), (0.707, 0.707, 0, 0), (1, 0, 0, 0)] # 逐粒子线性缩放三个分量独立拉伸圆盘 float3[] scales [(1, 1, 1), (1, 0.5, 0.7), (0.8, 0.8, 0.8)] # 逐粒子不透明度[0,1]与高斯衰减相乘 float[] opacities [1, 0.8, 0.5] }需要注意的几条约定来自ParticleField相关 attribute 模式的 doc见 schema.usdapositions数组的长度决定粒子数量若缺失则粒子场为空。orientations、scales、opacities等逐粒子数组的长度应与positions一致过长会被截断到粒子数过短则整组数据被忽略并回退到默认值方向回退为无旋转、缩放回退为单位尺度、不透明度回退为 1.0 完全不透明。属性通常同时提供float与half两种精度版本如positions/positionsh、scales/scalesh、opacities/opacitiesh数据消费者应优先读取float版本。5.2 C API 用法该模式由代码生成器产出标准 C 类UsdVolParticleFieldKernelGaussianSurfletAPI定义于 particleFieldKernelGaussianSurfletAPI.h实现于 particleFieldKernelGaussianSurfletAPI.cpp。典型用法如下#include pxr/usd/usdVol/particleFieldKernelGaussianSurfletAPI.h #include pxr/usd/usd/prim.h #include pxr/usd/usd/stage.h using namespace pxr; UsdStageRefPtr stage UsdStage::Open(myField.usda); UsdPrim prim stage-GetPrimAtPath(SdfPath(/MySurfletField)); // 1. 检查是否可以应用该模式 std::string whyNot; if (UsdVolParticleFieldKernelGaussianSurfletAPI::CanApply(prim, whyNot)) { // 2. 应用模式single-apply会写入 prim 的 apiSchemas 元数据 UsdVolParticleFieldKernelGaussianSurfletAPI api UsdVolParticleFieldKernelGaussianSurfletAPI::Apply(prim); if (api) { // 3. 通过反射出的基类访问内核通用能力 UsdVolParticleFieldKernelBaseAPI base api.ParticleFieldKernelBaseAPI(); } } else { TF_WARN(Cannot apply: %s, whyNot.c_str()); } // 只读获取 UsdVolParticleFieldKernelGaussianSurfletAPI api UsdVolParticleFieldKernelGaussianSurfletAPI::Get(stage, SdfPath(/MySurfletField)); if (api) { // prim 已带有该内核模式 }代码生成器提供的这套Get / Apply / CanApply / GetSchemaAttributeNames接口是 OpenUSD 所有 applied schema 的标准形态参见 particleFieldKernelGaussianSurfletAPI.cpp 中的实现其中Apply通过在 prim 的 token 列表元数据apiSchemas上追加ParticleFieldKernelGaussianSurfletAPI来记录应用状态。由于reflectedAPISchemas的存在模式对象还暴露了ParticleFieldKernelBaseAPI()访问器可继续调用基类的自定义方法。六、与其他模块的协同与渲染语义校验体系ParticleFieldKernelBaseAPI的存在意义在于让usdVol的校验器能够强制要求一个合法的 ParticleField 必须带有内核定义。所有三种内核模式都自动应用该基类因此校验逻辑可以统一针对基类编写。渲染器消费内核描述的是粒子在空间中的权重分布渲染器需要把每个粒子实例化为上述平面椭圆高斯盘并按粒子不透明度 × 高斯衰减合成贡献。3-sigma 半径 3 的约定为渲染器的求交、裁剪和排序提供了明确的支撑范围上界。与具体类型的关系仓库中已有的具体类型ParticleField3DGaussianSplat直接内置应用了ParticleFieldKernelGaussianEllipsoidAPI见 generatedSchema.usda而ParticleFieldKernelGaussianSurfletAPI作为独立的可应用模式适合在自定义ParticleField派生类型或需要平面片式内核如某些光场/轻场表示时手工prepend应用。文档来源本模式的用户文档由genSchemaDocs从 schema 源码自动生成文档头部标注 THIS FILE IS GENERATED BY genSchemaDocs. DO NOT EDIT.原始定义与 doc 字符串位于 schema.usdausdVol模块的整体介绍与粒子场工作流说明可参见 overview.md。七、小结ParticleFieldKernelGaussianSurfletAPI是 OpenUSDusdVol为粒子场提供的三类内核模式中的平面高斯选项数学本质标准差为 1 的高斯函数定义在局部 XY 平面上支撑为半径 3 的圆盘3-sigma 覆盖 99.7%平面外不透明度为 0。实例化规则粒子不透明度与高斯衰减相乘方向与缩放把圆盘变为任意朝向的平面椭圆位置移动峰值中心。工程定位single-apply API 模式仅可应用到ParticleField自动携带ParticleFieldKernelBaseAPI与GaussianEllipsoidAPI三维高斯球、ConstantSurfletAPI半径 1 的均匀硬边圆盘互补共同构成可校验、可扩展的粒子场内核体系。无论你是要在自定义粒子场技术上接入 USD还是想理解 3D Gaussian Splats 相关模式的内部约定掌握该模式的数学定义与应用方式都是关键的第一步。【免费下载链接】OpenUSDUniversal Scene Description项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSD创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考