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
Implement OvPhysxSceneDataProvider for the OVPhysX backend, satisfying the BaseSceneDataProvider contract. Enables Newton-based visualizers (Rerun, Viser) to display OVPhysX simulations.
Scope
ovphysx_scene_data_provider.py (~400 lines)
Factory registration in scene_data_provider.py (~5 lines)
Build Newton model from USD for visualization (share code with PhysX approach)
Sync ovphysx body transforms into Newton state on each update
No OVPhysX API Blockers
Uses existing body transform bindings. No new ovphysx APIs needed.
Implement OvPhysxSceneDataProvider for the OVPhysX backend, satisfying the BaseSceneDataProvider contract. This enables Newton-based visualizers (Rerun, Viser) to display OVPhysX simulations by providing body transforms and metadata.
The OVPhysX approach is closer to Newton's implementation (delegation to physics manager) than PhysX's (which builds its own Newton model from USD). OVPhysX has direct access to body transforms via TensorBindings and does not need Kit/Fabric.
Like Newton: The physics engine is the source of truth for transforms (no Kit/Fabric layer)
Unlike Newton: OVPhysX doesn't have a native Newton model — it uses PhysX underneath
Like PhysX: It may need to build a Newton model from USD for visualization
Recommended approach: Follow PhysX's pattern — build a Newton model from the USD stage at initialization, then sync OVPhysX body transforms into Newton state on each update() call. This enables all Newton-based visualizers without requiring changes to the visualizer stack.
ovphysx_scene_data_provider.py:
__init__(stage, sim_context):
Store references to USD stage and OvPhysxManager
Lazy-build Newton model on first access
update(env_ids):
Read body transforms from ovphysx TensorBindings
Write transforms into Newton model state
For partial updates, only sync requested env_ids
get_newton_model():
Build Newton model from USD if not yet built (same as PhysX approach)
Return cached model
get_newton_state(env_ids):
Return Newton state (synced in update())
Filter for env_ids if specified
get_transforms():
Read body poses from ovphysx bindings
Return as {"positions": ..., "orientations": ...} dict
get_velocities():
Read body velocities from ovphysx bindings
Return as {"linear": ..., "angular": ...} dict
get_usd_stage():
Return the USD stage handle (OVPhysX loads from USD, so stage is available)
Summary
Implement
OvPhysxSceneDataProviderfor the OVPhysX backend, satisfying theBaseSceneDataProvidercontract. Enables Newton-based visualizers (Rerun, Viser) to display OVPhysX simulations.Scope
ovphysx_scene_data_provider.py(~400 lines)scene_data_provider.py(~5 lines)No OVPhysX API Blockers
Uses existing body transform bindings. No new ovphysx APIs needed.
Dependencies
Spec
Full design spec:
docs/superpowers/specs/2026-04-20-ovphysx-scene-data-provider-design.mdParent issue: #5315
📋 Full Design Spec (click to expand)
OVPhysX SceneDataProvider — Design Spec
Issue: Needs creation — [OVPHYSX] SceneDataProvider
Date: 2026-04-20
Status: Draft
Summary
Implement
OvPhysxSceneDataProviderfor the OVPhysX backend, satisfying theBaseSceneDataProvidercontract. This enables Newton-based visualizers (Rerun, Viser) to display OVPhysX simulations by providing body transforms and metadata.The OVPhysX approach is closer to Newton's implementation (delegation to physics manager) than PhysX's (which builds its own Newton model from USD). OVPhysX has direct access to body transforms via TensorBindings and does not need Kit/Fabric.
Contract to Satisfy
BaseSceneDataProvider (source/isaaclab/isaaclab/physics/base_scene_data_provider.py)
update(env_ids: list[int] | None) -> Noneget_newton_model() -> Any | Noneget_newton_state(env_ids) -> Any | Noneget_usd_stage() -> Any | Noneget_metadata() -> dict[str, Any]get_transforms() -> dict[str, Any] | Noneget_velocities() -> dict[str, Any] | Noneget_contacts() -> dict[str, Any] | Noneget_camera_transforms() -> dict[str, Any] | NoneArchitecture
File Layout
Implementation Approach
OVPhysX's situation is unique:
Recommended approach: Follow PhysX's pattern — build a Newton model from the USD stage at initialization, then sync OVPhysX body transforms into Newton state on each
update()call. This enables all Newton-based visualizers without requiring changes to the visualizer stack.ovphysx_scene_data_provider.py:
__init__(stage, sim_context):update(env_ids):get_newton_model():get_newton_state(env_ids):update())get_transforms():{"positions": ..., "orientations": ...}dictget_velocities():{"linear": ..., "angular": ...}dictget_usd_stage():get_metadata():{"physics_backend": "ovphysx", "num_envs": N}get_contacts()/get_camera_transforms():OVPhysX API Requirements
No new ovphysx APIs needed for the core implementation.
Newton Model Building
The Newton model building logic can be shared with PhysX's implementation:
ModelBuilderto construct from USDConsider extracting the Newton model building code from
PhysxSceneDataProviderinto a shared utility if significant code overlap exists.Factory Registration
Add
"ovphysx"to the factory dispatch insource/isaaclab/isaaclab/physics/scene_data_provider.py:Also update
source/isaaclab/isaaclab/utils/backend_utils.pyif needed.Tests
No existing SceneDataProvider tests to copy. Write basic tests:
get_metadata()returns correct backend nameget_transforms()returns valid body poses after simulation stepsupdate()syncs transforms correctlyDependencies
Estimated Scope
ovphysx_scene_data_provider.py: ~400 lines