Omniverse Realtime Viewer
NVIDIAOfficialCreated by NVIDIA Omniverse
- Skill
- Tool integration
- Software development
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The Omniverse Realtime Viewer skill acts as a central routing and architectural framework for developing USD-based 3D viewer applications. It provides a structured approach to composing rendering, scene state, and delivery mechanisms, ensuring that developers can integrate OVRTX rendering, OVStage scene management, and various UI or streaming adapters effectively. The skill emphasizes a modular architecture where the viewer runtime, UI/input adapters, and delivery systems are decoupled, allowing for consistent behavior across local and streamed environments.
What it does
- Provides a routing architecture for USD viewer apps, XR delivery, and GPU-accelerated rendering.
- Defines the separation of concerns between viewer runtime, UI adapters, and delivery systems.
- Offers guidance on integrating OVRTX for high-fidelity 3D rendering.
- Establishes conventions for camera interaction, scene state management, and input handling.
- Supports the implementation of specialized features like stylized rendering and CAE/CFD visualization.
- Provides protocols for agent-to-UI communication and scene control.
When to use it
- When starting the development of a new USD-based realtime viewer application.
- When integrating advanced rendering features like stylized visualization or AOV switching.
- When building XR or spatial editing capabilities into an existing Omniverse application.
- When you need to standardize the architecture for local and streamed viewer deployments.
- When implementing chat-driven scene control or agent-based inspection of a 3D scene.
Advantages
- Promotes a clean, modular architecture that separates rendering logic from UI and transport.
- Ensures consistent behavior across different delivery methods, such as local windows or WebRTC streaming.
- Provides clear paths for extending functionality without disrupting the core viewer runtime.
- Facilitates the integration of complex simulation and visualization data into the viewer.
- Standardizes conventions for scene state, selection, and camera control.
Usage examples
- “How do I set up a basic USD viewer application using the Omniverse Realtime Viewer architecture?”
- The agent will guide you to start with the viewer app reference, resolve dependencies, and implement the core runtime owner to manage the OVStage and OVRTX renderer.
- “I need to add stylized rendering to my existing viewer. Where should I start?”
- The agent will direct you to the stylized visualization references to implement the required USD/Lua/CUDA nodes within your existing runtime owner.
- “How can I enable an AI agent to control the viewer scene?”
- The agent will point to the A2UI Scene Copilot reference to implement an operation interface that allows the agent to send commands through the existing runtime owner.
- “How do I switch between different render outputs like beauty and depth in my viewer?”
- The agent will explain how to use the AOV switching reference to map RenderVars and update the RenderProduct's orderedVars through the runtime owner.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/nvidia/omniverse-realtime-viewer/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip omniverse-realtime-viewer.zip -d .agents/skills
Documentation by NVIDIA Omniverse
<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
Omniverse Realtime Viewer
Build responsive USD viewers by composing OVRTX rendering, OVStage scene state, and the delivery/UI libraries appropriate to the app. Use this package for viewer architecture and interaction; use each selected SDK's upstream guidance for installation and exact release-specific APIs.
Start With The App
When delivery is explicit, select its recipe through
references/routing.mdand follow its current phase. Otherwise start withreferences/usd-viewer-app/README.md. For an existing app, keep its architecture and read only the references for the requested change. Broad app, conventions and UI catalogs are lookups as needed.Resolve the selected libraries through
references/dependencies/README.md. Preserve the project's manifest unless an upgrade is requested.Build a working frame and camera interaction in the chosen shell, then add the requested capabilities. Read
references/conventions.mdfor shared input, camera, selection, and protocol conventions.Use
references/viewer-ux-workflow/README.mdfor broader interface design. Loading, selection feedback, errors, and input responsiveness belong in the first working app, alongside rendering.Validate the actual delivery path with
references/validation.md. A browser screenshot does not validate a native window or a different transport.
Architecture
| Owner | Responsibility |
|---|---|
| Viewer runtime | Own the live OVStage, publication clock, OVRTX renderer, scene changes, and render stepping. |
| UI and input adapter | Display frames and copied app state; send user intent to the runtime owner. |
| Storage/query/simulation workers | Perform their assigned work and return results through the selected integration boundary. |
| Delivery adapter | Present locally or stream through ovstream; respect frame ownership and backpressure. |
Use OVRTX for USD/3D rendering. Browser apps display its WebRTC video; local apps present its output through their native shell. A missing GPU means rendering is unverified, not a reason to substitute a browser 3D renderer.
Keep viewer cameras, settings, effects, and transient edits in app-owned session
or runtime state so the source USD stays intact. Serialize scene mutation and
render stepping through the runtime owner. Read
references/ovstage-ovrtx-integration/README.md for that loop, then the population
or data-plane references when implementing scene loading or attribute writes.
Keep expensive loading and metadata work off the UI and render threads. Keep transport details behind a delivery adapter so camera, selection, properties, and loading state can be reused across local and streamed shells.
Add Capabilities As Needed
Use references/routing.md to select camera/picking, scene management, render
settings, cloud assets, simulation, editor tools, deployment, or CAE/CFD
visualization. Read the selected capability's implementation flow and its linked
contract; the full reference catalog is not a prerequisite for a first frame.
For simulation, use the routing reference's Simulation Ecosystem section plus
references/realtime-sim-integration/README.md. For UI-driven forces or control,
add references/interaction-round-trip/README.md.
For example scenes, use references/usd-sample-data/README.md. When a runtime
failure needs diagnosis, use references/troubleshooting/README.md and the
selected SDK's matching release guidance before changing the architecture.
Solid Modeling: Upstream First
For usd-brep, exact BRep, solid modeling, kernel failures, CAD topology, or
BrepArray questions, first read references/dependencies/README.md → USD BRep. Follow the
owning repository's current agent guidance, skills, operation docs, and package
API before selecting local integration references. Discover the upstream router
rather than assuming skill names or directory layouts remain fixed. Upstream
owns modeling semantics, schema rules, tuning, and diagnostics; this package
owns OVRTX display, worker handoff, selection mapping, and publication timing.
GPU Processing And Stylized Viewers
For custom GPU processing, chained outputs and lens sampling, read
references/spg-processing/README.md. For toon, ink, technical/X-Ray styles,
geometry strokes or full wireframe, continue to
references/stylized-visualization/implementation.md. Its USD/Lua/CUDA starting
node and geometry/depth/composite build sequence work with the selected viewer
recipe; use references/stylized-visualization/style-recipes.md for the preset
math and references/stylized-visualization/README.md for supporting contracts.
Implement the result inside the existing OVRTX/runtime owner and deliver the
published processed output. These instructions do not require a sample checkout
or a prior stylized-rendering implementation.
For an optional usd-brep geometry source, first read
references/dependencies/README.md → USD BRep and the owning repository's
current agent guidance, skills, and operation docs; then read
references/stylized-visualization/usd-brep-source.md for the display boundary.
XR Viewers
For headsets, immersive viewers, or spatial editors, start with
references/xr-viewer-recipe/README.md. Resolve SDK setup and contracts through
references/dependencies/ovxr.md; the library owns OpenXR lifecycle and frame
submission. For controllers, hands, navigation, or scene tools, add
references/xr-spatial-input/README.md and
references/ovxr-python-interactions/README.md. For projection-integrated UI,
read references/ovxr-composition-ui/README.md and
references/ovxr-composition-ui-validation/README.md.
Files
- ATTRIBUTION.mdAdded by AutoGineer943 B
- BENCHMARK.md13.4 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md6.4 KiB
- evals/evals.json7.0 KiB
- references/a2ui-scene-copilot/README.md10.9 KiB
- references/aov-switching/README.md10.5 KiB
- references/cae-cfd-visualization/README.md10.1 KiB
- references/cae-cfd-visualization/cae-data-ingestion.md5.6 KiB
- references/cae-cfd-visualization/coordinate-systems-and-up-axis.md11.0 KiB
- references/cae-cfd-visualization/data-and-operators.md11.7 KiB
- references/cae-cfd-visualization/driving-cae-viz-via-ovstage.md6.4 KiB
- references/cae-cfd-visualization/emitter-and-seed-sources.md16.3 KiB
- references/cae-cfd-visualization/glyphs.md7.1 KiB
- references/cae-cfd-visualization/ovstage-render-and-camera.md11.0 KiB
- references/cae-cfd-visualization/ovui-controls.md13.2 KiB
- references/cae-cfd-visualization/rtwt-blueprint-recreation.md11.9 KiB
- references/cae-cfd-visualization/streaming-cae-viewer.md25.9 KiB
- references/cae-cfd-visualization/temporal-playback.md9.2 KiB
- references/cae-cfd-visualization/usd-authoring-and-materials.md21.5 KiB
- references/cae-cfd-visualization/volume-rendering.md2.5 KiB
- references/camera-auto-select/README.md9.0 KiB
- references/camera-controls/README.md20.9 KiB
- references/camera-picker/README.md9.5 KiB
- references/cloud-assets/README.md4.5 KiB
- references/cloud-deployment/README.md19.6 KiB
- references/cloud-deployment/container-image-build.md2.2 KiB
- references/cloud-deployment/gpu-container-runtime.md2.8 KiB
- references/cloud-deployment/nvcf-self-hosted.md8.4 KiB
- references/cloud-deployment/nvcf-viewer-container-contract.md4.8 KiB
- references/cloud-deployment/webrtc-network-diagnostics.md3.9 KiB
- references/cloudxr-opaque-data-channel/README.md1.1 KiB
- references/conventions.md7.4 KiB
- references/cpp-native-viewer/README.md4.9 KiB
- references/cpp-native-viewer/build-details.md5.2 KiB
- references/cpp-native-viewer/interaction-features.md11.3 KiB
- references/cpp-native-viewer/presentation-loop.md8.0 KiB
- references/cpp-native-viewer/project-build.md3.4 KiB
- references/cpp-native-viewer/renderer-session.md7.1 KiB
- references/cpp-native-viewer/validation.md3.4 KiB
- references/dependencies/README.md6.8 KiB
- references/dependencies/electron-shm.md1.5 KiB
- references/dependencies/environment-validation.md6.6 KiB
- references/dependencies/frontend.md2.3 KiB
- references/dependencies/local-openusd-gpu.md8.7 KiB
- references/dependencies/nvidia-runtime.md14.8 KiB
- references/dependencies/ovrtx.md3.1 KiB
- references/dependencies/ovstream.md3.3 KiB
- references/dependencies/ovxr.md2.3 KiB
- references/dependencies/quick-setup.md2.6 KiB
- references/dependencies/skia-yoga.md936 B
- references/electron-shm-viewer/README.md2.5 KiB
- references/electron-shm-viewer/architecture-project.md6.3 KiB
- references/electron-shm-viewer/electron-client.md6.5 KiB
- references/electron-shm-viewer/protocol-interaction-lifecycle.md7.9 KiB
- references/electron-shm-viewer/python-shm-server.md5.5 KiB
- references/electron-shm-viewer/validation.md2.8 KiB
- references/exact-brep-in-usd/README.md2.5 KiB
- references/gl-viewport-overlay/README.md8.0 KiB
- references/gl-viewport-overlay/architecture.md4.1 KiB
- references/gl-viewport-overlay/example-gizmo.md5.5 KiB
- references/gl-viewport-overlay/interaction-pattern.md4.0 KiB
- references/gl-viewport-overlay/projection-alignment.md4.3 KiB
- references/headless-shm-cli/README.md12.3 KiB
- references/huggingface-usd/README.md7.7 KiB
- references/interaction-round-trip/README.md40.1 KiB
- references/local-viewer/README.md17.8 KiB
- references/native-picking-selection/README.md13.1 KiB
- references/navigation-presets/README.md4.6 KiB
- references/navigation-presets/preset-camera-ops.md5.1 KiB
- references/newton-physics/README.md8.8 KiB
- references/object-selection/README.md11.1 KiB
- references/ovrtx-rendering/README.md23.0 KiB
- references/ovstage-data-plane/README.md3.5 KiB
- references/ovstage-live-geometry/README.md3.3 KiB
- references/ovstage-ovrtx-integration/README.md5.0 KiB
- references/ovstage-population/README.md3.7 KiB
- references/ovstage-runtime/README.md3.1 KiB
- references/ovui-library/README.md3.3 KiB
- references/ovui-library/api-reference.md4.3 KiB
- references/ovui-library/extending.md4.8 KiB
- references/ovui-local-viewer-recipe/README.md4.7 KiB
- references/ovui-local-viewer-recipe/interaction-features.md16.9 KiB
- references/ovui-local-viewer-recipe/project-structure.md6.2 KiB
- references/ovui-local-viewer-recipe/setup-shell-renderer.md16.4 KiB
- references/ovui-local-viewer-recipe/validation-build-order.md6.1 KiB
- references/ovwidgets-editor-shell/README.md5.4 KiB
- references/ovxr-composition-ui-validation/README.md7.1 KiB
- references/ovxr-composition-ui-validation/evidence-gates.md3.5 KiB
- references/ovxr-composition-ui-validation/frustum-placement.md2.4 KiB
- references/ovxr-composition-ui-validation/library-only-validation.md8.1 KiB
- references/ovxr-composition-ui-validation/owned-orchestration.md5.3 KiB
- references/ovxr-composition-ui-validation/viewer-evidence.md4.0 KiB
- references/ovxr-composition-ui/README.md8.5 KiB
- references/ovxr-composition-ui/async-raster-pipeline.md5.0 KiB
- references/ovxr-composition-ui/compositor-passes-and-sync.md6.4 KiB
- references/ovxr-composition-ui/depth-tools.md5.0 KiB
- references/ovxr-composition-ui/editor-document-model.md4.8 KiB
- references/ovxr-composition-ui/experience-quality.md8.5 KiB
- references/ovxr-composition-ui/foveation-and-edge-math.md3.5 KiB
- references/ovxr-composition-ui/library-only-compositor.md10.4 KiB
- references/ovxr-composition-ui/native-build-and-discovery.md4.6 KiB
- references/ovxr-composition-ui/performance-and-telemetry.md7.9 KiB
- references/ovxr-composition-ui/primary-projection-compositor.md3.5 KiB
- references/ovxr-composition-ui/primary-projection.md4.1 KiB
- references/ovxr-composition-ui/projection-and-depth.md5.3 KiB
- references/ovxr-composition-ui/raster-abi.md3.0 KiB
- references/ovxr-composition-ui/sdk-frame-backend.md1.6 KiB
- references/ovxr-composition-ui/skia-yoga.md2.8 KiB
- references/ovxr-composition-ui/spatial-interaction.md5.6 KiB
- references/ovxr-composition-ui/spatial-surfaces-and-interaction.md10.4 KiB
- references/ovxr-composition-ui/telemetry-contract.md3.8 KiB
- references/ovxr-composition-ui/validation-and-live-gates.md3.9 KiB
- references/ovxr-foveation-and-display/README.md1.1 KiB
- references/ovxr-frame-loop-and-readback/README.md1.2 KiB
- references/ovxr-library-runtime/README.md1.1 KiB
- references/ovxr-library-runtime/ar-compositing.md4.4 KiB
- references/ovxr-library-runtime/frame-input-order.md2.2 KiB
- references/ovxr-library-runtime/library-only.md1.1 KiB
- references/ovxr-library-runtime/live-ar-controls.md4.3 KiB
- references/ovxr-library-runtime/mirror-lifetime.md4.1 KiB
- references/ovxr-library-runtime/settings-and-lifetime.md3.9 KiB
- references/ovxr-library-runtime/viewer-assembly.md225 B
- references/ovxr-openxr-runtime/README.md1012 B
- references/ovxr-python-interactions/README.md1.8 KiB
- references/ovxr-python-interactions/architecture.md5.5 KiB
- references/ovxr-python-interactions/feature-patterns.md7.4 KiB
- references/physics-simulation/README.md7.1 KiB
- references/prim-info-display/README.md10.9 KiB
- references/prim-pick-effects/README.md7.3 KiB
- references/prim-transform-safety/README.md8.6 KiB
- references/realtime-sim-integration/README.md7.0 KiB
- references/render-settings/README.md12.6 KiB
- references/routing.md37.7 KiB
- references/section-views/README.md5.8 KiB
- references/seg-outline-highlight/README.md1.5 KiB
- references/selection-animation/README.md5.0 KiB
- references/selection-feedback/README.md7.5 KiB
- references/smlib-brep-pitfalls/README.md2.5 KiB
- references/spg-processing/README.md8.0 KiB
- references/stage-attribute-reads/README.md6.2 KiB
- references/stage-hierarchy/README.md20.3 KiB
- references/stage-hierarchy/fallback-worker-protocol.md7.4 KiB
- references/stage-loading/README.md7.1 KiB
- references/stage-management/README.md6.6 KiB
- references/stage-queries/README.md6.1 KiB
- references/streaming-client/README.md25.6 KiB
- references/streaming-lifecycle/README.md4.6 KiB
- references/streaming-messages/README.md19.5 KiB
- references/streaming-messages/server-handler-map.md3.1 KiB
- references/streaming-server/README.md17.7 KiB
- references/streaming-server/frame-loop-and-continuity.md3.8 KiB
- references/streaming-viewer-recipe/README.md1.9 KiB
- references/streaming-viewer-recipe/client-protocol.md14.2 KiB
- references/streaming-viewer-recipe/interaction-features.md13.8 KiB
- references/streaming-viewer-recipe/project-structure.md7.3 KiB
- references/streaming-viewer-recipe/server-runtime.md20.2 KiB
- references/streaming-viewer-recipe/validation-build-order.md8.5 KiB
- references/streaming-vs-local/README.md9.4 KiB
- references/stylized-visualization/README.md8.7 KiB
- references/stylized-visualization/aov-guide-contracts.md8.1 KiB
- references/stylized-visualization/implementation.md11.4 KiB
- references/stylized-visualization/line-compositor-delivery.md7.7 KiB
- references/stylized-visualization/mesh-xray.md10.1 KiB
- references/stylized-visualization/reproduction-validation.md10.2 KiB
- references/stylized-visualization/style-composition-contract.md5.4 KiB
- references/stylized-visualization/style-recipes.md14.7 KiB
- references/stylized-visualization/usd-brep-source.md4.9 KiB
- references/subprocess-geometry-bridge/README.md3.5 KiB
- references/tauri-local-viewer/README.md6.7 KiB
- references/tauri-shm-transform-gizmo/README.md12.3 KiB
- references/transform-manipulator/README.md17.1 KiB
- references/troubleshooting/README.md11.2 KiB
- references/troubleshooting/scenario-playbooks.md24.7 KiB
- references/usd-sample-data/README.md12.0 KiB
- references/usd-viewer-app/README.md5.0 KiB
- references/validation.md6.3 KiB
- references/viewer-backend-interface/README.md20.1 KiB
- references/viewer-control-patterns/README.md4.8 KiB
- references/viewer-data-view-patterns/README.md5.6 KiB
- references/viewer-feedback-status/README.md5.0 KiB
- references/viewer-input-routing/README.md11.9 KiB
- references/viewer-layout-patterns/README.md4.7 KiB
- references/viewer-ux-workflow/README.md5.2 KiB
- references/viewport-overlays/README.md9.9 KiB
- references/viewport-overlays/cuda-compositing.md6.6 KiB
- references/viewport-resize/README.md4.0 KiB
- references/vulkan-compositing/README.md6.1 KiB
- references/vulkan-compositing/depth-overlays.md15.7 KiB
- references/vulkan-compositing/interop-and-lifecycle.md6.6 KiB
- references/webgl-shm-transport/README.md14.5 KiB
- references/windows-native-setup/README.md11.6 KiB
- references/xr-client-connection/README.md1.1 KiB
- references/xr-client-message-contract/README.md8.5 KiB
- references/xr-desktop-mirror/README.md13.8 KiB
- references/xr-session-modes-and-passthrough/README.md930 B
- references/xr-spatial-input/README.md2.3 KiB
- references/xr-spatial-input/advanced-tools.md5.2 KiB
- references/xr-spatial-input/controllers.md16.3 KiB
- references/xr-spatial-input/feature-validation.md4.9 KiB
- references/xr-spatial-input/gesture-arbitration.md4.9 KiB
- references/xr-spatial-input/gesture-filtering.md5.5 KiB
- references/xr-spatial-input/hand-recognizers.md4.0 KiB
- references/xr-spatial-input/hands.md10.3 KiB
- references/xr-spatial-input/navigation.md13.5 KiB
- references/xr-spatial-input/physics-interaction.md23.2 KiB
- references/xr-spatial-input/simulation-lifecycle.md5.9 KiB
- references/xr-spatial-input/stage-composition.md4.9 KiB
- references/xr-spatial-input/teleport-acceptance.md5.2 KiB
- references/xr-spatial-input/webxr-client.md3.9 KiB
- references/xr-tracking-anchor-and-scale/README.md950 B
- references/xr-viewer-recipe/README.md10.5 KiB
- skill-card.md7.7 KiB
- skill.oms.sig58.2 KiB
references/stage-hierarchy/README.md
Stage Hierarchy
Triggers
Use this skill for scene tree, stage hierarchy, prim tree, get children, USD properties, variants, bounding box, pxr worker, query_prims, or inspect stage.
Use this for USD data queries that support trees, info panels, variants, camera fitting, and selection expansion.
This is also the canonical pattern for USD-data-to-frontend messaging in this repo. The hierarchy view is the worked example, but the same subprocess isolation, JSON-lines protocol, value normalization, and prim-path round trip discipline apply to properties, variants, metadata, material relationships, bounds, and future USD query features.
Runtime Stage Query Path
For current OVStage-backed viewers, query the application-owned OVStage runtime first for prim discovery, hierarchy rows, prim type filtering, attribute-schema inspection, and runtime attribute reads. OVRTX owns rendering, pick results, and renderer-visible selection groups; it is not the default scene-data service when an OVStage is attached.
result = runtime.query_prims(
attribute_filter_mode="specific",
attribute_names=["visibility", "purpose", "omni:xform"],
)
for prim_path, attrs in result.items():
row = {
"name": prim_path.rsplit("/", 1)[-1] or "/",
"path": prim_path,
"type": classify_from_attrs_or_path(attrs, prim_path),
"children": False,
}An empty filter matches every prim. Pair it with the runtime's none attribute
filter mode for the cheapest full-stage path list:
all_prims = runtime.query_prims(attribute_filter_mode="none")
paths = sorted(all_prims.keys())AND / OR / NOT Filters
Filters are (kind, name) tuples in the app-owned runtime adapter. Map the
strings below to the pinned OVStage API or, for standalone compatibility, to the
current OVRTX native query enums:
prim_typematches the USD type name, such as"Mesh","Camera", or"SphereLight".has_attributematches prims that expose an attribute, such as"points","visibility", or"inputs:Fader".
The filter lists combine as require_all AND, require_any OR, and exclude NOT:
mesh_or_camera_with_visibility = runtime.query_prims(
require_all=[
("has_attribute", "visibility"),
],
require_any=[
("prim_type", "Mesh"),
("prim_type", "Camera"),
],
exclude=[
("prim_type", "Scope"),
("has_attribute", "omni:hidden"),
],
attribute_filter_mode="specific",
attribute_names=["visibility", "omni:xform"],
)Use the runtime's all-attribute mode only for debugging or rich schema views; it can produce large payloads on production scenes. Use specific attributes for inspector panels and no attributes for tree path discovery.
Async Queries
Use async queries when a request should not block the render/input callback that received it:
op = runtime.query_prims_async(
require_any=[
("prim_type", "Mesh"),
("prim_type", "Xform"),
],
attribute_filter_mode="none",
)
pending = op.wait(timeout_ns=5_000_000_000)
if pending is not None:
result = pending.fetch(timeout_ns=100_000_000)Keep renderer.step(), OVStage population/reset, write-floor advancement, and
query result integration serialized through the runtime owner. Discard async
query results whose stage generation no longer matches the active scene.
Standalone OVRTX Query Compatibility
If an app intentionally uses a standalone renderer-owned stage, current OVRTX
Renderer.query_prims() / Renderer.query_prims_async() remain the native
compatibility path for hierarchy and schema discovery:
from ovrtx import AttributeFilterMode, FilterKind
result = renderer.query_prims(
require_any=[
(FilterKind.PRIM_TYPE, "Mesh"),
(FilterKind.PRIM_TYPE, "Camera"),
],
attribute_filter_mode=AttributeFilterMode.SPECIFIC,
attribute_names=["visibility", "omni:xform"],
)Do not route new OVStage-backed hierarchy, inspector, transform, material, or effect workflows through direct renderer query/read/write APIs. Keep direct OVRTX queries for renderer-owned compatibility apps and renderer diagnostics.
Query Handle Use
Lower-level OVStage or standalone OVRTX C query results may be grouped by shared attribute schema. A grouped result can include:
prim_countattributesprim_list_handle
prim_list_handle is owned by the runtime that created the query. Native code
can pass the handle to lower-level read/write descriptors from that same runtime
to bulk read or write a whole query group without converting every prim path back
to strings.
Python adapters should resolve query groups into copied
dict[str, dict[str, AttributeInfo]] payloads keyed by prim path. For Python
code, pass returned path keys to the runtime adapter's read_attribute(),
read_array_attribute(), write_attribute(), or map_attribute() methods. For
C/C++ integrations, preserve the query group and its prim_list_handle only
until all dependent reads or writes are enqueued, and copy any strings needed
before releasing native query results.
Native Tree Construction
Runtime query_prims() returns paths, not a nested child API. Build lazy tree
rows by deriving parent paths:
def parent_path(path: str) -> str:
if path == "/" or path.count("/") <= 1:
return "/"
return path.rsplit("/", 1)[0]
def build_child_index(paths: list[str]) -> dict[str, list[str]]:
children: dict[str, list[str]] = {}
for path in paths:
if path == "/":
continue
children.setdefault(parent_path(path), []).append(path)
for rows in children.values():
rows.sort()
return childrenHierarchy rows should include name, path, type when known from query
filters or reported attributes, and children / hasChildren derived from the
child index. Use get_root_prim_path logic below, but derive it from the
runtime path list when possible.
Review Hierarchy Delivery
Choose the tree delivery shape for the scene size and review task:
Default for large or unknown scenes: query the full path list once, retain the active-generation child index, and return immediate children only when a user expands a row. This keeps the initial payload bounded without reducing a Scope or Xform to an unusable leaf.
Capped review snapshot: for a known modest asset-review scene, return a nested descendant snapshot so Mesh, Material, and Shader prims beneath organizational Scope prims are immediately visible. Require both
max_depthandmax_nodes; stop traversal at either limit and mark the responsetruncated: truewhen more descendants remain.
Use the same row fields in either mode. A capped snapshot must preserve
hasChildren: true for an omitted descendant branch, so the client can request
that branch later rather than treating truncation as a leaf:
{
"prim_path": "/World",
"mode": "reviewSnapshot",
"max_depth": 4,
"max_nodes": 500,
"truncated": true,
"children": [
{"name": "Geometry", "path": "/World/Geometry", "type": "scope", "hasChildren": true}
]
}Do not make an unbounded recursive worker response the default. Keep generation tags on cached indices and discard snapshot or expansion results when the active scene has changed.
pxr Worker Fallback
An app-generated pxr_worker.py is a fallback for capabilities that OVStage runtime queries and
current standalone OVRTX native queries do not fully cover: variant sets, rich
USD metadata, and relationship targets such as material bindings. Do not use it
as the default hierarchy or scalar-attribute path.
Direct pxr import requires import discipline:
import os
os.environ["OVRTX_SKIP_USD_CHECK"] = "1"
from ovrtx import Renderer, RendererConfig
renderer = Renderer(config=RendererConfig(sync_mode=True))
from pxr import Usd, UsdGeom, Sdf, GfDefault to a separate worker Python process with the selected usd-core
environment; communicate over JSON lines. If your app exposes an optional
--usd-subprocess flag, implement its parser and policy explicitly: auto
uses isolation unless the exact platform/package import path has been verified,
on forces isolation, and off requires that verified in-process path.
Create the worker and its parent-side client in the generated app; neither is shipped with this skill. Use fallback-worker-protocol.md for command shapes, dispatch, client lifecycle, and failure handling. The query and serialization examples below supply the USD operations behind that protocol.
Fallback pxr Queries
stage = Usd.Stage.Open("/path/to/scene.usd")
root = stage.GetPseudoRoot()
def classify_prim_type(prim):
if prim.IsA(UsdGeom.Camera):
return "camera"
if prim.IsA(UsdGeom.Gprim):
return "geom"
if prim.IsA(UsdGeom.Scope):
return "scope"
if "Light" in prim.GetTypeName():
return "light"
return "xform"
prim = stage.GetPrimAtPath("/World")
for child in prim.GetChildren():
item = {
"name": child.GetName(),
"path": str(child.GetPath()),
"type": classify_prim_type(child),
"children": bool(child.GetChildren()),
}Lazy tree loading returns immediate children first, then expands individual nodes on request. A custom recursive VStack is often easier than ui.TreeView for local lightweight apps: store expanded and selected_path, render 24 px rows, and paint selected rows green. Use ovui.stage.widget.stage_widget.StageWidget only when editor features such as filtering or drag/drop are required.
Root Prim Detection
Never hardcode /World as the hierarchy root. Different USD assets use different root prims; for example, some large sample scenes use /stage.
With runtime query results, use this order:
/Worldwhen it exists.The loaded stage's default prim when a fallback pxr query is already available.
The first pseudo-root child that is not a viewer/session/render prim.
For a runtime-query-only tree, derive pseudo-root children from the path list:
def detect_root_prim_path_from_paths(paths: set[str]) -> str:
if "/World" in paths:
return "/World"
skip_names = {"Session", "Render"}
roots = sorted(path for path in paths if path.count("/") == 1 and path != "/")
for path in roots:
name = path.rsplit("/", 1)[-1]
if name in skip_names:
continue
return path
return "/"When pxr fallback is already active for variants or metadata, preserve the default-prim-aware order:
def detect_root_prim_path(stage: Usd.Stage) -> str:
world = stage.GetPrimAtPath("/World")
if world and world.IsValid():
return "/World"
default_prim = stage.GetDefaultPrim()
if default_prim and default_prim.IsValid():
return str(default_prim.GetPath())
skip_names = {"Session", "Render"}
skip_types = {"RenderSettings", "RenderProduct", "RenderVar"}
for child in stage.GetPseudoRoot().GetChildren():
if child.GetName() in skip_names:
continue
if child.GetTypeName() in skip_types:
continue
return str(child.GetPath())
return "/"Return this path as root_prim_path in stage-open responses. Use it for
frontend tree initialization and getChildrenRequest instead of assuming
/World. Hierarchy queries return rows; expanding a branch must not change
which geometry can be picked. The runtime owner derives pickable geometry from
its scene/workload policy and refreshes it after scene or composition changes.
If the app exposes an explicit pickability command, define whether its paths
replace the policy or add/remove members, and apply that intent on the owner.
A partial tree response is not a complete selectable set.
Properties
Prefer OVStage runtime attribute reads for scalar/tensor inspector data. Use
query_prims() with a specific attribute filter to confirm an attribute exists
and discover its descriptor, then call the runtime adapter's read_attribute()
or read_array_attribute() methods from stage-attribute-reads.
result = runtime.query_prims(
require_all=[("has_attribute", "omni:xform")],
attribute_filter_mode="specific",
attribute_names=["omni:xform", "visibility", "purpose"],
)
if "/World/Cube" in result:
xform_tensor = runtime.read_attribute("omni:xform", ["/World/Cube"])Use the pxr fallback only for property categories that still need USD composition services or string target resolution, such as variant sets, metadata, and relationships:
prim = stage.GetPrimAtPath("/World/Cube")
props = {}
for attr in prim.GetAttributes():
props[attr.GetName()] = serialize_value(attr.Get())Include type name, visibility, purpose, transform values, material binding, and variants when building selected-prim info. OVStage/runtime reads should supply numeric/tensor attribute values; pxr should fill variant sets, rich metadata, and relationship targets until runtime APIs cover those at the same fidelity.
Variants
vsets = prim.GetVariantSets()
for set_name in vsets.GetNames():
vs = vsets.GetVariantSet(set_name)
options = vs.GetVariantNames()
current = vs.GetVariantSelection()
vs = vsets.GetVariantSet("color")
vs.SetVariantSelection("blue")Changing a variant recomposes the stage; refresh children/properties under that prim and any selectable-path or material maps that may have changed.
Type Filtering And Mesh Expansion
if prim.IsA(UsdGeom.Gprim) or prim.IsA(UsdGeom.Xform):
pass
for desc in Usd.PrimRange(prim):
if desc.IsA(UsdGeom.Gprim):
mesh_paths.append(str(desc.GetPath()))Use runtime query filters for descendant mesh expansion when a selected tree path is an Xform or Scope but highlight/picking needs concrete mesh paths. Use the pxr recursive pattern above only when the fallback worker is already active or when the runtime query API cannot supply the needed traversal.
Bounding Boxes
bbox_cache = UsdGeom.BBoxCache(Usd.TimeCode.Default(), ["default", "render"])
bbox = bbox_cache.ComputeWorldBound(stage.GetPseudoRoot())
rng = bbox.ComputeAlignedRange()
if not rng.IsEmpty():
center = rng.GetMidpoint()
size = rng.GetSize()
max_dim = max(size[0], size[1], size[2])Use this for camera fitting and floating prim-info anchors.
JSON Serialization
USD values are not JSON-safe by default:
| pxr type | JSON |
|---|---|
| bool/int/float/str/token | primitive/string |
Gf.Vec2/3/4* | list |
Gf.Matrix4* | four row arrays |
Gf.Quat* | {real, imaginary} |
Sdf.AssetPath | resolved path or raw path |
Vt.Array | {length, preview, truncated} for inspector/data-channel responses; full list only for explicit export/debug paths |
| unknown | str(value) |
def serialize_value(value):
if value is None or isinstance(value, (bool, int, float, str)):
return value
if isinstance(value, (Gf.Vec3f, Gf.Vec3d, Gf.Vec3i)):
return list(value)
if isinstance(value, (Gf.Matrix4d, Gf.Matrix4f)):
return [list(value.GetRow(i)) for i in range(4)]
if isinstance(value, (Gf.Quatf, Gf.Quatd)):
return {"real": float(value.GetReal()), "imaginary": list(value.GetImaginary())}
if isinstance(value, Sdf.AssetPath):
return value.resolvedPath or value.path
if hasattr(value, "__len__") and hasattr(value, "__getitem__"):
return [serialize_value(v) for v in value[:1000]]
return str(value)Fallback Subprocess Protocol
Detailed fallback subprocess and worker command guidance lives in fallback-worker-protocol.md.
Frontend Normalization
The current pxr worker returns child rows with children: bool as expandability metadata:
{"ok":true,"children":[{"name":"Mesh","path":"/World/Mesh","children":true,"type":"xform"}]}React tree components commonly use hasChildren for expandability and reserve children for loaded child arrays. Normalize server rows before storing them in frontend state, or make the server emit both fields:
type ServerPrim = {
name: string;
path: string;
type?: PrimType;
children?: boolean | USDPrim[] | null;
has_children?: boolean;
hasChildren?: boolean;
};
function normalizePrim(prim: ServerPrim): USDPrim {
const loadedChildren = Array.isArray(prim.children)
? prim.children.map(normalizePrim)
: undefined;
const hasChildren = Array.isArray(prim.children)
? prim.children.length > 0 || Boolean(prim.hasChildren ?? prim.has_children)
: Boolean(prim.hasChildren ?? prim.has_children ?? prim.children);
return {
name: prim.name,
path: prim.path,
type: prim.type,
hasChildren,
children: loadedChildren ?? null,
};
}Frontend Contract
Requests: openStageRequest, getChildrenRequest, getPropertiesRequest, getVariantsRequest, setVariantRequest, selectPrimsRequest, makePrimsPickable, resetStage, and loadingStateQuery. Responses are documented in streaming-messages; note exact getChildrenResult vs older getChildrenResponse naming before editing.
Native Query Coverage
Current runtime query coverage includes prim discovery, prim-type filters,
attribute-presence filters, attribute schema descriptors, scalar reads, array
reads, live writes, and mapped writes. In OVStage-backed apps, route this through
OVStage and its path dictionary/data plane. Direct OVRTX query/read/write APIs
remain standalone compatibility paths for renderer-owned stages. Keep
usd-core/pxr isolated to the fallback categories above, and revisit this split
when runtime APIs expose variant sets, rich metadata, and relationship target
traversal at the same level.
Generated Module Checklist - pxr_worker.py
Use this checklist only when the app still needs fallback pxr coverage. Do not build the main hierarchy tree through the worker when query_prims() is sufficient.
[ ]
cmd_load(path) -> dict[ ]
cmd_get_bbox() -> dict[ ]
cmd_get_children(path, filters=None) -> dict[ ]
cmd_get_root_prim_path() -> dict[ ]
cmd_get_prim_count() -> dict[ ]
cmd_get_properties(path) -> dict[ ]
cmd_get_variants(path) -> dict[ ]
cmd_set_variant(path, variant_set, variant_selection) -> dict[ ]
cmd_get_pickable_bboxes(paths=None) -> dict[ ]
cmd_get_material_map() -> dict[ ]
cmd_get_world_transforms(paths=None) -> dict[ ]
_HANDLERS["get_world_transforms"], notget_base_transforms[ ] Responses use
bboxes,material_map, andtransformsdictionaries keyed by prim path.
Generated Module Checklist - PxrWorkerClient
[ ]
start() -> None[ ]
stop() -> None[ ]
load_stage(path: str) -> bool[ ]
get_children(path: str, filters: list[str] | None = None) -> list[dict][ ]
get_properties(path: str) -> dict[ ]
get_variants(path: str) -> dict[ ]
set_variant(path: str, variant_set: str, variant_selection: str) -> bool[ ]
get_root_prim_path() -> str[ ]
get_prim_count() -> int[ ]
get_pickable_bboxes(paths: list[str] | None = None) -> dict[str, dict][ ]
get_material_map() -> dict[str, str][ ]
get_world_transforms(paths: list[str] | None = None) -> dict[str, list[list[float]]]
See also: prim-info-display, stage-management, camera-controls, streaming-messages, windows-native-setup.
Adding This To An Existing Omniverse Realtime Viewer
Add
server/stage_queries.pyaround OVStage runtimequery_prims()for hierarchy and schema discovery.Add
stage-attribute-readshelpers for runtime scalar and array property reads.Add
pxr_worker.pyonly when the app needs variants, rich metadata, or relationship target resolution.Keep server state for the active query stage, root children, and expanded-node cache.
Add
getChildrenRequest->getChildrenResultrouting for lazy tree expansion.Add
getPropertiesRequest->getPropertiesResponsewhen prim info panels need property payloads.Add
getVariantsRequest,getVariantsResponse, andsetVariantRequestwhen variants are editable.Refresh query caches and stage-generation tags whenever
stage-managementloads, reloads, or resets a scene.Frontend wires a
StageTreecomponent to request children on expand and selection on row click.Selection features use hierarchy queries for descendant mesh expansion and selectable path lists.
Variant changes should refresh affected children, properties, selectable-path maps, material maps, and selection state.
Clear hierarchy caches on scene switch and keep slow USD queries out of ovstream callback threads.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python, Needs Node.js
The author says: Orchestrator skill. Downstream focused references may require NVIDIA GPUs, ovrtx, ovstream, ovui, OpenUSD, Python, Node/React, Tauri, Electron, C++, or cloud GPU deployment access depending on the selected viewer path.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- NVIDIA Omniverse
- Publisher
- NVIDIA (Official)
- Source
- NVIDIA/skills · skills/omniverse-realtime-viewer · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA Omniverse or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download omniverse-realtime-viewer.zip