OpenUSD
Related classes: Representation · OpenUSD_Prim_Binding · OpenUSD_Layer · Analytic_Shape · Box_Shape · Spatial_Constraint · OpenUSD_LOD_Heuristic
OpenUSD is the scene-description format Mapped uses for 3D. The ontology does not model USD stages, prims or coordinate frames; it models the durable facts needed to find geometry for a semantic entity and to say what that geometry may be used for. Those facts live in fifteen classes under dtmi:mapped:openusd, all of them children of Meta rather than Entity: they are metadata about the graph, not things in the building.
The six groups
| Group | Classes | Role |
|---|---|---|
| Representation | Representation → Collision_Representation, Navigation_Representation | Declares how an entity's geometry may be used |
| Analytic shape | Analytic_Shape → Box_Shape, Capsule_Shape | Parametric geometry that needs no USD asset |
| Prim binding | OpenUSD_Prim_Binding | A reified link from a graph vertex to one prim path in one layer |
| Layer | OpenUSD_Layer | A resolvable USD file and, for root layers, the stage metadata |
| LOD heuristic | OpenUSD_LOD_Heuristic → OpenUSD_LOD_Distance_Heuristic, OpenUSD_LOD_Screen_Size_Heuristic | Level-of-detail selection policy |
| Spatial constraint | Spatial_Constraint → Containment_Constraint, Keep_Out_Constraint, Support_Constraint | Explicit spatial rules for position fusion |
Representation, Analytic_Shape, Spatial_Constraint and OpenUSD_LOD_Heuristic describe themselves as abstract: instantiate a subclass.
How a Thing or Place gets geometry
Thing and Place both have hasRepresentation → Representation. The relationship is many-to-many by design: one Representation shared by a thousand identical racks is how prototype instancing is expressed, without a separate instanceOf predicate.
A Representation holds no geometry itself. It is realised by exactly one of:
hasShape→ an Analytic_Shape. Box_Shape takesextentMeters(three half-extents along local X, Y and Z); Capsule_Shape takesradiusMetersandheightMeters, aligned with local +Z. Shapes are unplaced definitions centred on themselves; placement comes from the subject entity.hasPrimBinding→ an OpenUSD_Prim_Binding, whichresolvesInLayer→ an OpenUSD_Layer.
Its own properties are coordinateFrameId (an opaque key into an external coordinate-frame registry: frames resolve outside the graph), geometryHash (a digest so a representation versions independently of its siblings) and name / description. The subclasses add intent: Collision_Representation carries collisionApproximation and closedVolumeRequired and is the only way a render mesh becomes collision geometry; Navigation_Representation carries navigationEffect (traversable or obstructed) and has no equivalent in core USD.
Entity also has hasPrimBinding directly. Per its description this is "pure addressing that carries no physical claim": it says where the entity is in the scene, not that the prim's geometry represents it.
Prim bindings
An OpenUSD_Prim_Binding exists because relationships cannot carry properties, and the association needs its own identity, provenance and validity window. Its properties describe the association, never the prim:
| Property | Meaning |
|---|---|
primPath (required) | Absolute Sdf path, e.g. /HallA/Row01/Rack001 |
primTypeName, requiredAPISchemas | What the binding expects on the composed prim (Xform, Mesh; PhysicsCollisionAPI), checked at resolve time |
openUSDPurpose | USD purpose token: default, render, proxy or guide |
variantSelections | Variant-set selections applied at resolve time |
isAuthoritativeForPose (required) | Whether physical systems may take pose from this binding; normally false, at most one true per entity at any instant |
validFrom, validThrough | Validity window |
lodIndex, lodDefaultIndex, lodOverrideMode, lodOverrideIndex | Level-of-detail authoring, below |
Relationships: resolvesInLayer → OpenUSD_Layer (open a stage with that layer as root, under its resolver context), hasLODItem → child bindings, hasLODHeuristic → heuristics.
Layers
An OpenUSD_Layer is a durable, resolvable USD artifact: openUSDAssetIdentifier (the resolver identifier), resolverContext, contentHash (e.g. sha256:…), mimeType and schemaProfile. Root layers additionally carry the stage metadata USD stores there: openUSDMetersPerUnit, openUSDKilogramsPerUnit, openUSDUpAxis (Y or Z), openUSDHandedness and openUSDTimeCodesPerSecond. referencesLayer covers sublayer, reference and payload arcs with one predicate, for impact analysis; isGeneratedFrom → Entity records provenance from an IFC or DWG File or a floor plan; hasFile links the stored file.
Level of detail
A binding with hasLODItem edges is an LOD root; each item carries lodIndex. The root's hasLODHeuristic names one or more OpenUSD_LOD_Heuristics, one per lodDomain. OpenUSD_LOD_Distance_Heuristic selects by distance from lodCenterMeters with ascending lodDistanceThresholdsMeters; OpenUSD_LOD_Screen_Size_Heuristic selects by viewport coverage of lodExtentMeters with descending lodScreenSizeThresholds. Either can point at a bounding volume with hasLODBoundingVolume.
Spatial constraints
Without a constraint, position fusion is stateless: nothing clamps a body to a floor. A Spatial_Constraint is the opt-in, attached from a Thing or Place with hasConstraint, with exactly one constrainsSubject and one constrainsAgainst (a Representation for geometric modes). Required: constraintEnabled, constraintHardness (HARD, SOFT or ADVISORY) and constraintMode (VALIDATE_ONLY, PROJECT, TRUNCATE or REJECT); optional toleranceMeters, diagnosticCode and a validity window. The three subclasses: Containment_Constraint (stay inside a volume), Keep_Out_Constraint (do not intersect a volume; adds clearanceMeters) and Support_Constraint (rest on a surface).
What the data does not say
- There is no mesh, point-cloud or render-only
Representationsubclass; a plainRepresentationwith a prim binding is the general case. - Only box and capsule shapes exist: no sphere, cylinder or convex hull.
- Coordinate frames, stages and prims are deliberately not classes;
coordinateFrameIdvalues are opaque to the ontology. - Bindings resolve the static composed transform at the default time code;
openUSDTimeCodesPerSecondis not a timeline mapping.