AIMaks

Universal Scene Description (USD): Scenes,
Prims, and Layers

35 min readvideoOmniverse Platform Fundamentals
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:translate of type GfVec3f)
  • Relationship — a link from one prim to another (e.g. material binding)
  • Schema — a typed interface applied to a prim (e.g. UsdGeomMesh, UsdPhysicsRigidBodyAPI)
python
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.

Session Layer (strongest) — live edits, not saved to disk root.usda — project root, sublayers below assets/robot.usda — robot geometry and joints assets/environment.usda — ground, walls, lights ↑ Stronger opinions override weaker ones ↑

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

ArcFull NamePurpose
LLocal opinionsValues authored directly in the current layer
IInheritsInherit class prims; used for material class overrides
VVariant setsSwitchable configuration slots (e.g. LOD, color)
RReferencesInclude an external USD file as a sub-tree
PPayloadsLike references, but deferred (lazy-loaded)
SSpecializesBase-class relationship for asset specialization
python
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
python
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.
Up next · Omniverse Nucleus: Collaboration and Asset Management