Forge Universe

Omniverse import

How to move Omniverse/USD construction assets into Forge Universe for browser visualization. For the GLB renderer and extension fields, see Construction assets.

Division of responsibility

USD / PhysX (authority) ──static──> GLB + catalog ──> Universe browser renderer
                     └──runtime──> WebSocket state-v1 ──> ForgeStateBridge

Use Omniverse or Isaac Sim for physics, vehicle control, sensors, and USD composition. Use Forge Universe as a lightweight browser client and digital-twin presentation layer.

A GLB export is visual geometry only — not PhysX behavior, soil models, or hydraulic constraints.

Static transfer (USD → GLB → scene)

  1. Identify the composed USD prim for the machine.
  2. Export or convert visual geometry to Blender-compatible USD, FBX, or glTF.
  3. In Blender, split and pivot moving parts; export Y-up GLB.
  4. Store the GLB under assets/models/construction/ in the Forge Universe source tree.
  5. Add a v1-compatible node to a scene under assets/scenes/ (primitive proxy + asset + articulation).
  6. Run python3 generator/build-site.py.

Preserve Omniverse rigid-body names through conversion; map them to GLB node names in articulation.joints[].node.

Extract joint metadata

From the extension pack (extensions/construction-assets/tools/):

/path/to/isaac-sim/python.sh extensions/construction-assets/tools/omniverse_extract_articulation.py \
  --usd /path/to/excavator.usd \
  --root-prim /World/Excavator \
  --output excavator-articulation.json

Compare emitted node names with the GLB:

python3 extensions/construction-assets/tools/inspect_glb.py excavator.glb --json

Rename GLB nodes or edit articulation metadata until joints align. Visually test every joint — USD and glTF local axes can differ after coordinate conversion.

Coordinate conventions

The browser adapter expects:

  • right-handed Y-up coordinates matching the exported glTF/GLB;
  • meters for positions and prismatic joint values;
  • degrees for internal Euler and revolute joints;
  • quaternion order [x, y, z, w] when streaming quaternions.

The state bridge can convert radians and cm/mm when declared in the message. Apply any stage-to-export root transform at the publisher, not in the browser.

Runtime state stream

Message type: forge-universe/state-v1. Entity id values must match scene node IDs; joint keys must match articulation.joints[].id.

{
  "type": "forge-universe/state-v1",
  "sequence": 100,
  "coordinateSystem": "gltf-y-up-right-handed",
  "positionUnit": "m",
  "rotationUnit": "rad",
  "entities": [
    {
      "id": "excavator-01",
      "pose": { "position": [0, 0, 0], "quaternion": [0, 0, 0, 1] },
      "joints": { "slew": 0.0, "boom": 0.35, "stick": -0.2, "bucket": 0.55 }
    }
  ]
}

Connect in the demo with ?ws=wss://host/path or wire ForgeStateBridge in a custom page.

Install into a checkout

# Vendor Three.js ES modules (once per pack update)
cd extensions/construction-assets && npm install && npm run vendor

# Copy js/css/assets into repo roots (not website/)
python3 extensions/construction-assets/tools/install_into_forge_universe.py

python3 generator/build-site.py

Non-goals (v1)

  • Bundling third-party commercial Omniverse meshes in CI
  • Running Isaac Sim in CI
  • Replacing UniverseSim with PhysX
  • Live Nucleus sync

Related