A USD viewer on the web.
Open USD Viewer
There are two main parts:
- USD WASM bindings by Autodesk
- A Three.js Hydra Delegate for rendering, originally by Autodesk and improved by hybridherbst
- You can load USDZ files, folders, multiple files.
- Try the Kitchen Set from here
- Try assets from Asset Explorer
- There is a heuristic to determine what the root file is - it's not perfect.
- Up axis is only supported for the root file (and very hacky).
- Variants are loaded but can't be switched.
- The viewer uses SharedArrayBuffers, which have strict header and origin requirements and are not supported on all platforms.
- Skinned meshes aren't supported.
- Vertex colors aren't supported.
- Point instancing isn't supported.
- MaterialX isn't supported.
- LightsAPI isn't supported.
- Texture paths currently can't be resolved correctly for nested USDZ files. One level is fine.
- Fixing this would require adjustments to the WASM bindings.
- clone this repository
- run
npm install
- run
npm run start
- open
http://localhost:<port>
in your browser (Note: 0.0.0.0 won't work since it doesn't have SharedArrayBuffer permissions)
The three.js Hydra Delegate is in public/ThreeJsRenderDelegate.js
.
Loading and rendering are currently intermingled in public/index.html
.
NOTE: Origins for these instructions can be found here
- Setup emscripten if it's not already setup.
- Download and Install emscripten from HERE.
- MacOS
- Download and install the latest SDK tools.
./emsdk install 3.1.47
- Make the specific SDK "active" for the current user. (writes .emscripten file)
./emsdk activate 3.1.47
- Activate PATH and other environment variables in the current terminal
source ./emsdk_env.sh
- Download and install the latest SDK tools.
- Windows
- Download and install the latest SDK tools.
emsdk install 3.1.47
- Make the specific SDK for the current user. (writes .emscripten file)
emsdk activate 3.1.47
- Download and install the latest SDK tools.
- Pull this branch from Autodesk's USD fork
git clone --recursive https://git.autodesk.com/autodesk-forks/usd/tree/adsk/feature/webgpu
- Build USD-wasm
- Go into the root of usd source repo, if the folder name is "usd_repo"
cd usd_repo
- Build USD with the --emscripten flag, for example "../build_dir" is your local build folder
2.
python3 ./build_scripts/build_usd.py --emscripten ../build_dir
- This will put the resulting files in ../build_dir/bin
emHdBindings.js
emHdBindings.wasm
emHdBindings.worker.js
emHdBindings.data
- Note: It's possible the build will fail due to comments in
pxr/base/arch/hints.h
, removing all comments from line 1-26 allowed the build to complete successfully
- Go into the root of usd source repo, if the folder name is "usd_repo"
Based on autodesk-forks.github.io/USD/usd_for_web_demos
Code here: github.com/autodesk-forks/USD/tree/gh-pages
This project: github.com/needle-tools/usd-viewer
- added drag-and-drop loading
- dropping folders and multiple files is supported (experimental)
- g,b texture channels were missing with RBGFormat
- files of the form somefile.usdz[./textures/myTexture.jpg] weren't resolved correctly
- UVMap primvar type wasn't correctly resolved to uv
- support for texture wrap modes
- support for texture transforms (rotation isn't properly working yet)
- fixed output color space, added neutral HDR, fixed point light changing color appearance of scene
- very hacky support for up axis on the root file
- added camera orbit dampening
- setting policy headers server-side instead of via ServiceWorker
Some JavaScript features used here require specific HTTP headers (SharedArrayBuffers).
This was originally achieved by using the service worker from here: github.com/gzuidhof/coi-serviceworker.
Now, headers are set server-side which should have wider support / better caching.
res.setHeader("Cross-Origin-Embedder-Policy", "require-corp");
res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
By @hybridherbst
🌵 Needle & prefrontal cortex