Facial animation

Intermediate Last updated Jul 9, 2026

On this page

Questwright needs no performance capture: facial animation is baked from the voice-over audio. If a line has VO, it gets lip-sync, whether the audio came from TTS or your own recordings.

The bake (build time)

The build’s facial stage runs MetaHuman Animator on each voiced line and bakes a lip-sync UAnimSequence per line (FA_<LineId>), with the mood derived from the line’s emotion: value. Like every stage, it is idempotent: unchanged lines are skipped, orphaned face animations of deleted lines are pruned.

Requirements for this stage: the MetaHuman plugin enabled and DX12. Both are checked in the Build tab’s pre-flight; a facial toggle there lets you skip the stage entirely (fast iteration builds).

Runtime layering

At runtime the plugin layers the face in code on any MetaHuman; your character’s Animation Blueprints are never modified:

lip-sync slot → procedural blinking → additive emotion → eye gaze → the character's own RigLogic

Head-turn toward the current speaker is applied through a runtime post-process Anim Blueprint on the body (the head bone is leader-posed from the body on MetaHumans), so characters naturally look at whoever is talking, including after mid-dialogue staging moves.

Two MetaHumans in dialogue: the listener's head turned toward the speaker

Fails soft, always

Every part of the face pipeline degrades gracefully instead of breaking the build or the scene:

SituationResult
No MetaHuman plugin / no DX12Face stage skipped with a warning; dialogue plays with a neutral face
Character is not a MetaHumanDialogue, staging and cameras work; no baked lip-sync
A face asset fails to loadNeutral face for that line, log warning

The face and head-look Anim Blueprint classes are soft references resolved lazily at runtime, so the plugin loads fine in projects without any MetaHuman content at all.

Localized faces

Each language gets its own voice-over and its own lip-sync bake: a Russian line moves the mouth like Russian. Per-culture assets are swapped by the engine’s localization system in packaged builds (see Localization for the PIE caveat).