Atlas USD Camera Loader
Already Have the Camera? Stop Solving for One
- ATLAS_CAMERA
The whole premise of Atlas Camera is that you hand it one photograph and it recovers a camera - focal, orientation, horizon - by solving for it. That's the hard way, and it's not always what you want. AtlasUSDCameraLoader is the back door: instead of inferring a camera from pixels, it reads one straight out of a .usd file. Somewhere in your project a camera already exists - a layout from Maya, a set-ext or Nuke export, a shot cam a TD handed you - and this node turns it into the exact ATLAS_CAMERA object the rest of the pack expects.
It's the answer to a specific pain: you're building a projection setup for a shot that already has a production camera, and re-solving one from a still would just fight the one the editor's locked. Load the USD camera, and every Atlas node downstream - geometry derivation, viewport, exporters - runs on the known physical camera instead of a guess.
How it works
Under the hood it's a tiny USD reader, not a solver. The node opens your stage with usd-core (the pxr library), walks the prims looking for the first UsdGeom.Camera, and pulls its real intrinsics: focal length, horizontal and vertical aperture (the sensor size), plus the camera's world transform. Those map onto an AtlasCamera with proper intrinsics and extrinsics. No confidence score, no learned prior, no line detection - it's measurement, not estimation. Which is exactly why it's listed under Atlas/advanced in the node menu: it replaces the clever part of the pack with a boring, reliable import.
There is one catch that will bite the first time you use it: the USD reader is an optional dependency, and it fails soft with a message telling you to install it. You need usd-core in ComfyUI's Python:
# from the ComfyUI custom_nodes checkout of atlas-camera
"<ComfyUI>/python_embeded/python.exe" -m pip install usd-core
# or, with the pack installed in editable mode:
pip install -e .[usd]
Restart ComfyUI after that and the node stops complaining.
The inputs that matter
Only three inputs, and honestly you'll touch two of them.
usd_path- the path to the.usd/.usda/.usdcfile. The node grabs the first camera prim it finds in the stage, so if the file has a hundred cameras, name your layout accordingly (or make a stage that only contains the one you want).image_width/image_height(defaults 1920×1080) - this is the sneaky one. These set the plate size the intrinsics are computed for, so they should match your delivery resolution, not the USD file's. A camera whose focal is correct for a 1920-wide frame is wrong for a 4K frame. Set these to the resolution you're actually projecting at.
The output
One output: ATLAS_CAMERA, the same type AtlasInput and the solver nodes produce. Wire it anywhere a camera is expected - straight into AtlasBlockoutViewport to look through it, or into the geometry/export chain.
Install & gotchas
The pack itself is a normal custom_nodes clone:
cd ComfyUI/custom_nodes
git clone https://github.com/mikejamesvfx/atlas-camera.git
Then restart ComfyUI. The core nodes need no extra pip step - ComfyUI already ships numpy/Pillow/torch - and usd-core is the only extra this particular node drags in. Everything else in Atlas (solve, viewport, exporters) is pure Python. If the loader refuses your file with "Unable to open USD stage", it's usually a bad path or a stage written by a newer USD version than usd-core can read - update usd-core first before assuming the file is broken.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| usd_path | STRING | — | |
| image_width | INT | 1920 | — |
| image_height | INT | 1080 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| ATLAS_CAMERA | ATLAS_CAMERA | — |