Back to Tech Art

UE5 Procedural Control Rig

A Control Rig for the UE5 Manny where the whole control setup builds itself. Instead of hand-placing every control, the rig reads the skeleton at construction and generates the FK and IK controls procedurally, so it drops onto any similar hierarchy without redoing the layout by hand. On top of that it has per-limb IK/FK switching, pole vector control, and a reverse foot setup for the feet.

Unreal EngineControl RigProcedural RiggingIK/FKPipeline
Finished rig on the UE5 Manny with FK controls visible

Finished rig on the UE5 Manny with FK controls visible

Table of Contents

Procedural Control Placement

The controls are not placed by hand. On the construction event the rig walks the skeleton, finds each joint it cares about, and spawns the matching controls, nulls, and offsets right on the bone transforms. That means the layout is driven by the skeleton itself, so the same graph works across characters that share the hierarchy without me repositioning anything. It also keeps naming consistent, since every control is generated from the bone it belongs to rather than typed out one by one.

The construction event drives all of this. A Sequence fans out to Init_GenericFKControls and one Init_Leg call per side, each passing in its bones, controls, and nulls plus a TokenPrefix (L or R) and a ControlColor so left and right come out named and color coded correctly. Each control is then snapped onto its bone by reading the bone transform (like pelvis) and setting the control initial from it.

Construction event: Sequence into Init functions that build and place the controls

Construction event: Sequence into Init functions that build and place the controls

In the hierarchy anything shown in yellow font was placed procedurally, whether it is a control, null, or offset group. You can see the full reverse foot chain built out per side, with matching heel, toe, and ball controls plus the pole vector, all named off the bones they drive.

Generated rig hierarchy. Anything in yellow font was placed procedurally.

Generated rig hierarchy. Anything in yellow font was placed procedurally.

Reusable Functions

To keep the graph from turning into copy-pasted spaghetti, I broke the logic into helper functions the rig calls instead of duplicating per limb. Init_Leg and Init_GenericFKControls handle building the controls, Fwd_FKSolve and Fwd_IKLeg run the per-frame solves, and Util_AlignFKtoIK / Util_AlignIKtoFK handle the no-pop switch. Left and right just call the same functions with different inputs, so a fix lands everywhere at once.

Reusable local functions the rig calls instead of duplicating logic

Reusable local functions the rig calls instead of duplicating logic

FK, IK, and the Switch

A limb needs both FK and IK because they solve different problems. FK rotates each joint down the chain, which is best for loose arcs like a waving arm, while IK anchors the hand or foot in place so it stays planted while the rest of the body moves. Giving the animator a switch lets them pick whichever fits the shot instead of being locked into one.

Each limb runs both solves. A per-limb bool on the layout control (like L_Leg_IK_enable) picks which one drives the bones that frame. The forward graph reads that channel, branches on it, and only runs the active solve. Before the switch flips, an alignment step matches one chain to the other (Util_AlignIKtoFK and Util_AlignFKtoIK) so the pose does not jump when you toggle it. Left and right legs mirror the same logic, which is why the graph is split into clearly labeled Fwd L Leg and Fwd R Leg blocks.

The FK solve itself is simple by design: grab every control, read each control transform, and set the matching bone in global space with propagate to children on, so a rotation at the pelvis carries down the chain. Keeping it a plain read-and-set makes it easy to run per control without special casing each joint.

FK solve: read each control transform and drive its bone

FK solve: read each control transform and drive its bone

Per-leg IK/FK branch with IK-to-FK alignment and reverse foot roll

Per-leg IK/FK branch with IK-to-FK alignment and reverse foot roll

Pole Vector

The IK limbs get a pole vector control so the knee and elbow bend where you want instead of wherever the solver guesses. To place it automatically I use a small math trick: take the knee bone's forward vector and drop the pole vector a set distance along it, which puts the control right where the knee is already pointing. The elbow uses the same approach off its own forward vector. Because it is derived from the bone rather than a hardcoded position, the control lands in the correct spot the moment the rig builds and follows the skeleton if the proportions change.

Pole vector offset along the knee bone forward vector

Pole vector offset along the knee bone forward vector

Space Switch

The head has a space switch so it can either follow the body or stay aligned to the world, which is handy for keeping a character looking at a fixed point while they move. A WorldAlign bool channel on the control drives a Branch, and when it flips I use Project to new Parent to reparent the control's null from the layout control into world space while preserving its current transform, so the switch happens with no pop. Reading the control transform back into the null keeps it sitting exactly where it was the instant the space changes.

Head space switch: WorldAlign channel reparents the control between local and world space

Head space switch: WorldAlign channel reparents the control between local and world space

Tech Stack

Control Rig

UE5 graph

Construction

Procedural build

IK/FK Switch

Per limb

Alignment

No-pop toggle

Pole Vector

Knee/elbow aim

Reverse Foot

Heel-ball-toe roll