Construction assets
Forge Universe can render Omniverse-prepared GLB models as additive extensions on standard v1 scene nodes. Legacy renderers ignore asset, articulation, and semantics fields; the dedicated ES-module renderer loads meshes and drives kinematic joints.
Live demo: /demos/construction-assets.html (hash Uca). Import workflow: Omniverse import.
Design principle
Do not add type: "mesh". Keep a valid primitive type plus size or radius as a fallback proxy; attach:
| Extension | Purpose |
|---|---|
asset |
GLB URI, scale, offset, shadow flags |
semantics |
Class, license, source metadata |
articulation |
Kinematic joints mapped to GLB node names |
animation |
Optional clip references (v1 stub) |
controls |
Keyboard bindings for joints (scene-level) |
Scene example
assets/scenes/construction-site.json defines excavator, articulated truck, and worker nodes. Each node uses type: "hexahedron" with a box proxy and an asset.uri pointing at /assets/models/construction/*.glb.
Renderer modules
Load order for the construction demo (ES modules + import map):
| Module | Role |
|---|---|
js/forge-universe-assets/asset-world.mjs |
Scene validation, URI resolution, pose helpers |
js/forge-universe-assets/articulation-runtime.mjs |
Joint limits and GLB node binding |
js/forge-universe-assets/asset-renderer.mjs |
Three.js mount, GLTFLoader, orbit controls |
js/forge-universe-assets/state-bridge.mjs |
WebSocket forge-universe/state-v1 consumer |
Three.js ES modules live under js/vendor/three/ (separate from the IIFE three.min.js used by drone/sim demos).
API surface
import { mount } from '/js/forge-universe-assets/asset-renderer.mjs';
const app = await mount('#forge-stage', '/assets/scenes/construction-site.json', {
shadows: false,
maxPixelRatio: 1,
});
app.setJoint('excavator-01', 'boom', 25);
app.describe(); // per-asset joint state
Optional runtime stream: add ?ws=wss://host/path to connect ForgeStateBridge for Omniverse-published poses and joint values.
Kinematic vs physics
Construction articulations are presentation-only. They do not use UniverseSim or sim.bodies. For in-browser rigid bodies see Simulation. Omniverse/PhysX remains the physics authority when streaming state.
Tools and extension pack
Packaged under extensions/construction-assets/ in the repo:
tools/prepare_asset.py,blender_ingest.py,make_scene_node.pytools/omniverse_extract_articulation.py— USD/PhysX joint metadatacatalog/— preset entries for common construction vehicles (download separately)schemas/— JSON Schema for asset extensions and state-v1 messages
Sample GLBs ship in assets/models/construction/ (CC0 generated samples).
Realistic imports (third-party, static presentation): assets/models/construction/realistic/ — see /demos/construction-realistic.html (Ucr) and ATTRIBUTION.md in that folder.
Related
- Omniverse import — USD → GLB → scene node workflow
- Universe vs Omniverse — division of responsibility
- World model — core
nodesschema - Scene fixtures —
construction-site.json