MetaHuman DNA
MetaHuman DNA refers to our proprietary data format. DNA encodes all information necessary to assemble and configure a full MetaHuman head, body and its rigs.
This is used interchangeably for the data in general (when in memory), and the files containing the same data serialized to storage.
DNA encodes the MetaHuman head and body geometry and its skeleton in its neutral pose, at multiple Level(s) of Detail (LOD). Skin Weights are also encoded separately for each LOD. The DCC Export assembly pipeline in MetaHuman Creator in Unreal Engine exports a character’s head and body as separate DNA files. Expression Editor only works with the head DNA file and requires a fully-rigged character (including blendshapes).
A predetermined number and type of Expressions set by the Rig Definition is encoded as a set of joint Animations, one for each Expression, and augmented by a per-vertex displacement for the finer detail, the latter only in LOD0.
The DNA file format is versioned. Expression Editor is only compatible with DNA files created by MetaHuman Creator in Unreal Engine 5.6 or later.
Rig Definition
The Rig Definition (often called RigDef) establishes some rig parameters such as the names and numbers of shapes etc. There shouldn’t be a time during normal use of Expression Editor when the RigDef matters.
The Rig Definition is versioned. In Expression Editor the Rig Definition is static, and is aligned with the Rig Definition used by MetaHuman Creator in Unreal Engine.
Rig Operation
A MetaHuman includes several meshes, the most significant (the head mesh) can be thought of as “everything that’s covered in skin”; other meshes represent various parts of eyes and mouth. For the sake of simplicity we’ll only talk about the head mesh, everything else follows the same principles.
Rig Logic
The first distinctive trait of a MetaHuman is upstream of the joints, and it’s RigLogic. RigLogic is offered as an operator/node in both Unreal Engine and Maya, and it takes hundreds of semantically meaningful channels (for example, inner brow up and down etc.) and maps their normal-scale run to the transformation of many joints, as well as (at LOD0) per-vertex displacement (shapes/morphs), and some other parameters connected externally (for example, wrinkle triggering hooked to materials etc.)
Mesh Deformation
The head mesh is skinned to joints through a common soft skinning operator. Everything that matters and commonly applies about soft skinning does here.
There is an added layer of deformation in the form of “shape animation” (in Maya parlance), or rather per-vertex displacement maps. These are meant to make for subtle additions to the coarser and larger masses moved by joints.
Two things are worth always keeping in mind: Per-vertex shape interpolation is linear and therefore looks artificial when moving large masses, and is far more likely to have mid-range (in parameter space) issues. Vertex displacement is also used exclusively in LOD 0, and completely ignored in lower LODs.
Level of Detail (LOD)
There are 8 Level of Detail sets (LODs) settings available in MetaHumans, from LOD 0 to LOD 7. LOD 0 has the highest complexity, and everything follows in descending order (topological density, joint count etc.) We refer to LOD 0 as the “highest” LOD, highest in detail, and LOD 7 as the lowest.
There is only one set of joints operating across all LODs. The reduced joint count when descending LODs is done by exclusion, where each subsequent LOD excludes some of the joints from the whole subset.
Only LOD 0 uses vertex displacement shapes.
Each LOD has its own geometry set, with no meshes shared across LODs, therefore all geometry related attributes are per LOD (for example, skinning weight assignments).
Joints
The skeleton is a vanilla set of Maya Joints. These joints are however impacted differently in the toolkit, particularly by what they are used for, and the degree of automation they are subject to.
Joints positioning in relation to the mesh differs between the bind pose (as presented in the Neutral Pose) and various expressions. The bind pose can be treated somewhat systematically, while expressions need to be inspected visually for technical correctness and likeness.
Bind Pose
Surface joints are placed automatically at various stages, and as the name implies they are best positioned as close as possible to specific surface locations of the mesh. These are the large majority of the joints in the skeleton and don’t really need listing individually.
Volume joints are, for the most part, all other joints that the head is skinned to (that aren’t surface joints).
Some can be placed automatically, but not all, and if any joints ever require some manual inspection and adjustment, these will be it. As the name implies, they are responsible for moving large volumes.
Of note is that the following are volume joints that will be positioned automatically during bind pose updates:
FACIAL_C_Forehead FACIAL_L_ForeheadIn FACIAL_R_ForeheadIn FACIAL_L_ForeheadMid FACIAL_R_ForeheadMid FACIAL_L_ForeheadOut FACIAL_R_ForeheadOut FACIAL_L_EyesackUpper FACIAL_R_EyesackUpper FACIAL_L_EyelidUpperFurrow FACIAL_R_EyelidUpperFurrow FACIAL_L_EyeCornerInner FACIAL_R_EyeCornerInner FACIAL_L_EyeCornerOuter FACIAL_R_EyeCornerOuter | FACIAL_L_EyesackLower FACIAL_R_EyesackLower FACIAL_L_CheekInner FACIAL_R_CheekInner FACIAL_L_CheekOuter FACIAL_R_CheekOuter FACIAL_L_CheekLower FACIAL_R_CheekLower FACIAL_C_NoseLower FACIAL_L_Nostril FACIAL_R_Nostril FACIAL_C_LipUpper FACIAL_L_LipUpper FACIAL_R_LipUpper | FACIAL_L_LipUpperOuter FACIAL_R_LipUpperOuter FACIAL_L_LipCorner FACIAL_R_LipCorner FACIAL_C_LipLower FACIAL_L_LipLower FACIAL_R_LipLower FACIAL_L_LipLowerOuter FACIAL_R_LipLowerOuter FACIAL_L_Jawline FACIAL_R_Jawline FACIAL_L_NasolabialBulge FACIAL_R_NasolabialBulge |
The following are volume joints that will NOT be positioned automatically during bind pose updates:
FACIAL_C_Skull FACIAL_L_EyelidUpperB FACIAL_R_EyelidUpperB FACIAL_L_EyelidUpperA FACIAL_R_EyelidUpperA FACIAL_L_Eye FACIAL_L_EyeParallel FACIAL_L_Pupil FACIAL_R_Eye | FACIAL_R_EyeParallel FACIAL_R_Pupil FACIAL_L_EyelidLowerA FACIAL_R_EyelidLowerA FACIAL_L_EyelidLowerB FACIAL_R_EyelidLowerB FACIAL_C_Nose FACIAL_C_NoseTip FACIAL_C_MouthUpper | FACIAL_C_TeethUpper FACIAL_C_LowerLipRotation FACIAL_C_MouthLower FACIAL_C_TeethLower FACIAL_C_Tongue1 FACIAL_C_Tongue2 FACIAL_C_Tongue3 FACIAL_C_Tongue4 FACIAL_C_Jaw FACIAL_C_Chin |
Two joints in that list have a further distinguishing trait: FACIAL_L_Pupil, and FACIAL_R_Pupil. These two joints are the only joints that dynamically alter the scaling component to affect the mesh.
Body joints are also present in the rig, but in the exported rig they are provided from the body rig component. We don’t recommend altering these joints; if you decide you need to, you’ll have to provide the tooling to transmit corresponding changes to the body rig, and this tooling only works in Neutral Pose Editing Mode.
If you somehow have reason to alter body joint positions, they still should not be modified in Expressions. Changes to these joints in expressions won’t be transmitted to DNA, resulting in what you see in your session becoming different from what the DNA will eventually animate into.
Finally, three body joints need to be left untouched, always: FACIAL_C_Neck1Root, FACIAL_C_Neck2Root, and FACIAL_C_FacialRoot. These three joints need to be matched to the body at all times and are dependent on the body rig choice.
The following is a list of all body joints to which the above applies:
spine_04 spine_05 clavicle_pec_l clavicle_pec_r spine_04_latissimus_l spine_04_latissimus_r clavicle_l clavicle_out_l clavicle_scap_l upperarm_l | upperarm_correctiveRoot_l upperarm_out_l upperarm_fwd_l upperarm_in_l upperarm_bck_l clavicle_r clavicle_out_r clavicle_scap_r upperarm_r upperarm_correctiveRoot_r | upperarm_out_r upperarm_fwd_r upperarm_in_r upperarm_bck_r neck_01 neck_02 head FACIAL_C_Neck1Root FACIAL_C_Neck2Root FACIAL_C_FacialRoot |
Joint Matching
Joint Matching is a key operation in Expression Editor, as well as the only source of automatic modification of joint positions in expression poses.
Joint lists are different in nature than what they are for bind poses.
Non Linear Solver Joint Matching (NLSJM) comprises multiple passes, and each pass will affect a specific list of joints.Alternatively to NLSJM Machine Learning based Joints Matching (MLJM), will affect all joints except for an exclusion list, which can’t be changed.
The following specific exclusions are NOT placed automatically:
neck_01 neck_02 head FACIAL_C_Jaw FACIAL_C_LowerLipRotation FACIAL_L_Eye FACIAL_R_Eye FACIAL_L_EyeParallel FACIAL_R_EyeParallel | FACIAL_L_Pupil FACIAL_R_Pupil FACIAL_L_EyelashesUpperA1 FACIAL_R_EyelashesUpperA1 FACIAL_L_EyelashesUpperA2 FACIAL_R_EyelashesUpperA2 FACIAL_L_EyelashesUpperA3 FACIAL_R_EyelashesUpperA3 | FACIAL_L_EyelashesCornerOuter1 FACIAL_R_EyelashesCornerOuter1 FACIAL_C_Skull FACIAL_C_Nose FACIAL_C_MouthUpper FACIAL_C_MouthLower FACIAL_C_TeethUpper FACIAL_C_TeethLower |
Two joints in that list have a further distinguishing trait: FACIAL_L_Pupil, and FACIAL_R_Pupil. These two joints are the only joints that dynamically alter the scaling component to affect the mesh.