Standard FACS Blend Shapes for glTF Morph Targets

In real-time 3D facial animation, the Facial Action Coding System (FACS) provides a standardized framework for breaking down facial expressions into individual muscle movements known as Action Units (AUs). When exporting 3D avatars to the glTF (GL Transmission Format) standard, these AUs are typically stored as morph targets within the mesh primitive data. While pure academic FACS uses numerical identifiers, the interactive 3D and WebXR industries overwhelmingly map these to the 52 ARKit-compatible blend shape standard, which translates FACS movements into split, directional targets (left and right) for runtime facial tracking and performance capture.

The ARKit 52 FACS Standard in glTF

The most ubiquitous standard mapped into glTF morph target arrays is the Apple ARKit standard, which derives directly from FACS principles. This system decomposes complex facial mechanics into 52 localized morph targets, categorized primarily by facial region:

1. Eye and Brow Region (Upper Face)

Upper face blend shapes isolate brow movements and ocular actions, corresponding closely to primary FACS Action Units:

  • Brow Inner Up (FACS AU 1): Inner brow raiser.
  • Brow Down Left / Right (FACS AU 4): Brow lowerer / corrugator action.
  • Brow Outer Up Left / Right (FACS AU 2): Outer brow raiser.
  • Eye Blink Left / Right (FACS AU 45): Eyelid closure via orbicularis oculi.
  • Eye Squint Left / Right (FACS AU 7): Lid tightener.
  • Eye Wide Left / Right (FACS AU 5): Upper lid raiser.
  • Eye Look Directions: Morph targets handling directional eye gazing (eyeLookDown, eyeLookIn, eyeLookOut, eyeLookUp split per eye), though these are sometimes handled via skeletal joints rather than morph targets.

2. Cheek and Nose Region (Midface)

Midface blend shapes handle nasal flare and cheek elevations:

  • Cheek Puff (FACS AU 33 / AU 34): Bucco-facial air expansion.
  • Cheek Squint Left / Right (FACS AU 6): Cheek raiser.
  • Nose Sneer Left / Right (FACS AU 9): Levator labii superioris alaeque nasi contraction, wrinkling the nose.

3. Jaw Region

Jaw blend shapes define basic mandible translation and articulation:

  • Jaw Open (FACS AU 26 / AU 27): Jaw drop and mandible depression.
  • Jaw Forward (FACS AU 31): Mandible thrust.
  • Jaw Left / Right (FACS AU 30): Lateral mandible displacement.

4. Mouth and Lip Region (Lower Face)

The mouth contains the largest array of morph targets due to complex phoneme generation and emotive expressions:

  • Mouth Smile Left / Right (FACS AU 12): Zygomaticus major pull, raising lip corners.
  • Mouth Frown Left / Right (FACS AU 15): Depressor anguli oris pull, lowering lip corners.
  • Mouth Pucker (FACS AU 18): Lip pucker and orbicularis oris contraction.
  • Mouth Funnel (FACS AU 22): Lip funneler.
  • Mouth Left / Right (FACS AU 14 variation): Lateral mouth shifting.
  • Mouth Dimple Left / Right (FACS AU 14): Buccinator contraction at the lip corners.
  • Mouth Stretch Left / Right (FACS AU 20): Risorius contraction pulling lips laterally.
  • Mouth Roll Lower / Upper (FACS AU 28): Lip inversion over the teeth.
  • Mouth Shrug Lower / Upper (FACS AU 17): Mentalis muscle lifting and pushing the lip upward.
  • Mouth Press Left / Right (FACS AU 24): Lip pressor.
  • Mouth Lower Down Left / Right (FACS AU 16): Depressor labii inferioris pulling the lower lip down.
  • Mouth Upper Up Left / Right (FACS AU 10): Levator labii superioris raising the upper lip.
  • Mouth Close (FACS AU 23): Lips pressed together when the jaw is open.

glTF Implementation Details

In the glTF 2.0 specification, morph targets are represented numerically rather than associatively by default:

  • Target Arrays: Stored under mesh.primitives[].targets, containing arrays of displacement accessors for vertex positions (POSITION), normals (NORMAL), and tangents (TANGENT).
  • Naming Conventions: Because the core glTF specification does not natively mandate morph target names inside the targets array, target names are standardized by populating the extras.targetNames array within the mesh definition. Engines such as Three.js, Babylon.js, and Unreal Engine read this array to map strings (e.g., "eyeBlinkLeft") to their corresponding integer index in the primitive target array.
  • Default Weights: Default rest states are initialized using the mesh.weights array, with values typically ranging from 0.0 (neutral base pose) to 1.0 (maximum morph deformation).