Master the USD data model โ stages, prims, properties, primvars, value types, file formats, and Python API basics that underpin every other exam domain.
OpenUSD (Universal Scene Description) is a Pixar-originated open standard for defining, packaging, assembling, and transporting 3D scenes. Originally developed for Pixar's production pipeline, it has been open-sourced and is now the foundational interchange format across NVIDIA Omniverse, Apple's RealityKit/AR, Adobe Substance, Autodesk Maya, SideFX Houdini, and dozens of other tools. USD's compositing architecture allows non-destructively layering opinions on scene data, making it ideal for large collaborative pipelines.
The USD data model is the bedrock of the entire NCP-OUSD exam. Understanding how prims, properties, and value resolution work is prerequisite knowledge for Composition (the largest domain at ~23%), Debugging (~11%), and Visualization (~8%). Questions in this topic test both conceptual knowledge and concrete Python API calls โ you need to know the "what" and the "how to do it" together.
The top-level container that holds the fully composed scene. Created via Usd.Stage.Open(), Usd.Stage.CreateNew(), or Usd.Stage.CreateInMemory(). Owns the layer stack and provides the unified, resolved view of all scene data.
Primary scene unit โ the fundamental node in the scenegraph hierarchy. Can be typed (Mesh, Xform, Material) or typeless. Addressed by a path like /World/Cube. Prims can be active or inactive, and carry a specifier: def, over, or class.
Data attached to prims in two forms: Attributes (typed data โ float, color3f, int[]) and Relationships (connections to other prim paths, e.g., material bindings). Accessed via GetAttribute() and GetRelationship().
Typed APIs applied to prims. IsA schemas define a prim's type (Xformable, Mesh, Material) and set GetTypeName(). API schemas add behaviors without changing type (PhysicsRigidBodyAPI, UsdGeomPrimvarsAPI) โ applied via Apply().
Detailed explanations with Python API examples and reference tables.
The Stage is the entry point for all USD operations. It represents the fully composed scene by resolving the layer stack according to USD's composition rules (LIVERPS). You never interact with raw layers during typical authoring โ the Stage provides the composed view.
from pxr import Usd
# Open existing stage
stage = Usd.Stage.Open("/path/to/scene.usda")
# Create new stage backed by file
stage = Usd.Stage.CreateNew("/path/to/new_scene.usda")
# In-memory stage
stage = Usd.Stage.CreateInMemory()
# Traverse all active prims
for prim in stage.Traverse():
print(prim.GetPath())
# Get prim at specific path
prim = stage.GetPrimAtPath("/World/Cube")
# Stage metadata
stage.SetMetadata("upAxis", "Y")
start = stage.GetStartTimeCode()
end = stage.GetEndTimeCode()
The prim hierarchy forms a tree rooted at the pseudo-root (/). Every prim has an SdfPath โ a string-based address that uniquely identifies it. Paths are the backbone of all USD cross-referencing.
from pxr import Usd, Sdf
stage = Usd.Stage.CreateInMemory()
# Define a concrete prim (specifier: def)
prim = stage.DefinePrim("/World/Cube", "Cube")
# Check prim properties
print(prim.GetPath()) # Sdf.Path('/World/Cube')
print(prim.GetName()) # 'Cube'
print(prim.GetTypeName()) # 'Cube'
# Navigate hierarchy
parent = prim.GetParent() # /World prim
children = parent.GetChildren()
# Deactivate a prim (excludes from traversal)
prim.SetActive(False)
print(prim.IsActive()) # False
Properties are the data attached to prims. All properties live in a namespace on the prim and can be queried by name. Two kinds exist: Attributes carry typed scalar or array values, while Relationships point to other prim paths.
from pxr import Usd, Sdf, UsdGeom
stage = Usd.Stage.CreateInMemory()
prim = stage.DefinePrim("/World/Sphere", "Sphere")
# Create and set an attribute
attr = prim.CreateAttribute("myRadius", Sdf.ValueTypeNames.Float)
attr.Set(2.5) # default value
attr.Set(3.0, 10) # time sample at frame 10
attr.Set(5.0, 24) # time sample at frame 24
# Read back
print(attr.Get()) # 2.5 (default)
print(attr.Get(10)) # 3.0
print(attr.GetTimeSamples()) # [10.0, 24.0]
# Create a relationship
rel = prim.CreateRelationship("material:binding")
rel.AddTarget(Sdf.Path("/Materials/Red"))
print(rel.GetTargets()) # [Sdf.Path('/Materials/Red')]
# Primvar
mesh = stage.DefinePrim("/World/Mesh", "Mesh")
api = UsdGeom.PrimvarsAPI(mesh)
pv = api.CreatePrimvar("st", Sdf.ValueTypeNames.Float2Array, UsdGeom.Tokens.faceVarying)
pv.Set([(0,0),(1,0),(1,1),(0,1)])
USD has a rich type system covering scalar, vector, matrix, and array types. The Sdf.ValueTypeNames namespace contains all built-in types. Array types correspond to VtArray<T> in C++ and Python lists/tuples.
| Category | Type Name | Sdf.ValueTypeNames | Notes |
|---|---|---|---|
| Scalar | bool | Bool | True/False |
| Scalar | int | Int | 32-bit integer |
| Scalar | float | Float | Single precision |
| Scalar | double | Double | Double precision |
| Scalar | string | String | Free-form text |
| Scalar | token | Token | From fixed set; fast comparison |
| Scalar | asset | Asset | File path reference |
| Vector | float2 | Float2 | UV coordinates |
| Vector | float3 | Float3 | General 3-component |
| Vector | color3f | Color3f | RGB color |
| Vector | normal3f | Normal3f | Surface normals |
| Vector | point3f | Point3f | World-space points |
| Matrix | matrix4d | Matrix4d | 4ร4 transform matrix (double) |
| Array | float[] | FloatArray | VtArray<float> |
| Array | int[] | IntArray | VtArray<int> |
| Array | point3f[] | Point3fArray | Mesh vertices |
TimeSamples: A dict-like structure of {timeCode: value} pairs stored on an attribute. When both a default value and time samples exist, time-sampled values take precedence at any time code within range. Between samples USD performs linear interpolation by default; held interpolation freezes the previous value.
from pxr import Sdf, Usd
stage = Usd.Stage.CreateInMemory()
prim = stage.DefinePrim("/Anim/Ball")
# Float attribute with time samples
attr = prim.CreateAttribute("xpos", Sdf.ValueTypeNames.Float)
attr.Set(0.0) # default value
attr.Set(0.0, 1) # frame 1
attr.Set(10.0, 24) # frame 24
# Time-sampled value wins over default
print(attr.Get(1)) # 0.0
print(attr.Get(12)) # ~5.0 (linear interpolation)
print(attr.Get(24)) # 10.0
# Block a value (suppresses inheritance)
attr.Set(Sdf.ValueBlock())
# Matrix4d for transforms
xform_attr = prim.CreateAttribute("xformOp:transform",
Sdf.ValueTypeNames.Matrix4d)
| Format | Extension | Type | Use Case |
|---|---|---|---|
| .usda | ASCII | Human-readable text | Authoring, debugging, version control |
| .usdc | Binary (crate) | Compact binary | Production pipelines, fast load times |
| .usdz | ZIP archive | Read-only package | Distribution: Apple AR, Omniverse exchange |
The generic extension .usd can refer to either .usda or .usdc โ USD auto-detects the format. The command-line tools usdcat (dump scene as ASCII) and usdview (interactive viewer) are essential debugging aids. Use usdzip to create .usdz packages.
Six mnemonics and pattern anchors to lock in the key concepts before exam day.
10 questions, one at a time. Select your answer and click Next.
Click any card to flip it and reveal the answer.
Five categories of targeted advice for this exam topic.
Curated links to official materials for NCP-OUSD exam preparation.
Ready to put your knowledge to the test?
Start Free Trial โ flashgenius.net/register