Universal Scene Description (USD): Scenes,
Prims, and Layers
2 of 50NVIDIA Omniverse & Robot Learning
Universal Scene Description (USD): Scenes, Prims, and Layers
Universal Scene Description (USD) was originally developed by Pixar for their production pipeline and open-sourced in 2016. It is now the standard interchange format for 3D scenes, adopted by Apple (Reality Composer), NVIDIA (Omniverse), and dozens of DCC tools. Understanding USD's data model is the single most important conceptual foundation for working in Omniverse.
The Stage, Prims, and Attributes
A USD Stage is the in-memory representation of an entire 3D scene. It is composed of a hierarchy of Prims (primitives) — the basic building blocks analogous to nodes in a scene graph.
- Prim — a named node in the scene hierarchy (e.g.
/World/Robot/Base) - Attribute — typed data attached to a prim (e.g.
xformOp:translateof typeGfVec3f) - Relationship — a link from one prim to another (e.g. material binding)
- Schema — a typed interface applied to a prim (e.g.
UsdGeomMesh,UsdPhysicsRigidBodyAPI)
from pxr import Usd, UsdGeom, Gf
# Open (or create) a USD stage
stage = Usd.Stage.CreateNew("my_scene.usda")
# Define a Xform prim (transform node)
xform = UsdGeom.Xform.Define(stage, "/World")
# Define a Sphere under the Xform
sphere_prim = UsdGeom.Sphere.Define(stage, "/World/Sphere")
sphere_prim.GetRadiusAttr().Set(0.5)
# Set translation via xformOps
xform_api = UsdGeom.XformCommonAPI(sphere_prim)
xform_api.SetTranslate(Gf.Vec3d(1.0, 0.0, 0.5))
stage.GetRootLayer().Save()
print("Stage saved to my_scene.usda")
Layers and the Layer Stack
A USD Stage is built from one or more Layers, stacked in a
specific order. Each layer is an independent file (.usda text or
.usdc binary crate) that can contribute opinions about prims and
attributes. The final resolved value of any attribute is determined by the
composition arcs.
Formally, given a layer stack ordered strongest-first, the resolved value of attribute on prim is:
In practice this means the strongest (topmost) layer wins — just like CSS specificity but for 3D data.
The Six Composition Arcs (LIVRPS)
Composition arcs are the mechanism by which USD assembles a stage from multiple layers. The acronym LIVRPS gives their strength order (strongest to weakest):
| Arc | Full Name | Purpose |
|---|---|---|
| L | Local opinions | Values authored directly in the current layer |
| I | Inherits | Inherit class prims; used for material class overrides |
| V | Variant sets | Switchable configuration slots (e.g. LOD, color) |
| R | References | Include an external USD file as a sub-tree |
| P | Payloads | Like references, but deferred (lazy-loaded) |
| S | Specializes | Base-class relationship for asset specialization |
from pxr import Usd, UsdGeom
stage = Usd.Stage.CreateNew("assembly.usda")
root = UsdGeom.Xform.Define(stage, "/World")
# Reference an external robot asset
robot_prim = stage.DefinePrim("/World/Robot")
robot_prim.GetReferences().AddReference("assets/franka.usda", "/Franka")
# Override the referenced prim's color locally (strongest opinion wins)
from pxr import UsdShade, Gf
# ... (material binding override) ...
# Variant sets — switch between gripper configurations
vset = robot_prim.GetVariantSets().AddVariantSet("gripper")
vset.AddVariant("parallel")
vset.AddVariant("suction")
vset.SetVariantSelection("parallel")
print("Variant selected:", vset.GetVariantSelection())
SdfPath: Addressing Prims and Properties
Every object in a USD stage is identified by an SdfPath — a Unix-like path with an optional property suffix separated by a dot:
/World/Robot— prim path/World/Robot.visibility— attribute on that prim/World/Robot/Base.xformOp:translate— transform attribute
from pxr import Sdf
prim_path = Sdf.Path("/World/Robot/Base")
attr_path = Sdf.Path("/World/Robot/Base.xformOp:translate")
print(prim_path.GetParentPath()) # /World/Robot
print(attr_path.GetPrimPath()) # /World/Robot/Base
print(attr_path.name) # xformOp:translate
Key Takeaways
- A Stage is a composed view of a stack of Layers; the resolution rule is "strongest layer wins".
- The six LIVRPS composition arcs give USD its non-destructive, override- friendly workflow.
- References and Payloads let you build large scenes from small, reusable asset files — critical for scalable robot environment construction.