You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Given an object with articulated (piecewise rigid) motion, construct a mesh of the swept volume.
A satisfying minimal viable product would be dense SDF stamping over time, possibly employing some of the early exit tricks that libigl uses.
It would be interesting to improve on this for more accurate, conservative and efficient swept volumes. Perhaps incorporating the spatial continuation root-finding ideas from " Swept Volumes via Spacetime Numerical Continuation".
SDF output should be ready to feed into the marching cubes (or better isosurfacenets) for meshing.
A meaningful high-level API, might take a list of meshes and corresponding list of rigid-motion functions over time and outputs a dense grid SDF.
The commit provides the dense time-stamping baseline requested here: evaluate the minimum signed distance over all meshes and sampled rigid poses, return a dense field, and extract a triangle mesh with marching cubes. The included example demonstrates a two-link articulated arm and can also load an animated USD assembly. Closing this issue as completed.
Public API behavior
In Python, warp.geometry.swept_volume_field(meshes, transforms, ...) returns (field, lower, upper). Supply pre-sampled rigid transforms instead of motion callbacks, and choose either voxel_size or resolution=(nx, ny, nz). The field can be passed directly to wp.MarchingCubes.extract_surface_marching_cubes() using the returned domain corners.
swept_volume_mesh() combines field evaluation and extraction; swept_volume_bounds() helps size a shared domain. The default winding-number classifier requires meshes constructed with support_winding_number=True; SweptVolumeSignMode selects alternatives.
swept_volume_sdf() evaluates individual points inside Warp kernels. The result is a pseudo signed-distance field: taking the minimum preserves the sampled unionâs sign and zero set, but does not generally give its exact interior distance. Autodiff is not supported.
Test coverage
New tests in warp/tests/geometry/test_swept_volume.py cover translating spheres (test_swept_sphere_is_a_capsule), multiple meshes (test_union_of_two_static_spheres), rotation (test_rotation_pose), and sampled-pose enclosure (test_conservative_encloses_all_poses), along with sign modes, grid sizing, explicit domains, and argument validation.
warp/tests/test_examples.py adds TestGeometryExamples.test_geometry.example_swept_volume for the articulated-arm example. Both new test classes are registered in the default suite.
Behavioral verification
All 48 swept-volume test cases passed across CPU and two CUDA devices, and the example smoke tests passed on CPU and CUDA. A separate two-link articulated-motion check matched an analytic reference over 20,677 grid nodes on CPU and CUDA; direct field extraction and swept_volume_mesh() produced matching closed meshes.
Follow-up to consider
Adaptive sampling, acceleration, and spacetime numerical continuation remain future work beyond the requested minimum viable implementation. Motion between supplied poses is not conservatively bounded, so temporal sampling still controls gaps and accuracy.
Activity
warp.geometrymodule #1826Use winding number for non-watertight swept volumes (NVIDIAGH-1824)
Address swept_volume review feedback (NVIDIAGH-1824)
Add swept-volume docs GIF and headless renderer (NVIDIAGH-1824)
Improve swept-volume docs GIF: fixed camera, dense grid (NVIDIAGH-1824)
Densify swept-volume GIF to ~1 min compute, alpha 0.8 (NVIDIAGH-1824)
Densify swept-volume GIF to 1800 poses, alpha 0.4 (NVIDIAGH-1824)
Tune swept-volume GIF envelope transparency to 0.6 (NVIDIAGH-1824)
Extract swept-volume GIF at conservative iso; document it (NVIDIAGH-1824
Add swept-volume MR summary draft (NVIDIAGH-1824)
Compute swept-volume bounds with Warp kernels, not NumPy (NVIDIAGH-1824)
Add Warp/libigl/SellÃĄn swept-volume comparison notes (NVIDIAGH-1824)
46 remaining items
Specify the grid the way marching cubes does (NVIDIAGH-1824)
Expose every sign mode through the example (NVIDIAGH-1824)
Describe the field as a pseudo signed distance (NVIDIAGH-1824)
Say what the returned mesh actually traces (NVIDIAGH-1824)
Tidy the swept-volume docs after review (NVIDIAGH-1824)
Follow Warp's naming and annotation conventions (NVIDIAGH-1824)
Reach the surface from an explicit domain (NVIDIAGH-1824)
Polish the swept-volume docstrings after review (NVIDIAGH-1824)
Name the extraction swept_volume_mesh() (NVIDIAGH-1824)
Add swept_volume to warp.geometry [NVIDIAGH-1824]
shi-eric commentedon Sep 11, 2026
This is addressed by f76830f.
The commit provides the dense time-stamping baseline requested here: evaluate the minimum signed distance over all meshes and sampled rigid poses, return a dense field, and extract a triangle mesh with marching cubes. The included example demonstrates a two-link articulated arm and can also load an animated USD assembly. Closing this issue as completed.
Public API behavior
warp.geometry.swept_volume_field(meshes, transforms, ...)returns(field, lower, upper). Supply pre-sampled rigid transforms instead of motion callbacks, and choose eithervoxel_sizeorresolution=(nx, ny, nz). The field can be passed directly towp.MarchingCubes.extract_surface_marching_cubes()using the returned domain corners.swept_volume_mesh()combines field evaluation and extraction;swept_volume_bounds()helps size a shared domain. The default winding-number classifier requires meshes constructed withsupport_winding_number=True;SweptVolumeSignModeselects alternatives.swept_volume_sdf()evaluates individual points inside Warp kernels. The result is a pseudo signed-distance field: taking the minimum preserves the sampled unionâs sign and zero set, but does not generally give its exact interior distance. Autodiff is not supported.Test coverage
warp/tests/geometry/test_swept_volume.pycover translating spheres (test_swept_sphere_is_a_capsule), multiple meshes (test_union_of_two_static_spheres), rotation (test_rotation_pose), and sampled-pose enclosure (test_conservative_encloses_all_poses), along with sign modes, grid sizing, explicit domains, and argument validation.warp/tests/test_examples.pyaddsTestGeometryExamples.test_geometry.example_swept_volumefor the articulated-arm example. Both new test classes are registered in the default suite.Behavioral verification
All 48 swept-volume test cases passed across CPU and two CUDA devices, and the example smoke tests passed on CPU and CUDA. A separate two-link articulated-motion check matched an analytic reference over 20,677 grid nodes on CPU and CUDA; direct field extraction and
swept_volume_mesh()produced matching closed meshes.Follow-up to consider
Recolor demo, add time-sample overlay, drop iso radios (NVIDIAGH-1824)
Replace time-sample overlay with an N/n skip button (NVIDIAGH-1824)
Regenerate demo data at 7200 temporal samples (NVIDIAGH-1824)