Atlas Unreal Camera Path (LTX) π₯
An Unreal Sequencer move into LTX β without hand-rolling the axis math
- camera_path
- report
Atlas Unreal Camera Path π₯ is the Unreal-side twin of the pack's Director path loader. That node reads what Atlas Director wrote; this one reads what Unreal wrote, for a shot whose move was operated in Sequencer and never touched Atlas at all. Point it at a .usda and you get a pose camera_path for the CrossView Warp node - no hand-rolled conversion, because the node refuses to do that conversion, and it's a refusal with receipts.
Why it won't convert axes for you
Unreal is centimetres, Z-up, left-handed. The warp wants metres, Y-up, right-handed looking down βZ. Everyone's first instinct is to write a quick conversion, and the author's team tried - then measured it against a take whose Atlas values were known exactly. The textbook mapping was 11.3 m out over an 8 m move, and the best hand-written candidate was still 0.217 m out. Both produce a camera that matches on frame one and drifts thereafter - the failure nothing downstream detects, because frame one always looks right.
So the conversion is Epic's, not yours. Export the sequence with LevelSequenceExporterUsd and set the stage options to metersPerUnit 1 and upAxis Y. Those are not the exporter's defaults - it ships Z-up centimetres, which looks identical in the file and is quietly Unreal's own frame. This node checks and refuses a stage that isn't Y-up metres rather than misreading it, because that mistake is invisible in the output. If you hit that refusal, re-export with the stage options set - it's not a bug, it's the feature working.
Inputs and outputs
Required is just usd_path. The optional prim_path picks which prim carries the camera - blank chooses the one with the most animated transform samples, which is the camera in a single-camera sequence export. start_frame and frame_count trim the timecode range (0 = use the stage's own start/end). focal_mm and sensor_height_mm are fallbacks only, used when the export carries no lens - 0 means require it from the file. Note it's the filmback height that matters here, because a pose path carries a vertical field of view.
Outputs are camera_path (the pose string for the warp's camera_path input, which outranks camera_info and the keyframes) and a report. The poses are rebased onto the first frame - that's what makes frame 1 the source clip's own view, warped by nothing.
Installing
From atlas-camera, plus one extra for this node:
cd <ComfyUI>/custom_nodes
git clone https://github.com/mikejamesvfx/atlas-camera.git
pip install usd-core # into ComfyUI's Python
The usd-core package is the one genuine dependency here - reading the export needs it, and the error message tells you exactly that if it's missing. Restart ComfyUI after installing.
The two export facts that will otherwise confuse you
First, with export_level off the file is a sparse over layer carrying no typed Camera prim - so nothing finds a UsdGeom.Camera, and the node reads the transform straight off xformOp:transform. That's expected, not a broken export. Second, remember LevelSequenceExporterUsd's defaults are the wrong axis and units; if the node refuses your file, this is the first thing to check. And as with every camera-path node in this pack, the clip you feed the warp must be at least as long as the path. Get those right and a Sequencer move drops into an LTX render with its metres intact.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| usd_path | STRING | The .usda written by LevelSequenceExporterUsd with metersPerUnit 1 and upAxis Y. Epic's defaults are cm and Z-up; this refuses those rather than misreading them. | |
| prim_pathopt | STRING | Which prim carries the camera. Blank picks the one with the most animated transform samples, which is the camera in a sequence export of a single camera. | |
| start_frameopt | INT | 00β100000 | First timecode to read. 0 uses the stage's own start. |
| frame_countopt | INT | 00β4096 | How many frames to emit. 0 reads to the stage's end. Must be at least the length of the clip being warped. |
| focal_mmopt | FLOAT | 0.00β1000 | Fallback focal length, used only if the export carries no lens. 0 means require it from the file. |
| sensor_height_mmopt | FLOAT | 0.00β200 | Fallback filmback HEIGHT β the pose path carries a vertical field of view, so height is the one that matters. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| camera_path | STRING | β |
| report | STRING | β |