Proposal: measured materials at true size in host 3D views (capture device → USD/MDL → Omniverse + Substance 3D Modeler) #2419
Replies: 5 comments
Update: more scanner formats (device-neutral in code)The library now reads exports from several material scanners, not just the one we tested. Commit
How it works:
Pending:
🤖 Generated with Claude Code |
Update: on the panel, side by sideUSD Composer (docked 3D) and Substance 3D Modeler (embedded) ran side by side with captured materials, each in its own window, on the tested display. Composer live-followed the USD + OmniPBR stage; Modeler took the What we learned:
Code: commit
23 tests pass. Demo materials were CC0 scans used locally only; none are in the repo. Pending: a seated comfort measurement at the fitted strength, the Modeler USD → Kit round trip, and real scanner exports. 🤖 Generated with Claude Code |
Update: Substance 3D Sampler export confirmedA real Substance 3D Sampler 6.0.4 export, made from a CC0 photo, confirms the Sampler row of the format table:
Format table status: Sampler confirmed; Pantora export naming still assumed. Commit For integrators: never assume an exporter's normal-map convention. Measure it, or state it per export. 🤖 Generated with Claude Code |
Final update: lossless height maps, glTF-ready normals, statusSince the Sampler update:
Status:
Still open:
For integrators:
🤖 Generated with Claude Code |
Update: seat-tested on the panelStatus: seat tested (2026-10-28) on a Leia SR panel, using the installed DisplayXR 2.55.0 runtime (Program Files, What was run: USD Composer with the material extension, in the default desk view (35° down, 30 cm swatch with relief from the height map). The run covered:
Results:
Fix found during the run: a material loaded before the 3D session started was framed only in the 2D viewport, so the 3D view opened at the bridge's default distance until the user re-framed it. The extension now re-frames by itself about 1.5 s after 3D starts, so no manual step is needed. Commit For integrators: in Kit, frame content once the 3D session has started, not only when it loads. Check the framing with a woven atlas capture taken after that re-frame. Open notes (not blocking):
🤖 Generated with Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
A photometric material scanner, driven by a material-authoring app (Substance 3D Sampler), produces PBR map sets (basecolor / normal / roughness / metallic / height / opacity / AO, plus anisotropy and sheen) or
.sbsar. The scanner has no 3D view of its own, so we treat it as content, the same as generated 3D (#2391). A small stdlib-only library turns each export into host content, and existing DisplayXR 3D windows show it.Device-neutral by design. Several commercial photometric material scanners exist, and the library only needs a PBR map set (or
.sbsar) plus the capture size. So any scanner whose software exports those works the same way. The tested device is one of these scanners, used through Substance 3D Sampler.Code: private repo, commit
c8c5cc2(Apache-2.0 + NOTICE; no third-party assets bundled). Tests: 10/10.What it does
Real size is required. Without it, 1:1 inspection on the glass and the comfort budget mean nothing. The size comes from, in order:
USD:
defaultPrim, bindings inside it, relative textures.customDataplus a sidecar.Inspection shapes as a variant set: a drape (shallow folds), a flat swatch, and a 3×3 tile for checking seams, all with real-size UVs. They're shallow on purpose: the desk-display comfort band is thin, so there's no sphere. All three are predicted to fit the budget at 30 cm with no camera push-back; a panel measurement is pending.
Live: a watched drop folder. Each capture is versioned and the live stage is swapped in atomically, so hosts reload on mtime and never see a half-written stage.
Omniverse Kit: a thin extension that can:
Verified headless on Kit 110.4: the MDL binds, the 30 cm drape is at true size, and live reload works.
Substance 3D Modeler (Proposal: DisplayXR for Adobe Substance 3D Modeler (closed legacy OpenXR app, dedicated 3D window, Leia SR tested) #2394): version 1.22 has no
.sbsaror MaterialX import, so the material goes in as a textured glb/usda through Import mesh. In the glb, roughness and metalness are constants.Target class
None of its own; see the target-class comment. It rides on the hosts' own viewport or dedicated 3D window. From the host library it needs:
Status
Tested with a synthetic material only.
Pending:
🤖 Generated with Claude Code
All reactions