FlashGenius Logo FlashGenius
NVIDIA NCP-OUSD  ยท  Exam Weight: ~13%

NCP-OUSD: USD Foundations &
Data Modeling

Master the USD data model โ€” stages, prims, properties, primvars, value types, file formats, and Python API basics that underpin every other exam domain.

60โ€“70 Questions 120 Minutes $200 Exam Fee 2-Year Credential
What Is OpenUSD?

Universal Scene Description

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.

Why This Topic Matters for the Exam

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 4 Pillars of USD

๐Ÿ“ฆ Stage

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.

๐Ÿ”ท Prim

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.

๐Ÿท๏ธ Properties

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().

๐Ÿ“ Schemas

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().

Concepts & Reference

Detailed explanations with Python API examples and reference tables.

The USD Stage

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.

  • Open / Create: Usd.Stage.Open(filePath) โ€” open an existing .usda/.usdc file; Usd.Stage.CreateNew(filePath) โ€” create a new stage backed by a file on disk; Usd.Stage.CreateInMemory() โ€” create an anonymous in-memory stage.
  • Traversal: stage.GetPseudoRoot() returns the invisible root prim; stage.Traverse() iterates all prims; stage.GetPrimAtPath("/World/Cube") fetches a specific prim.
  • Stage metadata: defaultPrim โ€” the prim consumers use as the root reference; upAxis ("Y" or "Z"); metersPerUnit; timeCodesPerSecond; startTimeCode; endTimeCode.
  • Saving: stage.Save() writes the root layer; stage.Export(filePath) flattens and exports the entire composed scene.
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()

Prim Hierarchy & Paths

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.

  • SdfPath types: Absolute (/World/Cube), relative (./Child), property path (/Cube.points), relationship target path.
  • Prim queries: prim.GetPath(), prim.GetName(), prim.GetTypeName().
  • Hierarchy navigation: prim.GetParent(), prim.GetChildren(), prim.GetAllChildren() (includes inactive).
  • Active vs inactive: prim.SetActive(False) โ€” inactive prims are excluded from stage.Traverse() by default and not rendered.
  • Prim specifiers: def โ€” concrete, creates a renderable prim; over โ€” override, adds opinions to an existing prim without creating it; class โ€” abstract template, never rendered directly, used as an inheritance source via inherits arc.
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: Attributes & Relationships

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.

  • Create attribute: prim.CreateAttribute("myFloat", Sdf.ValueTypeNames.Float)
  • Set/Get value: attr.Set(1.5, time=Usd.TimeCode.Default()) for a default value; attr.Set(2.0, 10) for timeCode 10; attr.Get(time) to read.
  • TimeSamples: attr.GetTimeSamples() returns a sorted list of time codes that have values; attr.GetTimeSamplesInInterval(interval) for a range.
  • Relationship: prim.CreateRelationship("material:binding"); rel.AddTarget(Sdf.Path("/Materials/Red")); rel.GetTargets().
  • Primvars: Special attributes with an interpolation mode. Accessed via UsdGeom.PrimvarsAPI(prim); created with api.CreatePrimvar("st", Sdf.ValueTypeNames.Float2Array, UsdGeom.Tokens.faceVarying).
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)])

Value Types & TimeSamples

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.

CategoryType NameSdf.ValueTypeNamesNotes
ScalarboolBoolTrue/False
ScalarintInt32-bit integer
ScalarfloatFloatSingle precision
ScalardoubleDoubleDouble precision
ScalarstringStringFree-form text
ScalartokenTokenFrom fixed set; fast comparison
ScalarassetAssetFile path reference
Vectorfloat2Float2UV coordinates
Vectorfloat3Float3General 3-component
Vectorcolor3fColor3fRGB color
Vectornormal3fNormal3fSurface normals
Vectorpoint3fPoint3fWorld-space points
Matrixmatrix4dMatrix4d4ร—4 transform matrix (double)
Arrayfloat[]FloatArrayVtArray<float>
Arrayint[]IntArrayVtArray<int>
Arraypoint3f[]Point3fArrayMesh 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.

  • Blocked value: attr.Set(Sdf.ValueBlock()) masks any composed value, making the attribute appear unset โ€” useful to suppress inherited or referenced values.
  • Held interpolation: attr.SetMetadata("interpolation", "held") โ€” value jumps discretely at each sample rather than interpolating.
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)

