Generated banner for Omniverse Realtime Viewer
Generated logo for Omniverse Realtime Viewer

Omniverse Realtime Viewer

NVIDIAOfficialCreated by NVIDIA Omniverse

  • Skill
  • Tool integration
  • Software development
  • Apache-2.0
  • Medium risk

From the author

Use as the top-level router for Omniverse Realtime Viewer USD apps, XR delivery, SPG GPU processing, stylized rendering, and focused viewer reference documents.
— the description by NVIDIA Omniverse

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

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/nvidia/omniverse-realtime-viewer/download
  2. Unzip 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

  1. When delivery is explicit, select its recipe through references/routing.md and follow its current phase. Otherwise start with references/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.

  2. Resolve the selected libraries through references/dependencies/README.md. Preserve the project's manifest unless an upgrade is requested.

  3. Build a working frame and camera interaction in the chosen shell, then add the requested capabilities. Read references/conventions.md for shared input, camera, selection, and protocol conventions.

  4. Use references/viewer-ux-workflow/README.md for broader interface design. Loading, selection feedback, errors, and input responsiveness belong in the first working app, alongside rendering.

  5. Validate the actual delivery path with references/validation.md. A browser screenshot does not validate a native window or a different transport.

Architecture

OwnerResponsibility
Viewer runtimeOwn the live OVStage, publication clock, OVRTX renderer, scene changes, and render stepping.
UI and input adapterDisplay frames and copied app state; send user intent to the runtime owner.
Storage/query/simulation workersPerform their assigned work and return results through the selected integration boundary.
Delivery adapterPresent 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

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_type matches the USD type name, such as "Mesh", "Camera", or "SphereLight".

  • has_attribute matches 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_count

  • attributes

  • prim_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 children

Hierarchy 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_depth and max_nodes; stop traversal at either limit and mark the response truncated: true when 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, Gf

Default 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:

  1. /World when it exists.

  2. The loaded stage's default prim when a fallback pxr query is already available.

  3. 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 typeJSON
bool/int/float/str/tokenprimitive/string
Gf.Vec2/3/4*list
Gf.Matrix4*four row arrays
Gf.Quat*{real, imaginary}
Sdf.AssetPathresolved path or raw path
Vt.Array{length, preview, truncated} for inspector/data-channel responses; full list only for explicit export/debug paths
unknownstr(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"], not get_base_transforms

  • [ ] Responses use bboxes, material_map, and transforms dictionaries 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.py around OVStage runtime query_prims() for hierarchy and schema discovery.

  • Add stage-attribute-reads helpers for runtime scalar and array property reads.

  • Add pxr_worker.py only 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 -> getChildrenResult routing for lazy tree expansion.

  • Add getPropertiesRequest -> getPropertiesResponse when prim info panels need property payloads.

  • Add getVariantsRequest, getVariantsResponse, and setVariantRequest when variants are editable.

  • Refresh query caches and stage-generation tags whenever stage-management loads, reloads, or resets a scene.

  • Frontend wires a StageTree component 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