Skip to content

Solid Models in USD - #109

Open
asluk wants to merge 45 commits into
PixarAnimationStudios:mainfrom
aousd:p2-usdsolid-schema
Open

Solid Models in USD#109
asluk wants to merge 45 commits into
PixarAnimationStudios:mainfrom
aousd:p2-usdsolid-schema

Conversation

@asluk

@asluk asluk commented May 20, 2026

Copy link
Copy Markdown

Description of Proposal

Summary

Introduce UsdSolid, a boundary representation (Brep) schema for OpenUSD built on the Radial Edge Data Model. The schema supports manifold and non-manifold solids, sheet bodies, and wireframes, with explicit topological relationships and a packed UsdSolidBrepArray design that limits prim count for large assemblies.

This is the technical companion to the Boundary Representation Geometry in OpenUSD — Problem Statement proposal (PR #108); please review that proposal first for use cases and motivation. Both proposals are opened against main, so this PR's diff includes the P1 problem-statement file as well as the P2 schema files until P1 merges; reviewers may wish to focus on proposals/UsdSolid/ here.

This proposal is from the AOUSD Geometry Working Group.

Problem statement

OpenUSD has no native representation for mathematically exact solid geometry. The companion problem statement develops the use cases and design considerations in depth. In brief, manufacturing, AECO, robotics, simulation, and digital-twin workflows require exact Brep geometry that mesh and subdivision-surface types cannot express. This proposal provides a candidate schema.

Glossary

The full Brep glossary lives in the companion problem statement's Appendix A; this proposal's Glossary section adds only the schema-specific terms:

  • BrepArray -- A UsdSolidBrepArray prim that holds one or more Breps in a packed, flat representation. Each Brep's topology, geometry, and metadata are concatenated into shared arrays and delineated by per-Brep counts and offsets.
  • Wire edge -- A wireEdge is a topologically standalone edge that is not part of any face loop. Wire edges carry the same curve geometry as loop-bounding edges but exist independently as one-dimensional features within a shell.
  • Radial Edge Data Model -- A non-manifold-capable topological data model (Weiler, 1986) that supports manifold solids, non-manifold solids, sheet bodies, and wireframes through a unified "use" abstraction (edgeuse, faceuse).

Reference Links

Details

The proposal is organized as Introduction → Glossary → Design → Schema → Examples → References.

Design introduces the Brep data model in three layers — shape, topology and "use", and Brep — and then walks through USD-implementation choices including UsdSolidBrepArray, instancing, geometry typing, modeling Breps on a UsdStage, and trimming curves. Subsections on Flexible design possibilities and Other implementations considered document the design space the proposal explored before converging on the Radial Edge model and a packed BrepAPI on a typed prim. Assemblies, tolerance, validation, risks, and open questions follow.

Schema is a complete prelimUsdSolid schema definition (prelimUsdSolid prefix and skipCodeGeneration = true, following the OpenUSD convention for WIP schemas; both will be stripped on acceptance, matching the path Gaussian splats took).

Examples narrate five .usda cases covering cube, non-manifold cubes, cube with internal void, BrepArray with multiple Breps, and per-face materials.

Design choices worth highlighting for reviewers:

  • Radial Edge over winged-edge / half-edge -- chosen for explicit non-manifold support, which industrial assemblies require. The topology models in PRC, STEP, and Parasolid map into the Radial Edge model.
  • Packed BrepArray -- a UsdSolidBrepArray typed prim with a multiple-apply UsdSolidBrepAPI keeps prim counts tractable for large assemblies. The trade-offs against one-prim-per-Brep and one-prim-per-geometry-object alternatives are documented in the Design section.
  • Double-precision geometry -- proposed for NURBS control vertices, weights, and knots (and analytic surface parameters), addressing a known limitation of existing UsdGeomNurbsCurves / UsdGeomNurbsPatch for CAD interchange.
  • PRC geometry-type catalog as target -- the proposal lists the full set of analytic curves, surfaces, and volumes (Helix, Revolution, Extrusion, Torus, etc.) that the schema is structured to accommodate. NURBS land first; the analytic types are an extension path, not a v1 deliverable.

Risks

From the proposal's Risks subsection:

  • Validation complexity. Full geometric validation (self-intersection, tangency, tolerance enforcement) requires a geometry kernel and is outside the scope of OpenUSD. Topological validation is in scope; geometric validity depends on third-party libraries.
  • Geometry kernel dependencies for rendering. Tessellation of Breps for rendering requires a kernel. OpenUSD does not ship one; adoption depends on the ecosystem (open source or commercial kernels) consuming UsdSolid data.
  • Performance at scale. Large assemblies (thousands of Breps, tens of thousands of faces) drove the packed UsdSolidBrepArray design, but composition, layering, and instancing performance remain to be characterized with production datasets.
  • Ecosystem readiness. DCCs, viewers, and engines will need to add Brep support before the schema delivers end-user value.
  • Data quality dependence on exporters. Authoring happens outside OpenUSD; quality tracks exporter quality. The WG is considering reference datasets and a conformance suite.

Alternate solutions

The proposal's Other implementations considered subsection documents the alternatives evaluated:

  • One UsdPrim per geometry object -- rejected on prim-count grounds at industrial-assembly scale.
  • One UsdPrim per Brep -- rejected for the same reason; assemblies routinely contain thousands of Breps.
  • Breps as an Applied API on existing prim types -- considered; the typed-prim approach with a multiple-apply API was preferred for stronger schema semantics on the container.
  • Breps as a black box (opaque file reference) -- rejected because it forfeits USD's composition, layering, and per-element property assignment. The companion problem statement develops the full rebuttal.

Out of Scope

  • Detailed schemas for analytic geometry types -- the catalog is identified (Helix, Revolution, Extrusion, Torus, etc.) and the schema is structured to accommodate them, but their detailed designs are deferred to a follow-up revision.
  • Brep <-> Mesh correlation -- identified as an open question. A candidate approach (gprim back-references via an applied API) is sketched in Open Questions; full design is deferred until the core schema is in use.
  • CAD assemblies as a schema -- whether assemblies warrant a dedicated schema or a best-practices guide built on instancing and constraints is unresolved; covered in Open Questions.
  • Constraint systems for assembly simulation -- mates, joints, kinematic constraints; identified as open. May belong here, in a separate schema, or in an OpenUSD-wide proposal.
  • Migration tooling from STEP, PRC, Parasolid -- detailed mappings and exporter implementations are downstream work.
  • Implementation in OpenUSD -- staged separately, modeled on the Gaussian splats path (prelimUsdRenderGaussianUsdRenderGaussian after community use).

Link to Rendered Proposal

Supporting Materials

The proposal includes six diagrams (proposals/UsdSolid/images/) illustrating the Radial Edge data model, BrepArray structure, and face-material binding. Five narrated .usda examples accompany the schema.

Contributing

asluk and others added 30 commits May 14, 2026 14:30
Add proposals/cad_geometry/README.md establishing why OpenUSD needs
a native Brep schema. Companion to the UsdSolid schema proposal.
New bullet under 'Additional use cases by domain': wireframe-from-Brep
as a deliberate visualization mode (simplified views, feature emphasis,
internal detail) and as an IP protection mechanism (strip surfaces,
retain wireframe only). Wire edges are first-class topology entities
in the proposed schema, so this mode requires no extra tessellation.

Main body: 518 lines (target ≤650). +107 words.
- Drop Omniverse + Xcelerator name-check; the trend stands without
  singling out vendors.
- 'Brep geometry stays in native formats' -> 'exact geometry stays in
  native formats'. Source geometry upstream of USD isn't always Brep;
  the point is that nothing beyond tessellated proxies reaches USD.
Edits to prepare the UsdSolid proposal for broader OpenUSD community review.
No changes to the schema (Section 3), examples (Section 4), or technical
design decisions in Section 2 (aside from typo fixes and a cross-reference
in 2.6.4).

Changes:
- Add status badge, summary, and table of contents
- Add Section 1.1 (Problem statement) with concrete industrial pain points
- Add Section 1.2 (Why not STEP / black box) incorporating FAQ content
- Rename original Section 1 content to Section 1.3 (Proposed approach)
- Add Section 1.4 (Glossary) from geometry-wg brep-glossary.md
- Fix typos throughout (12 items)
- Clean preamble tone for external audience; replace inaccessible Google
  Docs link; add FAQ cross-reference and missing-images note
- Convert HTML geometry table to Markdown
- Append editorial appendix (A.1-A.9) with restructuring proposals

Co-authors -- please review and align on:

1. Section 1.1-1.2: Does the problem statement and STEP/black-box rebuttal
   accurately represent the WG's position? These are now the first thing
   reviewers will read.

2. Section 2.6.4: Now cross-references 1.2 instead of standalone rationale.
   Confirm this reads correctly in context.

3. Appendix A.8: Plan to incorporate the remaining two FAQ answers into
   Sections 2.5 and 2.6.1. Agree/disagree?

4. Appendix A.9: We need to summarize the "CAD and BIM use cases" doc
   inline since the Google Doc link is not public. Who can provide the
   content?

5. Appendix A.1-A.7: Longer-term restructuring ideas (template alignment,
   example narration, risks, open questions). Which of these should we
   prioritize for the next pass?

Made-with: Cursor
Clarify in preamble that Brep-to-Mesh connectivity is not a
prerequisite for deploying the core Brep schema. Add Steve's
concrete suggestion (gprim back-references via API schema) to
the open questions section as a candidate follow-up approach.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Incorporates Steve Ghee's feedback that the limitation is not the CAD
vendor but the choices made by the person exporting to USD, who may not
have full insight into all downstream use cases.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Address PR PixarAnimationStudios#8 review comment:
- Fix Weiler thesis link (scorec.rpi.edu 404 → tecgraf.puc-rio.br)
- Fix TechSoft PRC spec link (updated path)
- Remove brep:type from schema definition and all five .usda examples

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…statement

- Section 1.1 now references companion problem statement instead of
  repeating motivation, gap analysis, and STEP/opaque arguments
- Section 1.2 (Why not STEP) removed; renumbered 1.3→1.2, 1.4→1.3
- Preamble: condensed Brep↔Mesh scope note, added derive-on-demand context
- Removed FAQ document reference (content absorbed into both proposals)
- Added TODO annotations at 2.5 and 2.6.1 for FAQ content incorporation
…AQ file

- §2.5: add BrepArray-is-not-an-assembly rationale before subsections, note
  sparse overrides as future work.
- §2.6.1: frame the per-geometry-object design choice as use-of-designs
  (consumption) vs CAD authoring, per FAQ.
- Delete proposals/UsdSolid/FAQ/ — all content now lives in the main proposal
  (here) or in Proposal 1 (STEP / black box rationale).
- Add Risks section (validation, kernel deps, scale, ecosystem, data quality).
- Add Open Questions section collecting deferred topics: CAD assemblies,
  Brep↔Mesh correlation (with Steve Ghee's N:1 back-reference proposal),
  constraint systems, STEP/PRC/Parasolid migration, sparse overrides.
- Fix missing period in '# 3 Schema' header; update TOC.
- Preamble: drop image-verification note (images confirmed in repo); drop
  dangling 'use cases maintained separately' reference to the private
  Google Doc (content to be inlined via Proposal 1).
- §1.2: normalize Weiler thesis URL (both prefixes were https/http mixed).
- §2.6.4: replace broken in-proposal anchor with a pointer to the companion
  problem statement where STEP/black-box rationale lives.
- §5: expand References — Weiler 1986, ISO 14739-1:2014 (PRC),
  ISO 10303 (STEP), Hertel & Fuchs use-cases (AOUSD internal v0.2).
asluk added 14 commits May 14, 2026 15:06
- §4 intro: reframe as 5 examples (was '4'); group by capability
  (topology vs. composition/materials); add NURBS-only note and
  reading tip.
- §4.1 Cube: add 'simplest possible manifold solid' framing; explain
  why 2 regions and 2 shells from a single cube; call out userIds as
  optional walk-through aids.
- §4.2 Non-manifold cubes: frame as 'what changes vs §4.1'; explain
  why 11 faces not 12; note that edgeuse:thisRadialEntryType first
  carries non-trivial info here.
- §4.3 Cube with void: frame as 'what changes vs §4.1'; walk through
  region:shellCount = [1, 2, 1]; call out first non-trivial NURBS.
- §4.4 BrepArray: frame as 'what changes vs §4.1–4.3'; explain per-Brep
  vs. topology array semantics; contrast with §4.2's shared topology.
- §4.5 Face materials: frame as 'what changes vs §4.4'; explain the
  Brep→Mesh material carry-through via GeomSubset.
- §0 Preamble: consolidate paragraph structure; name the Brep↔Mesh deferral
  explicitly (was 'For example, ...'); inline the problem-statement link
  instead of doubling it; fix 'pattern-where' → 'pattern — where'.
- §1.1: merge two short paragraphs into flowing prose; make
  'unaffected' explicit rather than passive 'would not be affected'.
- §1.2: eliminate 'We propose' opener and 'we intend to add them soon'
  (dangling TODO language); reframe as 'This proposal adopts ...';
  inline the Weiler thesis citation as a hyperlink; drop 'a well known
  ISO standard' → 'an ISO standard widely used for 3D content'.
- §2 intro: capitalize 'Radial Edge Data Model' consistently; drop
  contractions ('don't' → 'do not', 'isn't' → 'is not'); smooth
  sentence flow.
- §2.1: fix 'that currently supported' → 'than currently supported';
  replace 'We recommend' and 'We also suggest' with impersonal forms;
  consolidate comma-separated prose into flowing sentences.
Was rendering as a top-level section instead of under §1.
Explains the prelim prefix convention + skipCodeGeneration = true for
readers unfamiliar with the OpenUSD preliminary-schema lifecycle.
Cites UsdRenderGaussian as precedent.
All non-blocked editorial work complete. File at 1423 lines (was 1534).
Remaining work blocked on Joe/Martin response to PHASE3A-FINDINGS.md
and Steve Ghee's use case for Proposal 1.
Strip numbered section prefixes and bold wrapping from all headers.
Restructure to match the standard ## Section / ### Subsection / ####
pattern used by other proposals in the repo (hydra2, materialx-versioning,
usd-validation-framework, semantic_schema, etc.).

Key structural changes:
- §0 Preamble + §1 Purpose and scope → '## Introduction' with subsections
- §1.3 Glossary promoted to '## Glossary' (top-level, matches its weight)
- §2 Overall design concerns → '## Design'
- §3/4/5 → '## Schema' / '## Examples' / '## References'
- All §N.M.K subsections → descriptive ### / #### headers
- TOC regenerated from new headers
- All internal cross-references converted from '§2.7' style to
  named anchor links ('[Assemblies](#assemblies)')
- Sentence-cased subsection titles where appropriate
Glossary was ~40 lines of near-duplicate definitions already in
Proposal 1's Appendix A. Replace with a cross-reference and keep
only schema-specific terms (BrepArray, Wire edge) that P1 does
not define. Eliminates drift risk between the two documents.
Five changes to reduce redundancy for readers who arrive from the
companion problem statement:

1. Introduction: cut redundant motivation recap (3 paragraphs → 2);
   merge Problem statement subsection into Introduction opener; remove
   Brep↔Mesh deferral paragraph (now lives in Open questions).
2. Proposed approach: drop restated 'why Radial Edge' rationale; link
   back to P1's design principles instead.
3. Design section: add skip-ahead note for readers already familiar
   with Brep topology from the companion document.
4. Risks: add one-line cross-reference to P1's ecosystem-level risks.
5. Open questions: Brep↔Mesh deferral now points to P1, not to
   Introduction (which no longer discusses it).
… editorial work

Integrates SolidModels-editorial0 (post PR PixarAnimationStudios#12 merge) into the
editorial branch. Joe's changes:
- Remove all *:userId attributes from schema and examples
- Update examples to packed form (brep:extent, face:range, edge:range)
- Fix surface control vertex ordering
- vector3d[] → point3d[] for vertex positions

Re-applied on top of editorial work:
- Prelim prefix implementation note
- Example narration ('What changes' lead-ins for all 5 examples)
- Expanded References section
- Cut stale editorial appendix (was still in Joe's base)
Category A (9 typos):
- Double period in edgeuse:orientationType.same doc
- 'facuseCount' → 'faceuseCount' in shell:pointType doc
- 'BrepEdgeCurveNurbAPI' → 'BrepCurve3dNurbAPI' in edge:curveType doc
- 'geometrty' → 'geometry' in BrepPointAPI comment
- 'geomtery' → 'geometry' in BrepMultiPointAPI comment
- 'connetions' → 'connections' in edgeuse:thisRadialEntryType doc
- 'analagous' → 'analogous' in BrepCurve3dNurbAPI doc
- wireEdge:vertexIndices doc referenced Edge_ii/Edge:Range → WireEdge_ii/WireEdge:Range
- wireEdge:vertexIndices doc 'number of Edges' → 'number of WireEdges'

Category C (binormal wording):
- 'binormal side' → 'positive-normal side' in edgeuse:orientationType
  doc, consistent with the prose in the Design section
Joe confirmed 'binormal side' is the intended term in
edgeuse:orientationType doc string.
TASK.md and PHASE3A-FINDINGS.md were working documents for the
editorial cleanup. All items resolved; audit trail posted to issue PixarAnimationStudios#9.
The previous bullet asserted a "NURBS-first MVP" framing that was an
interpolation, not WG consensus, and didn't match the companion schema
proposal's actual scope. The replacement frames exact geometry as a
broad catalog (per PRC ISO 14739-1:2014) where the schema proposal
targets the full catalog while staging detailed schema designs
incrementally, beginning with NURBS curves and surfaces.

Discussed and concurred on dry-run PR PixarAnimationStudios#14 by Chris Hawkins
(chris-hawkins-usa) and Joe Umhoefer (umhoefer).
@dgovil

dgovil commented May 27, 2026

Copy link
Copy Markdown
Contributor

Hi Aaron,
I am just relaying some internal feedback:

Can we reconsider deferring the correlation between the BRep and the tessellated mesh? These are the two main concerns:

Vendor divergence risk: If we ship without a standardized correlation mechanism, individual CAD vendors might develop their own conventions to bridge the two representations. Once these conventions become widely adopted and assets rely on them, standardizing later becomes a migration issue rather than a design challenge. The cost of getting this right upfront is significantly lower than the cost of reconciling multiple vendor-specific schemes later.

Tessellated mesh may not always be present: CAD vendors might choose not to ship a tessellated mesh at all if the correlation path is unclear. If the contract for going BRep - mesh isn’t clearly defined, the safest choice for a new vendor is to ship BRep only and let consumers tessellate. This is arguably a worse outcome than having a dual representation, and it’s the default we’ll end up with if we defer.

@asluk

asluk commented May 27, 2026

Copy link
Copy Markdown
Author

Hi Aaron, I am just relaying some internal feedback:

Can we reconsider deferring the correlation between the BRep and the tessellated mesh? These are the two main concerns:

Vendor divergence risk: If we ship without a standardized correlation mechanism, individual CAD vendors might develop their own conventions to bridge the two representations. Once these conventions become widely adopted and assets rely on them, standardizing later becomes a migration issue rather than a design challenge. The cost of getting this right upfront is significantly lower than the cost of reconciling multiple vendor-specific schemes later.

Tessellated mesh may not always be present: CAD vendors might choose not to ship a tessellated mesh at all if the correlation path is unclear. If the contract for going BRep - mesh isn't clearly defined, the safest choice for a new vendor is to ship BRep only and let consumers tessellate. This is arguably a worse outcome than having a dual representation, and it's the default we'll end up with if we defer.

Hi @dgovil — thanks for surfacing this. Responding for whoever raised it:

Correlation isn't deferred — it's a separate concern from the Brep schema. The companion problem statement's Coexistence with meshes principle already says Brep and Mesh "should be relatable… but neither should require the other," and the mechanism is "separable from the core Brep schema." This proposal's Open Questions section has a "Brep↔Mesh correlation" entry sketching a candidate from Steve Ghee: an applied schema on the derived gprim that back-references the source Brep — the active follow-on path.

Two reasons it sits there:

  • Broader than Brep↔Mesh. Source/derived pairs aren't unique to CAD — subdivision cages and limit surfaces, sim results and viz meshes, LoD chains. A mechanism designed only for UsdSolid would need rework when the next pair appears. It belongs in its own proposal, seeded by prior discussions.
  • USD composition supports the separation. The correlation mechanism sits outside UsdSolid's domain entirely; the core Brep schema stays self-contained.

On the two specific concerns:

Vendor divergence. The Ghee sketch signals direction. Vendor-prefixed proposals exploring variations are welcome — AOUSD's vendor → multi-vendor → core pattern (cf. PR #105) converges rather than fragments. Symmetric risk: continuing to block the Brep schema leaves vendor-specific Brep encodings hardening in customData and opaque payloads — a divergence we're already paying for.

Brep without companion mesh. The problem statement frames this as a desired direction, not a worse outcome — see "'Derive on demand' is replacing pre-tessellation" and Hero Use Case 2 (consumer-controlled data quality). The schema doesn't preclude shipping both; the question is whether the correlation contract must land in v1, and we don't think so. Real data on real stages is how the community converges on the right mechanism.

Best,
@asluk and @umhoefer

@martinpwnv

Copy link
Copy Markdown

Could I suggest moving the schema.usda out of the main doc where it is a bit hard to find (currently in a collapsible section) and have it be a standalone file in the repo that lives alongside the document?

Per Martin Watt's review on PR PixarAnimationStudios#109: move the schema definition out of the
collapsible <details> section in README.md into a sibling schema.usda file so
it is easy to find and lives alongside the document. Content is byte-identical
to the previously inlined block; README now links to ./schema.usda.
@asluk

asluk commented Jun 7, 2026

Copy link
Copy Markdown
Author

Good call, Martin — done. The schema now lives as a standalone schema.usda alongside the document, and the README links to it instead of burying it in a collapsible section. The content is byte-identical to the previously inlined block (no edits beyond the move). Pushed as 811f03c.

@asluk

asluk commented Jun 11, 2026

Copy link
Copy Markdown
Author

Re: schema.usda extraction — tradeoff + a future idea

Moving the schema into a sibling schema.usda is the approach we've landed on for now. It has real tradeoffs worth noting for the record:

Wins

  • Single canonical, machine-readable copy (good for tooling/codegen)
  • No drift between an inlined block and the real schema
  • Easy to find, lives alongside the doc

Cost

  • Schema no longer visible in place in the proposal
  • Relative ./schema.usda link works on GitHub's web view, but breaks in portable/offline renderings — a PDF or static export (e.g. Pandoc) can't follow it, so "read the proposal on the go" hits a dead reference

Future work for consideration

  • If "canonical file + reference from prose" becomes a common pattern, a small proposal build step could transclude the file into the rendered doc (marker comments + CI staleness check) — one source of truth and self-contained artifacts (GitHub / PDF / offline)

Flagging only; not proposing we act on it here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Draft

Development

Successfully merging this pull request may close these issues.

5 participants