USD File Formats

FormatExtensionTypeUse Case
.usdaASCIIHuman-readable textAuthoring, debugging, version control
.usdcBinary (crate)Compact binaryProduction pipelines, fast load times
.usdzZIP archiveRead-only packageDistribution: 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.


Built-in Schema Domains (Overview)

  • UsdGeom โ€” Geometry primitives: Mesh, Xform, Camera, Scope, Points, BasisCurves. Defines xformOp ordering, visibility, purpose, and extent.
  • UsdShade โ€” Shading networks: Material, Shader, NodeGraph. Handles material binding and shader connections.
  • UsdLux โ€” Lighting: SphereLight, DomeLight, RectLight, DistantLight, CylinderLight. Defines intensity, color, exposure.
  • UsdPhysics โ€” Rigid body simulation: RigidBodyAPI, CollisionAPI, Scene.
  • UsdSkel โ€” Skeletal animation: Skeleton, SkelAnimation, SkelRoot.
  • UsdVol โ€” Volumetric data: Volume, OpenVDBAsset.
Memory Hooks

Six mnemonics and pattern anchors to lock in the key concepts before exam day.

"PSAP" โ€” The 4 USD Building Blocks

  • Prim โ€” the scene node; every 3D object is a prim
  • Stage โ€” the container; holds everything composed
  • Attribute โ€” typed data living on a prim
  • Path โ€” the address; without a path, nothing can be found

"def over class" โ€” The 3 Specifiers

  • def = define โ€” concrete, creates the prim, will render
  • over = override โ€” modifies existing, won't create if absent
  • class = abstract โ€” template only, never directly rendered

"Token vs String"

  • token = from a controlled vocabulary (typeName, upAxis "Y"/"Z", interpolation "linear"/"held")
  • string = free-form text โ€” display names, arbitrary metadata
  • Tokens are interned and compared by pointer โ€” much faster at runtime

"TimeSamples Beat Default"

  • When both exist, time-sampled values win over the default value at any sampled time code
  • Sdf.ValueBlock() is the nuclear option โ€” it silences even inherited or referenced values
  • Think of ValueBlock as a "do not inherit" sticky note on the attribute

"Primvar Interpolation Ladder"

  • constant โ€” one value for the whole prim (cheapest)
  • uniform โ€” one value per face element
  • varying โ€” one value per vertex
  • faceVarying โ€” one value per face-vertex (most detailed, most data)

".usda = readable ยท .usdc = fast ยท .usdz = portable"

  • Author in .usda โ€” inspect it in any text editor, commit to git
  • Ship in .usdc โ€” binary crate format, 3โ€“10ร— faster loads
  • Distribute in .usdz โ€” ZIP archive, read-only, Apple AR & Omniverse exchange
Practice Quiz

10 questions, one at a time. Select your answer and click Next.

Question 1 of 10
Flashcards

Click any card to flip it and reveal the answer.

