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)
- Identify the composed USD prim for the machine.
- Export or convert visual geometry to Blender-compatible USD, FBX, or glTF.
- In Blender, split and pivot moving parts; export Y-up GLB.
- Store the GLB under
assets/models/construction/in the Forge Universe source tree. - Add a v1-compatible node to a scene under
assets/scenes/(primitive proxy +asset+articulation). - 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
UniverseSimwith PhysX - Live Nucleus sync
Related
- Construction assets — extension fields and demo
- Universe vs Omniverse — capability matrix