Skip to main content

Eye Animation Helpers

In addition to lip sync, the Runtime MetaHuman Lip Sync plugin includes two optional helper utilities for animating MetaHuman eyes:

  • Auto Blink: a helper that produces natural, randomized eye blinks on a MetaHuman
  • Eyes Aim: an Animation Blueprint node that makes a MetaHuman's eyes look at a world-space location

These features are completely independent of lip sync and can be used on their own, together, or combined with the lip sync nodes. They're intended as lightweight, drop-in helpers for adding lifelike eye behavior without having to author it manually.

Feature Previews

Auto Blink: automatic eye blinks
Eyes Aim: tracking the player camera
Eyes Aim: following a moving target actor
When to use these helpers

If your facial animation pipeline already includes blinks and dynamic gaze, you can skip this page. These helpers exist for cases where you want lifelike eye behavior without authoring it yourself, for example, when your animation sequences don't include blinks, or when you need eyes to dynamically follow a moving target (something static animation sequences can't do). They can also be layered on top of existing facial animations to add missing pieces, such as blinks over a sequence that only animates the mouth.

The Auto Blink helper produces randomized, natural-looking eye blinks by driving the CTRL_L_eye_blink and CTRL_R_eye_blink curves of the MetaHuman Face Control Rig.

How It Works

Each frame, you call Update MetaHuman Auto Blink from your Face Animation Blueprint's Event Graph and pass in the frame's delta time. The function:

  1. Tracks per-character state (next blink time, current open/closed phase, etc.) keyed by the calling AnimInstance
  2. Returns two float values in the 0..1 range, one for the left eye and one for the right eye, representing how closed each eye currently is
  3. You then store these values in Blueprint variables and feed them into the Control Rig node in the Anim Graph

Setup

Two steps: add the blink call to your Event Graph, then feed the values into a Control Rig node in the Anim Graph.

In your Face Animation Blueprint (e.g. Face_AnimBP or your duplicated/copied version, see Setup Guide), open the Event Graph and add the following to Event Blueprint Update Animation:

  1. Call Update MetaHuman Auto Blink
  2. Connect Delta Time X (from the event) to Delta Seconds
  3. (Optional) Configure the Config struct. The defaults already look natural
  4. Promote Left Blink Value and Right Blink Value to Blueprint variables (e.g. LeftBlinkValue, RightBlinkValue)

Auto Blink Event Graph setup

In the Anim Graph of the same Animation Blueprint:

  1. Place a Control Rig node after all other facial logic that might write to eye-blink curves (e.g. after Blend Runtime MetaHuman Lip Sync and any custom facial animation layers)
  2. In the node's Details panel, set Control Rig Class to your MetaHuman face Control Rig. The path is typically:
    • /All/Game/MetaHumans/Common/Face/Face_ControlBoard_CtrlRig
    • Your project may have a different path depending on how the MetaHuman was imported.
  3. In the Details panel, expand the Input section and enable Use Pin for:
    • CTRL_L_eye_blink
    • CTRL_R_eye_blink
  4. Connect your LeftBlinkValue variable to CTRL_L_eye_blink
  5. Connect your RightBlinkValue variable to CTRL_R_eye_blink

Auto Blink Anim Graph setup

Placement matters

Place the Control Rig node after the lip sync blend nodes (and any other facial animation nodes) so the blink values aren't overwritten by other logic.

Configuration

The Update MetaHuman Auto Blink node accepts an optional Config struct. The defaults already look natural for most characters, expand below if you want to tune the behavior.

Config properties

Timing

PropertyDefaultDescription
Min Time Between Blinks2.0 sMinimum interval between blinks while eyes are fully open.
Max Time Between Blinks4.0 sMaximum interval between blinks. The actual interval is randomized between min and max.
Min Closed Hold Time0.04 sMinimum time the eyes stay fully closed.
Max Closed Hold Time0.08 sMaximum time the eyes stay fully closed.

Interpolation

PropertyDefaultDescription
Close Interp Speed35.0Speed when closing the eyes. Humans close their eyes faster than they open them, so this is intentionally higher than the open speed.
Open Interp Speed18.0Speed when opening the eyes.
Closed Threshold0.97Value at which the blink is considered "fully closed" and the hold phase begins.
Open Threshold0.02Value at which the blink is considered "fully open" and the next blink is scheduled.

Misc

PropertyDefaultDescription
Independent EyesfalseWhen true, the left and right eye blink independently with separate timing. When false (default), both eyes blink in perfect sync.
bEnabled (function pin)trueWhen false, the eyes ease back open and blinking pauses. Useful for cutscenes, sleep, death, etc.

Runtime Control

You can also call Reset Auto Blink State to explicitly clear the internal state for a given AnimInstance (e.g. when respawning a character or switching cinematic states).

Eyes Aim

The Eyes Aim helper is an Animation Blueprint node (Runtime MetaHuman Eyes Aim) that makes the character's eyes track a world-space location — for example, the player camera, another actor, or any moving target. It supports yaw/pitch clamping, smoothing, anti-flip protection when the target passes behind the head, and optional micro-saccades for added realism.

Choosing a Mode

The node supports two modes, selected via the Mode dropdown in the node's Details panel:

ModeWhat it drivesWhere to place it
Curves (default)The face Control Rig eye-look curves (CTRL_expressions_eyeLook*)In the Face Animation Blueprint (e.g. Face_AnimBP), before the Control Rig node
BonesThe FACIAL_L_Eye / FACIAL_R_Eye bones directly, bypassing the Control RigIn the Face Post Process Animation Blueprint (e.g. Face_PostProcess_AnimBP), after the AnimNode_RigLogic node