Term
What is a USD Stage?
click to flip
Answer
The top-level container that holds the composed scene. Created via Usd.Stage.Open(), CreateNew(), or CreateInMemory(). Owns the layer stack and provides the composed view of the scene.
Concept
def vs over vs class
click to flip
Answer
def โ€” concrete prim (rendered). over โ€” opinion that modifies an existing prim without defining it. class โ€” abstract template, never rendered directly; used for inheritance via inherits arc.
Term
What is a primvar?
click to flip
Answer
A UsdGeom primitive variable โ€” an attribute with an interpolation mode (constant / uniform / varying / faceVarying) that controls how values are distributed across a geometry prim's surface.
Python API
Sdf.ValueBlock()
click to flip
Answer
A special value that blocks/masks any value that would otherwise be composed for that attribute โ€” suppresses inherited or referenced values, making the attribute appear unset.
File Formats
What are the 3 USD file formats?
click to flip
Answer
.usda = ASCII (human-readable, authoring). .usdc = Binary crate (fast, production). .usdz = ZIP archive (read-only, distribution โ€” used by Apple AR and Omniverse).
Paths
SdfPath for a property
click to flip
Answer
Use dot notation: /PrimName.attributeName. E.g., /World/Cube.points. Prim paths use slashes only: /World/Cube. A colon separates namespaced property names: /Cube.xformOp:translate.
Comparison
Relationship vs Attribute
click to flip
Answer
Attribute = typed data stored on a prim (float, color3f, etc.). Relationship = connection to one or more target prim paths (e.g., material:binding โ†’ /Materials/Red).
Schemas
IsA schema vs API schema
click to flip
Answer
IsA schema defines a prim's type (Mesh, Xform, Material) โ€” sets GetTypeName(). API schema adds behaviors without changing type (PhysicsRigidBodyAPI, UsdGeomPrimvarsAPI) โ€” applied via Apply().
Study Advisor

Five categories of targeted advice for this exam topic.

๐ŸŽฏ
Exam Strategy
  • Data Modeling questions test Python API calls specifically โ€” know method names exactly, not just concepts
  • Memorize Usd.Stage.Open() vs CreateNew() vs CreateInMemory() โ€” distractors use plausible-sounding wrong names like Load() or Read()
  • Prim specifier questions (def/over/class) appear frequently โ€” know each in one sentence
  • For path questions, remember: dot for properties, slash for prims, colon for namespace within property name
๐Ÿ“š
Core Resources
  • NVIDIA Learn OpenUSD Module 1 "Setting the Stage" โ€” primary source for Stage & Prim content
  • NVIDIA Learn OpenUSD Module 2 "Scene Description Blueprints" โ€” covers properties and schemas
  • OpenUSD official docs at openusd.org โ€” authoritative reference for all type names and API signatures
  • USD Glossary at openusd.org/release/glossary.html โ€” use for precise definitions
๐Ÿ’ป
Hands-On Practice
  • Install USD from source or use NVIDIA Omniverse USD Composer for a Python environment
  • Practice creating stages, defining prims, and setting attributes with time samples in a Python REPL
  • Open .usda files in a text editor โ€” read the raw scene description to understand how specifiers look on disk
  • Run usdcat scene.usda and usdview scene.usda to build command-line familiarity
โš ๏ธ
Common Mistakes
  • Confusing over (modifies only) with def (creates) โ€” over does NOT create a prim if none exists
  • Forgetting that inactive prims are excluded from stage.Traverse() by default
  • Mixing up primvar interpolation modes โ€” faceVarying (per face-vertex) is NOT the same as varying (per vertex)
  • Using float4 for a transform matrix โ€” correct type is matrix4d
๐Ÿ”—
Related Exam Topics
  • Data Modeling (~13%) underpins Composition (~23%) โ€” you can't understand layer stacks and LIVERPS without knowing what prims and properties are
  • Understanding the Sdf layer model from this topic is prerequisite before studying value resolution rules
  • Schema knowledge (UsdGeom, UsdShade, UsdLux) feeds directly into Visualization (~8%) questions
  • Debugging (~11%) tests whether you can read .usda output and identify issues at the property level โ€” your text-format literacy pays off there
Resources & References

Curated links to official materials for NCP-OUSD exam preparation.

Ready to put your knowledge to the test?

Start Free Trial โ†’ flashgenius.net/register
NCP-OUSD Exam Prep

Ready to Earn Your NVIDIA OpenUSD Credential?

Register for the NCP-OUSD exam on Certiverse and validate your USD Development expertise.