MILES GERMER · TECHNICAL ARTIST · CINEMATIC SYSTEMS · AI-AUGMENTED PRODUCTION
← All work

CamRig Bake · Maya to Unreal

One command from rigged camera to an FBX that Unreal actually accepts.

01 · Problem

The rig that makes a camera animatable is the same rig that makes it unexportable. Unreal's CineCameraActor does not want your ten-deep control hierarchy, your constraints, your viewer camera, or your parent transforms. It wants one camera, at the world root, with baked keys.

Doing that by hand is a ten-step checklist where step seven is easy to forget and the failure shows up as a camera that is subtly, unfixably wrong after import.

02 · What it does

Finds the right camera on its own. Select any node in the rig hierarchy and it locates the shot camera beneath it, deliberately skipping the locked viewport's viewer camera. No naming discipline required, no wrong-camera exports.

Duplicates rather than destroys. Your rig is never modified. The export camera is a clean copy, so you can keep animating and re-run the export as many times as the shot needs.

Strips it to the essentials. Removes child transforms that came along with the duplicate, renames to CineCameraActor, and unparents to the world root.

Bakes what matters. Six transform channels plus focal length, fStop, focus distance, and both film apertures, driven from the original through a parent constraint and live attribute connections. Your lens animation survives the trip.

Sweeps the constraints. After the bake, it actively searches for and deletes any residual constraint connections, then verifies the camera really is parentless before it reports success. Two independent safety nets on the two things most likely to break an import.

Carries the time scale across. The timewarpScale attribute and its stepped animation arrive on the export camera intact, so Unreal gets both the camera motion and the speed curve that belongs to it.

03 · Why it's built this way

Every decision below comes from knowing the specific ways this export fails, not from a model guessing at best practice.

World-root unparenting is the entire point. Unreal does not recognize a parent root node above an FBX camera, and the result is an import that either fails or double-transforms. Duplicating and unparenting is the difference between a camera that imports and one that does not.

The bake range clamps to the last speed key. After a timewarp pass, the scene's playback range is usually still set to the warped length, which is far longer than the real shot. timewarpScale is authored in real time, so its final key marks the true end. The bake clamps there. Without this, you export a long tail of identity frames and the camera motion desynchronizes from the time-scale curve in Sequencer, which is exactly the kind of bug that costs a day to find.

The attribute transfer is idempotent and handles all three cases. Already carried by the duplicate, present with keys to copy, or present as a static value only. It is safe to re-run and it cannot silently drop the one attribute Unreal depends on. The bake itself never touches timewarpScale, so stepped tangents survive exactly as authored.

04 · How it was built · 4 hours

Four hours, and the number is the interesting part. This is the smallest of the three tools at 188 lines, and the problem is not easy. Why is it small? Because I had already spent years shipping cinematics out of Maya and knew, before I wrote a single prompt, exactly which artifacts break an Unreal import and in what order they have to be removed.

There was nothing to discover, so there was nothing to iterate on. I specified what a clean Unreal camera needs, why each Maya artifact breaks it, and what the script must verify before reporting success. The AI wrote it close to correct on the first pass.

TimeWarpController took sixteen hours and roughly fifty iterations. Same model, same workflow, opposite starting knowledge.

05 · Special considerations

Run this last, after the timewarp bake, or the range clamp has no key to clamp to. If multiple valid cameras exist in the hierarchy it takes the first and warns you. The bake runs with simulation=True for evaluation accuracy, so expect it to take real time on long shots. Requires a transform selection, ideally the rig root.

06 · Credits
Requirements, pipeline design, direction, testingMiles Germer
The tools bridgedAutodesk Maya / Unreal Engine
Code authoring under my directionAI (Claude and others)
07 · What I learned

The residual-constraint sweep and the world-root unparenting exist because I know the specific ways this export fails. A model asked to "export a Maya camera to Unreal" writes something that looks right and imports wrong, because the failure modes are not in the documentation, they are in the years of watching cameras arrive subtly displaced.

Download

The script as it runs. Maya 2026, Python, no external dependencies.

Written by AI under my direction. Read it; that is the point.

Result

Leaves CineCameraActor selected, baked, unparented, constraint-free, and carrying its time scale. Export to FBX and import. It is the last step of The Timewarp Camera Pipeline: rig in Maya, warp, bake, export.

A Maya camera rig converted to a clean camera for Unreal Engine
Maya rig → clean Unreal camera