fVDB-Reality-Capture Version History
Version 0.5.0 - July 1, 2026
23 commits, 100+ files changed, 7 contributors.
This release tracks fVDB 0.5.0. It catches up to fVDB-core’s new composable camera and batched-image APIs, adds dense depth supervision for Gaussian splat reconstruction, reworks Gaussian splat USD export onto the OpenUSD ParticleField3DGaussianSplat standard, moves documentation to a versioned Read the Docs site, switches to the upstream PyCOLMAP, and hardens the release/CI pipeline and repository governance across the fVDB repositories.
Highlights:
Reworked Gaussian splat reconstruction on top of fVDB-core’s new camera/render API (fVDB-core #518), cleaning up how reality-capture represents cameras, distortion, and world-space render behavior.
Added a
DepthMapAttributefor per-image depth rasters and wired optional dense depth supervision intoGaussianSplatReconstruction.Reworked Gaussian splat USD export onto the OpenUSD
ParticleField3DGaussianSplatschema (Isaac Sim 6.0+), defaulting to single-file.usdcoutput with opt-in.usdz, and expandedfrgs convertwith mesh embedding, upright rotation, and prim-naming options for Isaac Sim.Fixed a scene-normalization bug that inverted camera matrices, and a TSDF meshing crash caused by fVDB-core’s move to a batched depth-image API.
Switched COLMAP dependency management to the official PyCOLMAP repository and synced the benchmark environment to PyTorch 2.11.
Migrated documentation to a versioned Read the Docs site.
Split
CODEOWNERSinto two review tiers (NVIDIA sign-off for governance/CI files) and fixed the CI change-detection gate for docs-only PRs, kept consistent with fvdb-core and fvdb-examples.
Contributors: @harrism, @matthewdcong, @swahtz, @fwilliams, @dylan-eustice, @phapalova, @zlalena
Reconstruction & Gaussian Splatting
New Features:
Reworked Gaussian splat reconstruction to support world-space rendering on top of fVDB-core’s new composable camera/render API (fVDB-core #518), cleaning up how reality-capture represents cameras, distortion models, and render-time camera behavior (#253 - @fwilliams).
Added
DepthMapAttribute, a per-image depth-raster attribute with scale-aware (metric vs. relative) semantics, and wired optional dense depth supervision intoGaussianSplatReconstruction(#288 - @fwilliams).
Bug Fixes:
Fixed a crash when
accumulated_gradient_step_countsisNoneduring Gaussian splat refinement (#281 - @harrism).Fixed performance regressions with pinhole camera models introduced by the camera-model rework (#280 - @matthewdcong).
Structure-from-Motion & Scene Handling
Fixed scene normalization storing a reference to
camera_to_world_matricesinstead ofworld_to_camera_matrices, which inverted the transform passed to similarity normalization and produced an incorrect scene scale (#285 - @matthewdcong).
Mesh Reconstruction (TSDF Fusion)
Fixed a crash in
mesh_from_splats/tsdf_from_splats/tsdf_from_splats_dlnrcaused by fVDB-core’s move to a batched depth-image API, realigning reality-capture with fVDB-core main (#292 - @dylan-eustice).
USD Export & Isaac Sim Integration
New Features:
Reworked Gaussian splat USD export onto the OpenUSD
UsdVol.ParticleField3DGaussianSplatschema (Isaac Sim 6.0+), and defaulted exports to a single self-contained.usdcfile with.usdzarchive packaging available opt-in. The legacy Omniverse NuRec format (UsdVol.Volume+.nurec) is retained behind alegacy/--legacyflag for Isaac Sim versions prior to 6.0. This renames the export entry points fromexport_splats_to_usdz/GaussianSplatReconstruction.save_usdztoexport_splats_to_usd/save_usd(taking ausdzflag), a breaking API change (#294 - @zlalena, @swahtz).Extended
frgs convertto export USD (.usdc/.usdz) with optional collision-mesh embedding, ecef2enu upright rotation for Isaac Sim, a customizable asset prim name (--prim-path), and legacy-format selection (--legacy) (#294 - @zlalena, @swahtz).Overhauled
scripts/create_isaac_ready_files.pyto produce a single aligned mesh + splat Isaac-ready asset, with optional bounding-box cropping, origin centering, and watertight mesh conversion, and addedtests/unit/test_export_splats_to_usd.pycovering.usdc/.usdzwrite/read round-trips (#294 - @zlalena, @swahtz).
Bug Fixes:
Hardened degenerate cases in USD export: zero-norm quaternions no longer produce NaN/Inf orientations, empty gaussian/mesh sets fail fast with clear errors (falling back to mesh-only export when a crop removes all splats), and shN/SH-degree coefficient-count mismatches now emit a warning instead of silently padding or truncating (#294 - @zlalena, @swahtz).
PyTorch & Dependency Compatibility
Switched from a fork to the official PyCOLMAP repository for the COLMAP dependency, and fixed a PyCOLMAP version mismatch that was failing nightly tests (#293, #297 - @matthewdcong).
Synced the benchmark environment to PyTorch 2.11 to match the fVDB-core build (#296 - @harrism).
Raised the minimum
usd-coreto>=26.3forParticleField3DGaussianSplatschema support (#294 - @zlalena, @swahtz).
Documentation
Migrated documentation to a versioned Read the Docs site (#284 - @swahtz).
Added a notebook showing how to create a COLMAP dataset for use in fVDB-Reality-Capture (#268 - @zlalena).
Fixed installation instructions: removed the outdated
editor_forceflag and updated the referenced fVDB-core version (#290, #275 - @phapalova, @harrism).
Benchmarks & Nightly CI
Updated the nightly benchmark to PyTorch 2.10 / CUDA 13.0 (later synced to 2.11) (#272 - @harrism).
Fixed a nightly benchmark artifact-download
JSONDecodeError(#278 - @harrism).
CI / DevOps / Governance
Decoupled the PyPI and S3 publish targets so both run on every release, replacing the mutually-exclusive
s3flag with independent routing flags (#267 - @swahtz).Added an event-driven issue-triage labels workflow and hardened its team-membership check (#274, #276 - @harrism).
Split
CODEOWNERSinto two review tiers — general code reviewable by any maintainer, while governance, legal, and CI/CD files require an NVIDIA maintainer — and added the governance docs (MAINTAINERS.md,CODE_OF_CONDUCT.md,CONTRIBUTING.md). Kept identical acrossfvdb-core,fvdb-reality-capture, andfvdb-examples(#298 - @harrism).Fixed required status checks being skipped (and permanently blocking) on docs-only PRs, and corrected the change-detection gate so docs-only PRs skip cleanly while code and mixed PRs still run tests (#299, #300 - @harrism).
Version 0.4.0 - March 14, 2026
55 commits, 92 files changed, 7 contributors.
This release focuses on Gaussian splatting quality and performance, foundation-model integrations for segmentation and open-vocabulary workflows, a major overhaul of the comparative benchmarking system, and the project’s first automated publish/release pipeline.
Highlights:
Gaussian splatting gains a new MCMC-based optimizer and sparse depth regularization, alongside an extensible custom-attribute system for
SfmScenethat lets downstream projects (GARfVDB, LangSplatV2) attach typed per-point/per-image/per-camera data that propagates automatically through the transform pipeline.New foundation-model wrappers — OpenCLIP, SAM1, and multi-scale SAM2 mask generation — bring open-vocabulary and segmentation support to the reconstruction pipeline.
Gaussian splat training gets faster: Morton-ordered Gaussian storage improves spatial locality for an 8-10% speedup, and broadcasting appended optimizer state saves ~200ms per iteration on multi-GPU runs.
The comparative benchmark system was overhauled with matrix-based configuration, GPU memory tracking, time-series metric plots, and a new nightly job that trains fVDB against GSplat side-by-side on MipNeRF360 scenes.
Shipped the first automated
publish.ymlworkflow: wheel builds, S3 staging, and PyPI publication with GPU validation smoke tests, plus numerous SfM/COLMAP loader correctness fixes and NVIDIA-branded documentation.
Contributors: @diz-vara, @eh-dub, @fwilliams, @harrism, @matthewdcong, @NotMorven, @swahtz
Gaussian Splatting & Optimization
New Features:
Added a Markov Chain Monte Carlo (MCMC) optimizer for Gaussian splat radiance field reconstruction, along with a refactored optimizer registration and deserialization system for extensibility (#214 - @fwilliams, @harrism).
Added sparse depth regularization, applying a simple L1 loss against sparse depth supervision during Gaussian splat training (#188 - @fwilliams).
Optimizations:
Reordered Gaussian storage using Morton (Z-order) codes to preserve spatial locality as Gaussians are refined and appended, yielding an 8-10% training speedup (#233 - @matthewdcong).
Reduced Gaussian splat optimizer overhead by broadcasting appended parameter tensors instead of allocating and filling large zero tensors, saving roughly 200ms per optimizer iteration on multi-GPU reconstructions (#248 - @matthewdcong).
Bug Fixes:
Fixed dataloader overhead, progress-bar accuracy, and cache-path handling when restarting Gaussian splat training from a checkpoint (#159, #166, #202 - @matthewdcong).
Fixed GSplat config parameters not being passed through to
simple_trainer.py(#236 - @harrism).Fixed a
NameErrorfortraining_imagesinrun_gsplat_training.py(#247 - @harrism).
SfM / COLMAP Dataset
Added an extensible, pluggable custom-attribute system for
SfmScene, letting downstream projects register typed per-point, per-image, and per-camera data that automatically propagates through the transform pipeline — filtering, spatial transforms, image downsampling, and cropping (#245 - @fwilliams).Fixed a
SfmCameraMetadata/downsample interaction bug where undistorted (rather than original) image dimensions and intrinsics were serialized, risking double application of undistortion on deserialization (#228 - @swahtz).Added downsampling and caching of SfM masks, reusing cached masks on subsequent loads (#219 - @diz-vara).
Fixed handling of images with empty
point_indices, which previously failed to load correctly (#220 - @diz-vara).Fixed COLMAP
images.txtloading to handle images with empty feature points (#177 - @NotMorven).
Foundation Models
Added an
OpenCLIPModelwrapper for encoding images and text into a shared embedding space via OpenCLIP (#231 - @swahtz).Added a
SAM1Modelwrapper providing an interface consistent withSAM2Model, for parity with LangSplatV2-style experiments (#242 - @swahtz).Extended
SAM2Modelwith multi-scale mask generation, supporting both the original flat mask mode and SAM2’s native small/medium/large mask semantics used by LangSplatV2 (#239 - @swahtz).
Benchmarking
Added a nightly comparative benchmark job that trains fVDB and GSplat side-by-side on MipNeRF360 scenes (garden, bonsai, bicycle), tracking PSNR/SSIM and training time/peak memory for regression detection (#240 - @harrism).
Overhauled the comparative benchmark system with a matrix-based
matrix.ymlconfiguration (replacing separate--config/--opt-configsflags), GPU memory tracking, and support for comparing specific commits (#226, #235 - @harrism).Added nightly Gaussian splatting unit benchmarks and accompanying CI tests, plus throughput and time-series training-metric plots for comparison benchmarks (#164, #168, #225, #227 - @harrism).
Fixed numerous nightly-benchmark CI reliability issues: workflow triggering in forked repos, skipping runs with no new commits, stale local files, checkpoint/config layout drift, and worker-count sizing via
os.cpu_count()(#169, #171, #173, #209, #223, #232, #234 - @harrism).Fixed 3DGS unit benchmarks to match the updated checkpoint API (#162 - @harrism).
CI / Release Infrastructure
Added the project’s first automated publish workflow: builds a pure-Python wheel, stages it to S3 on
release/v*pushes, and publishes to PyPI/TestPyPI, with GPU validation smoke tests against fvdb-core and unit/benchmark contract tests (#258 - @harrism).Iterated on the publish workflow to fix wheel URL resolution, glob patterns, AWS credentials, and Rocky Linux 8 validation (#260, #262 - @harrism), and switched it to use
uvfor Python installation (#263, #264, #265 - @swahtz).Fixed CI runner action tokens and a unit-test job that wasn’t merging in fork-branch changes (#212, #229 - @swahtz).
Added an
aarch64workaround using theusd-exchangepackage in place ofusd-core, which lacks aarch64 binaries (#190 - @matthewdcong).
Documentation
Applied NVIDIA branding to the documentation site (#217 - @fwilliams).
Added Google Analytics to the documentation site and removed a stale
_Cppreference from the docs configuration (#160 - @fwilliams; #161 - @harrism).Fixed a typo in the sensor data loading tutorial and updated the demo notebook for the viewer’s scene-reset behavior (#174 - @eh-dub; #158 - @swahtz).
Added
AGENTS.mdwith guidance for AI coding agents working in the repository (#238 - @harrism).
Version 0.3.0 - October 24, 2025
163 commits, ~150 files changed, 8 contributors.
This is the initial public release of fVDB-Reality-Capture, a toolbox built on top of fVDB for turning multi-view captures into 3D Gaussian splat reconstructions, meshes, and other derived assets. The release establishes the core pipeline end-to-end: loading COLMAP/e57/simple-directory SfM captures into a common SfmScene representation, training and refining 3D Gaussian splats on fVDB’s GaussianSplat3d, extracting meshes via TSDF fusion, a frgs command-line tool, benchmarking utilities, foundation-model-assisted masking, and a full documentation and CI setup.
Highlights:
New
SfmScene/ColmapDatasetdata model for loading and transforming COLMAP, e57, and plain-directory captures, with a composable torchvision-style transform pipeline and an on-disk caching layer.A Gaussian splatting reconstruction pipeline built on fVDB’s
GaussianSplat3d, with a documented and optimizedGaussianSplatOptimizer(refinement, pose optimization, spatial chunking for large scenes) and checkpointing.Mesh reconstruction from trained splats via TSDF fusion, including a DLNR-based stereo-depth path and SAM2-based foundation-model masking for cleaner reconstructions.
PLY/USDZ export and S3 upload/download utilities, unified behind a single pip-installable
frgsCLI (download, reconstruct, convert, show-data, show, evaluate, mesh, mesh-dlnr).A benchmarking suite (end-to-end benchmark, Nsight profiling scripts, Dockerized CI runs) plus a full Sphinx/GitHub Pages documentation site with tutorials and notebooks.
Contributors: @fwilliams, @swahtz, @harrism, @matthewdcong, @bbartlett-nv, @zlalena, @vinegh4, @phapalova
COLMAP/SfM Dataset Loading
Rewrote the COLMAP dataset loader and introduced the
SfmScenedata model as the common representation for captures (@fwilliams).Added loading of SfM scenes from e57 scanner data, with follow-up fixes for robustness (#39, #41 - @fwilliams).
Added a loader for a simple directory of images, JSON camera poses, and a PLY point cloud (
SfmScene.from_simple_directory), including handling for datasets without image-to-point visibility mappings (#82 - @fwilliams).Added a torchvision-style composable transform pipeline for the reality-capture “battery” of transforms, plus a dedicated
TransformScenetransform for applying an arbitrary transform matrix (e.g. one saved in a checkpoint) to anSfmScene(@fwilliams; #142 - @swahtz).Added a better/self-contained caching API (
Cache, SQLite-backed) for derived dataset artifacts, replacing the earlierDatasetCache(@fwilliams).Fixed non-deterministic PCA in the COLMAP dataset loader caused by OpenBLAS, switching to MKL (@swahtz).
Fixed bugs found running against real-world (nvrobotics) and text-format COLMAP data, including correct step counting for batch size > 1 (#134, #135 - @fwilliams).
Unit tests added for
SfmSceneand transforms (#27 - @fwilliams), and a tutorial notebook forSfmScene(#139 - @fwilliams).Added support for e57/PLY safety-park and other example datasets, and an
miris_factoryexample dataset (#40, #82 - @fwilliams).
Gaussian Splatting Training & Optimization
New Features:
Migrated the reconstruction pipeline onto fVDB’s C++
GaussianSplat3dclass (from fvdb import GaussianSplat3d), replacing the project’s earlier Python-side Gaussian splat representation (@fwilliams).Refactored pose optimization and rewrote
GaussianSplatOptimizerwith documented, configurable refinement (splitting/duplication/deletion), percentile-based gradient pruning thresholds, and deferred pose optimization until after refinement completes (#66, #84 - @fwilliams).Added spatial chunking to
GaussianSplatReconstruction(nchunks/chunk_overlap_pct), splitting large scenes into overlapping crops that are reconstructed independently and merged back together (@fwilliams).Added functions to filter
GaussianSplat3dresults by mean, opacity, or scale (#98 - @swahtz).Rolled a self-contained PSNR and LPIPS implementation to remove the
torchmetricsdependency, then switched to SSIM/PSNR fromfvdb.utils.metrics(@fwilliams; #29 - @harrism).Renamed
SceneOptimizationRunnertoGaussianSplatReconstruction, reworked checkpointing to serializeSfmScenes directly, and promoted USDZ export to its own tool as part of a broader API/notebook overhaul (#96 - @fwilliams).Added a
frgs evaluatescript and anfrgs mesh/frgs mesh-dlnrextraction path built on the new checkpoint API (@fwilliams).
Optimizations:
Fixed a performance regression in the Gaussian splat loss computation (#137 - @matthewdcong).
Fused the L1/SSIM loss interpolation into a single
torch.lerpcall to cut memory bandwidth and temporary tensors (#85 - @matthewdcong).Deferred
loss.item()synchronization to a single point per iteration, improving training throughput (#144 - @matthewdcong).Reduced extra parameter copies during Gaussian refinement (duplication/splitting/deletion) to cut memory usage (#84 - @fwilliams).
Bug Fixes:
Fixed model checkpointing and restarting training from a checkpoint, including a
weights_only=Falseload failure under newer PyTorch (@fwilliams; #147 - @matthewdcong).Fixed a bug in Gaussian splat refinement shared with the gsplat/INRIA reference implementations that improves reconstruction quality (#84 - @fwilliams).
Fixed I/O and small numerical bugs found while running on Puerto Rico scene data and other real captures (@fwilliams; #134 - @fwilliams).
Fixed the training metric label in TensorBoard logging (@matthewdcong) and fixed
tensorboard add_images(#138 - @swahtz).
Mesh Reconstruction (TSDF Fusion)
Added mesh reconstruction from trained Gaussian splats via TSDF fusion (
_tsdf_from_splats.py/_mesh_from_splats.py, exposed asfrgs mesh) (@fwilliams).Added support for per-image weighting in TSDF fusion (@fwilliams) and extra meshing parameters for thresholding low-opacity background pixels and downsampling large images (#95 - @fwilliams).
Added a DLNR-based stereo-depth meshing path (
_tsdf_from_splats_dlnr.py,frgs mesh-dlnr) and made its depth baseline scale with per-image rendered depth rather than overall scene scale, making meshing robust across capture types (e.g. orbit vs. robot navigation vs. multi-scale captures) (#86 - @fwilliams).Added a foundation-models module with a SAM2 wrapper for mask-assisted meshing (@fwilliams, #87 - @swahtz).
Documented the TSDF/meshing algorithms in detail with attribution to the underlying papers (#90 - @fwilliams).
Command-Line Tools & I/O
Unified all Gaussian-splatting command-line utilities into a single pip-installable
frgsCLI (download, reconstruct, convert, show-data, show, evaluate, mesh, mesh-dlnr, points, resume) (#97 - @fwilliams).Added C++ PLY saving and extra metadata fields in exported PLY files (#37 - @fwilliams).
Added USDZ export from PLY and fixed its SH-coefficient data layout/reordering (#71, #143 - @swahtz).
Added S3 upload/download utilities and tests, and moved the S3 module to its proper package location (#69, #81, #33 - @harrism, @fwilliams).
Renamed the package from
fvdb_3dgs/fvdb_gs3dtofvdb_reality_captureand cleaned up the public import API into clearly scoped submodules (#45, #126 - @fwilliams).Added scripts for extracting geo-referenced orthomosaics and geotagged video frames (@bbartlett-nv).
Benchmarking
Added an end-to-end Gaussian splatting benchmark and a comparative 3D Gaussian Splatting benchmark suite (@harrism).
Added Nsight profiling scripts for comparing 3DGS performance (@harrism) and support for benchmarking across multiple configurations (#72 - @fwilliams).
Updated the benchmark Docker setup (CPM cache, paths) and fixed Docker benchmark path issues (#73, #78 - @harrism, @fwilliams).
Updated the comparison benchmark to track the latest fvdb-reality-capture API and repo layout (#34, #140 - @harrism).
Isaac Sim Integration
Added files/scripts for using fvdb-reality-capture data with Isaac Sim (#47 - @zlalena).
Documentation
Added a full Sphinx documentation site with GitHub Pages deployment, including numerous workflow iterations to get the docs build and custom-domain (CNAME) deployment working (#102, #105, #107-#111, #113-#120, #123, #150-#151 - @fwilliams).
Added tutorials and notebooks, including a “reconstruct Gaussian splats” walkthrough notebook and an
SfmScenetutorial (#96, #139 - @fwilliams).Wrote detailed documentation for
GaussianSplatOptimizer, TSDF mesh extraction, transforms, and thefrgstools (#84, #90, #121, #125, #131 - @fwilliams).Rewrote the top-level and Gaussian-splatting READMEs, and aligned install instructions with fvdb-core (#127, #148, #152, #155 - @fwilliams, @harrism, @swahtz), including a fix pointing the Gaussian splatting README at the correct conda environment (@vinegh4).
CI / DevOps / Packaging
Added the OpenVDB license and fVDB’s code-style GitHub Action (#1 - @swahtz), and a CODEOWNERS file (#32 - @harrism).
Added a CI unit-test GitHub Actions workflow and switched tests to the
pull_request_targettrigger (#80, #83 - @harrism, @swahtz).Converted the project to a
pyproject.toml-based package and dropped an unneeded dependency (#28 - @fwilliams).Added missing
requestsand editor dependencies (#154, #153 - @matthewdcong, @phapalova).Fixed CI build issues and bumped the release version to 0.3.0 (#100, #156 - @fwilliams).