Forge Universe

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.py
  • tools/omniverse_extract_articulation.py — USD/PhysX joint metadata
  • catalog/ — 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