Curves mode is the recommended default. It composes cleanly with other curve-based facial systems (lip sync, expressions, ARKit blendshapes, etc.), since values are combined through normal Control Rig evaluation rather than fighting over bone transforms.

When Curves mode doesn't work, use Bones mode

On some MetaHuman variants (notably older rigs, including some downloaded via Quixel Bridge), the eye-look curves don't actually drive the eyes. The visible symptom is that the eyes look downward with the pupils almost hidden when the Curves-mode node is active, regardless of the target location.

If you see this, switch to Bones mode. Bones mode directly rotates the eye bones, so it works on every MetaHuman variant regardless of how the Control Rig is wired. See the Bones tab in Setup below.

Setup

The default setup. The node lives in the standard Face Animation Blueprint and drives the face Control Rig eye-look curves.

Two steps: add the node to your Anim Graph, then feed it a target location from the Event Graph.

1. Anim Graph: add the node

In your Face Animation Blueprint's Anim Graph:

  1. Add a Runtime MetaHuman Eyes Aim node
  2. Leave Mode set to Curves in the Details panel
  3. Place it after all other facial logic that may write to eye-look curves (lip sync, custom animations, etc.), same principle as the Auto Blink Control Rig node
  4. Connect the existing pose to Source Pose
  5. Connect the output to the next node in your chain (or Output Pose)
  6. Create a Vector Blueprint variable (e.g. TargetWorldLocation) and connect it to the node's Target World Location pin. You'll update this variable from the Event Graph in the next step.

Eyes Aim Anim Graph setup

2. Event Graph: feed in a target location

The Target World Location pin expects a world-space FVector. A common case is having the MetaHuman look at the player camera. In Event Blueprint Update Animation:

  1. Get Player Camera Manager (Player Index 0)
  2. Check Is Valid
  3. If valid, call Get Camera Location
  4. Store it in the TargetWorldLocation Blueprint variable

Eyes Aim, tracking the camera

To track an arbitrary actor (NPC, item, point of interest) instead, get that actor's location each frame and store it in the same variable. For a fixed gaze point, set Target World Location once or as a constant in the node's Details panel.

Configuration

All settings are exposed on the Runtime MetaHuman Eyes Aim node's Details panel.

Aim & Clamp

Aim

PropertyDefaultDescription
ModeCurvesSelects how the eyes are driven. See Choosing a Mode.
Target World Location(0,0,0)World-space point the eyes look at. Exposed as a pin by default.
bEnabledtrueWhen false, the eyes ease back to forward and ignore the target. Exposed as a pin by default.

Clamp

PropertyDefaultDescription
Max Yaw Degrees35°Maximum horizontal (yaw) deflection from the head's forward direction. Clamped 0 to 80.
Max Pitch Degrees25°Maximum vertical (pitch) deflection from the head's forward direction. Clamped 0 to 80.
Anti Flip BehindtruePrevents the eyes from flipping when the target passes behind the head.
Smoothing & Saccades

Smoothing

PropertyDefaultDescription
Interp Speed12.0Smoothing speed for eye motion. Higher = snappier, lower = more languid.

Saccades

Micro-saccades are tiny, randomized gaze shifts that real eyes constantly perform. Adding them avoids the "dead-eye" look of perfectly smooth tracking.

PropertyDefaultDescription
Enable SaccadestrueToggles micro-saccades on/off.
Saccade Yaw Amplitude Deg1.5°Max horizontal jitter per saccade. Small values (1–2°) feel natural; larger values look twitchy.
Saccade Pitch Amplitude Deg1.0°Max vertical jitter per saccade. Usually slightly smaller than the yaw amplitude.
Min Saccade Interval0.6 sMinimum time between saccades.
Max Saccade Interval2.5 sMaximum time between saccades. Larger values feel calmer, smaller values feel restless.
Bones (Bones mode only)
PropertyDefaultDescription
Left Eye BoneFACIAL_L_EyeLeft eye bone name. Matches the standard MetaHuman face skeleton.
Right Eye BoneFACIAL_R_EyeRight eye bone name. Matches the standard MetaHuman face skeleton.
Calibration (Curves mode only)

These values define how head-space angles map to the MetaHuman face CR's eye-look curve values. The defaults are tuned for the standard MetaHuman face CR and rarely need changing.

PropertyDefaultDescription
Yaw Degrees Per Unit Curve30°Angle that maps to a curve value of 1.0 for yaw look curves.
Pitch Degrees Per Unit Curve25°Angle that maps to a curve value of 1.0 for pitch look curves.

Combining With Lip Sync and Other Animations

Both helpers are designed to coexist with the plugin's lip sync nodes and any custom facial animation you already have. The general rule: place the Eyes Aim and Control Rig (auto-blink) nodes after lip sync and any custom facial animation, so their values aren't overwritten downstream.

View Detailed Execution Flowchart (Curves vs. Bones Mode)

Depending on whether your MetaHuman rig uses the recommended Curves Mode or the fallback Bones Mode, the placement of your execution logic will change. Expand the chart below to see the exact execution order for both pipelines:

Auto Blink and lip sync still live in the regular Face AnimBP in both modes.

For details on layering with body animations, see Combining with Existing Animations.

Notes & Limitations

These helpers are MetaHuman-specific. They rely on the standard MetaHuman face Control Rig curve names (CTRL_L_eye_blink, CTRL_R_eye_blink, CTRL_expressions_eyeLook*) and the standard eye bones (FACIAL_L_Eye, FACIAL_R_Eye). They're not intended for custom non-MetaHuman characters.

Need Help?

Join our Discord
online · support

For custom development requests, contact [email protected].