Skip to content

Repository files navigation

USD 3DGS Plugins

OpenUSD file-format plugins that import 3D Gaussian Splatting assets as standard USD stages: open a trained .ply, a Niantic .spz, or a PlayCanvas .sog capture directly in usdview or any USD pipeline as OpenUSD 26.05's ParticleField3DGaussianSplat schema.

Imported Gaussian PLY in usdview

A Gaussian PLY imported by this plugin and displayed in usdview by a Hydra renderer that supports the OpenUSD particle-field Gaussian schema.

usdview screenshots

These previews show the three supported input formats displayed through the OpenUSD hdParticleField example delegate:

PLY SOG SPZ
PLY in usdview SOG in usdview SPZ in usdview

What it does

  • Read-only import of Graphdeco-style Gaussian PLY (ASCII and binary little-endian, SH degrees 0-3) into /Asset/Splat with positions, scales, orientations, opacities, and spherical-harmonic radiance.
  • Read-only import of Niantic SPZ (container versions 1-3, SH degrees 0-3), dequantized and converted into the same /Asset/Splat stage.
  • Read-only import of PlayCanvas SOG v2 (SH degrees 0-3) in both layouts — the bundled .sog ZIP archive and an unbundled meta.json with its companion lossless-WebP property planes — decoded from codebooks and image planes into the same stage. All three formats author the identical hierarchy, schema, and metadata through one shared writer.
  • Header-only metadata reads (~5 ms at any size), PLY import arguments (shDegree, opacityThreshold, scaleMultiplier), and stable GSPLY-**** / GSPZ-**** / GSSOG-**** diagnostics with machine-readable catalogs.
  • Import only — rendering is owned by the sibling project hydra-merlin.

What it reads

gaussian-ply — Graphdeco-style .ply:

Exporter Status
Graphdeco reference (INRIA) ✅ verified (Mip-NeRF 360 garden, 5.8M Gaussians)
Brush ✅ verified (committed CC0 corpus)
Jawset Postshot ✅ verified (up to 1.9M Gaussians)
SuperSplat uncompressed export ☑ layout-compatible, fixture-covered
SuperSplat compressed .ply, .splat, .ksplat ❌ rejected explicitly (details)

gaussian-spz — Niantic .spz:

Container Status
SPZ versions 1-3 (gzip) ✅ decoded, fixture-covered, and verified against a committed CC0 real-asset corpus
SPZ version 4 (ZSTD) ❌ rejected with a specific unsupported-version diagnostic

gaussian-sog — PlayCanvas .sog / meta.json:

Container Status
SOG v2, bundled .sog (ZIP) ✅ decoded, fixture-covered, and verified against a committed CC0 real-asset corpus
SOG v2, unbundled meta.json + .webp planes ✅ decoded through the asset resolver, fixture-covered
SOG v1 (per-channel mins/maxs, no version) ❌ rejected with a specific unsupported-version diagnostic
Streamed SOG (lod-meta.json, LOD chunks) ❌ not read; a later SOG milestone
Lossy WebP property planes ❌ rejected rather than decoded approximately

Full tables: dialect compatibility · capability matrix · performance baselines.

Quick start

Requirements: OpenUSD >=26.05,<27.0 and a C++17 compiler. Build and test with plain CMake against any OpenUSD 26.05 installation:

cmake --preset default -DCMAKE_PREFIX_PATH=/path/to/openusd
cmake --build --preset default
ctest --test-dir build/default --output-on-failure

The repo is dual-mode: with OpenStrata ost 0.20.0 the same tree gets the full verification ladder, packaging, and viewer tooling — see BUILDING.md:

ost runtime pull cy2026 --profile usd
ost plugin build plugins/gaussian-ply
ost plugin test plugins/gaussian-ply --up-to 5

Open a capture in usdview:

ost plugin view plugins\gaussian-ply "C:\path\to\scene.ply"

Seeing the splats needs a Gaussian-capable Hydra renderer. These plugins import; they do not render. Stock usdview opens the stage and shows the /Asset/Splat hierarchy and its attributes, but draws nothing, because no default Hydra delegate understands ParticleField3DGaussianSplat. For a visual preview today, use the OpenUSD hdParticleField example delegate — that is what the animation above shows. Production rendering is the job of the sibling project hydra-merlin.

Or convert it to a compact binary USD file:

ost plugin run plugins\gaussian-ply -- usdcat --flatten --skipSourceFileComment --usdFormat usdc --out scene.usd scene.ply

Installing a packaged release into an existing OpenUSD environment is covered in INSTALL.md.

Status

v0.5.0 — SOG v2 import — is released. (release record).

v0.4.0 turned the decoder-to-USD seam PLY and SPZ share into a normative, enforced contract: shared semantic validation and overflow-checked size math, a stage-free decoder test kit, an import-statistics seam, and a documented header/API boundary. It also corrected authored orientation to RUB / Y-up (ADR 0001) to match the upAxis every stage already declared; that is a pre-1.0 change to v0.1.0-v0.3.0 output, so re-import to update.

v0.5.0 is the first format added on top of that contract: gaussian-sog reads SOG v2 in both layouts, targets the shared model with no format-specific USD authoring, and joins the cross-format equivalence triples. Releases are tag-driven and digest-reproducible (release records).

Architecture

.ply       -> PlyReader (tinyPLY adapter)     -> GaussianPlyDecoder --+
.spz       -> SpzReader (miniz DEFLATE/gzip)  -> GaussianSpzDecoder --+
.sog    \                                                            |
         -> SogReader (miniz ZIP + libwebp    -> GaussianSogDecoder --+
meta.json/     lossless property planes)                             |
                                                                     v
                        GaussianCloudData (gaussianCore; no USD types)
                        -> GaussianLayerWriter (libs/gaussian-usd)
                        -> UsdVolParticleField3DGaussianSplat

The workspace separates format-independent Gaussian modelling (libs/gaussian-core) and shared USD authoring (libs/gaussian-usd) from format-specific import (plugins/gaussian-ply, plugins/gaussian-spz, plugins/gaussian-sog), each independently buildable and testable. It is built, tested, packaged, and released with OpenStrata's ost CLI (measured usage: dogfooding reports) and remains dual-mode with plain CMake. The sibling project usd-vrm-plugins shares this layout and process. Policy: DESIGN_POLICY.md.

Contributing and documentation

The minimal development path is in CONTRIBUTING.md; the documentation index is docs/README.md. The normative mapping contracts are PLY_MAPPING.md, SPZ_MAPPING.md, and SOG_MAPPING.md.

License

Project code is Apache-2.0. SPZ and SOG are implemented from their publishers' open specifications and MIT-licensed reference toolchains rather than vendored; only container mechanics use libraries. Third-party retained notices and fixed source revisions (tinyPLY, miniz, libwebp) are documented in THIRD_PARTY_NOTICES.md.

Releases

Packages

Contributors

Languages