Your model has 77 blend shapes, and 35-40 of them map directly to ARKit shapes. You just need to rename/alias them!
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| eyeBlinkLeft | h_expressions.LeyeClose_h | ✓ Perfect |
| eyeBlinkRight | h_expressions.ReyeClose_h | ✓ Perfect |
| eyeWideLeft | h_expressions.LeyeOpen_h | ✓ Perfect |
| eyeWideRight | h_expressions.ReyeOpen_h | ✓ Perfect |
| eyeSquintLeft | h_expressions.Lsquint_h | ✓ Perfect |
| eyeSquintRight | h_expressions.Rsquint_h | ✓ Perfect |
| eyeLookUpLeft | MISSING | ✗ Need to create |
| eyeLookUpRight | MISSING | ✗ Need to create |
| eyeLookDownLeft | h_expressions.LlowLid_h | ≈ Partial (lid, not look) |
| eyeLookDownRight | h_expressions.RlowLid_h | ≈ Partial (lid, not look) |
| eyeLookInLeft | MISSING | ✗ Need to create |
| eyeLookOutLeft | MISSING | ✗ Need to create |
Note: Eye look directions are usually done with bones, not blend shapes. So you might not need these.
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| jawOpen | h_expressions.MouthOpen_h | ✓ Perfect |
| jawForward | h_expressions.JawFront_h | ✓ Perfect |
| jawLeft | h_expressions.Ljaw_h | ✓ Perfect |
| jawRight | h_expressions.Rjaw_h | ✓ Perfect |
Perfect coverage!
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| mouthClose | h_expressions.MPB_Down_h | ≈ Close enough |
| mouthFunnel | h_expressions.Shout_h | ≈ Similar |
| mouthPucker | h_expressions.Kiss_h | ✓ Perfect |
| mouthLeft | MISSING | ✗ Need to create |
| mouthRight | MISSING | ✗ Need to create |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| mouthSmileLeft | h_expressions.LsmileOpen_h | ✓ Perfect |
| mouthSmileRight | h_expressions.RsmileOpen_h | ✓ Perfect |
| mouthFrownLeft | h_expressions.LmouthSad_h | ✓ Perfect |
| mouthFrownRight | h_expressions.RmouthSad_h | ✓ Perfect |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| mouthDimpleLeft | h_expressions.LlipCorner_h | ≈ Similar |
| mouthDimpleRight | h_expressions.RlipCorner_h | ≈ Similar |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| mouthStretchLeft | h_expressions.LlipSide_h | ✓ Perfect |
| mouthStretchRight | h_expressions.RlipSide_h | ✓ Perfect |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| mouthUpperUpLeft | h_expressions.LlipUp_h | ✓ Perfect |
| mouthUpperUpRight | h_expressions.RlipUp_h | ✓ Perfect |
| mouthLowerDownLeft | h_expressions.LlipDown_h | ✓ Perfect |
| mouthLowerDownRight | h_expressions.RlipDown_h | ✓ Perfect |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| mouthRollLower | MISSING | ✗ Need to create |
| mouthRollUpper | MISSING | ✗ Need to create |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| mouthShrugLower | MISSING | ✗ Need to create |
| mouthShrugUpper | MISSING | ✗ Need to create |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| mouthPressLeft | h_expressions.Lblow_h | ≈ Similar |
| mouthPressRight | h_expressions.Rblow_h | ≈ Similar |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| browDownLeft | h_expressions.LbrowDown_h | ✓ Perfect |
| browDownRight | h_expressions.RbrowDown_h | ✓ Perfect |
| browInnerUp | MISSING | ✗ Need to create |
| browOuterUpLeft | h_expressions.LbrowUp_h | ✓ Perfect |
| browOuterUpRight | h_expressions.RbrowUp_h | ✓ Perfect |
Note: You have extra brow shapes (LLbrowUp_h, RRbrowUp_h) - might be for stronger expressions!
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| cheekPuff | h_expressions.Lblow_h + Rblow_h | ≈ Similar (blow) |
| cheekSquintLeft | h_expressions.Lsquint_h | ≈ Partial overlap |
| cheekSquintRight | h_expressions.Rsquint_h | ≈ Partial overlap |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| noseSneerLeft | h_expressions.Lnostril_h | ✓ Perfect |
| noseSneerRight | h_expressions.Rnostril_h | ✓ Perfect |
| ARKit Shape | Your Existing Shape | Match Quality |
|---|---|---|
| tongueOut | MISSING | ✗ Need to create |
| Category | ARKit Shapes | You Have | Missing | Coverage |
|---|---|---|---|---|
| Eyes | 12 | ~10 | 2-4 | 83% |
| Jaw | 4 | 4 | 0 | 100% |
| Mouth | 28 | ~20 | 8 | 71% |
| Brows | 8 | 6-8 | 1-2 | 75-100% |
| Cheeks | 2 | 2 | 0 | 100% |
| Nose | 2 | 2 | 0 | 100% |
| Tongue | 1 | 0 | 1 | 0% |
| TOTAL | 52 | ~40 | ~12 | 77% |
Instead of creating all 52 shapes from scratch:
Option A: Simple Aliasing (1-2 hours)
- Create ARKit-named duplicates/references of existing shapes
- Map your shapes to ARKit names
- Done! ~40 shapes working immediately
Option B: Create Missing ~12 Shapes (3-5 hours)
- Create the missing mouth shapes (mouthRoll, mouthShrug, etc.)
- Create browInnerUp
- Create tongueOut (if needed)
- Total: ~12 new shapes
Option C: Perfect Match (5-10 hours)
- Refine existing shapes to exactly match ARKit spec
- Create missing shapes
- Test all 52 shapes
Create a mapping layer in your code:
const YOUR_SHAPES_TO_ARKIT = {
// Eyes
'eyeBlinkLeft': 'h_expressions.LeyeClose_h',
'eyeBlinkRight': 'h_expressions.ReyeClose_h',
'eyeWideLeft': 'h_expressions.LeyeOpen_h',
'eyeWideRight': 'h_expressions.ReyeOpen_h',
'eyeSquintLeft': 'h_expressions.Lsquint_h',
'eyeSquintRight': 'h_expressions.Rsquint_h',
// Jaw
'jawOpen': 'h_expressions.MouthOpen_h',
'jawForward': 'h_expressions.JawFront_h',
'jawLeft': 'h_expressions.Ljaw_h',
'jawRight': 'h_expressions.Rjaw_h',
// Mouth
'mouthPucker': 'h_expressions.Kiss_h',
'mouthSmileLeft': 'h_expressions.LsmileOpen_h',
'mouthSmileRight': 'h_expressions.RsmileOpen_h',
'mouthFrownLeft': 'h_expressions.LmouthSad_h',
'mouthFrownRight': 'h_expressions.RmouthSad_h',
'mouthStretchLeft': 'h_expressions.LlipSide_h',
'mouthStretchRight': 'h_expressions.RlipSide_h',
'mouthUpperUpLeft': 'h_expressions.LlipUp_h',
'mouthUpperUpRight': 'h_expressions.RlipUp_h',
'mouthLowerDownLeft': 'h_expressions.LlipDown_h',
'mouthLowerDownRight': 'h_expressions.RlipDown_h',
// Brows
'browDownLeft': 'h_expressions.LbrowDown_h',
'browDownRight': 'h_expressions.RbrowDown_h',
'browOuterUpLeft': 'h_expressions.LbrowUp_h',
'browOuterUpRight': 'h_expressions.RbrowUp_h',
// Nose
'noseSneerLeft': 'h_expressions.Lnostril_h',
'noseSneerRight': 'h_expressions.Rnostril_h',
// ... ~40 total mappings
};
function applyARKitShape(arkitName, value) {
const yourShapeName = YOUR_SHAPES_TO_ARKIT[arkitName];
if (yourShapeName) {
const idx = mesh.morphTargetDictionary[yourShapeName];
mesh.morphTargetInfluences[idx] = value;
}
}Boom! ~40 ARKit shapes working with ZERO sculpting!
Your observation is CRITICAL: "Manual sculpting 15-25 hours is not feasible for every VALID model"
Good news: All VALID (Google/Mixamo) models likely have similar shapes!
These models use a standard rig with expressions like:
- h_expressions.ReyeClose_h
- h_expressions.LsmileOpen_h
- etc.
This means:
- Create the mapping ONCE (above JavaScript code)
- Works for ALL your VALID models automatically!
- No manual sculpting per model!
- Just map existing shapes to ARKit names
-
Create ARKit alias script (adds ARKit-named shapes)
# In Blender for arkit_name, h_expr_name in MAPPING.items(): if h_expr_name in shape_keys: # Create alias new_key = mesh.shape_key_add(name=arkit_name) # Copy from existing copy_shape_key_data(h_expr_name, arkit_name)
-
Run on all VALID models (automated)
- Process all models in batch
- Add ~40 ARKit aliases per model
- 5-10 minutes per model (automated)
-
Use ARKit names in your app
- iPhone face tracking → ARKit data
- Apply directly to your models
- Works across all VALID models!
You asked the PERFECT question!
- ✗ 15-25 hours per model: NOT FEASIBLE
- ✓ Map existing 77 shapes to ARKit: 1-2 hours ONCE
- ✓ Works for all VALID models: SCALABLE
- ✓ ~77% ARKit coverage already: AMAZING
You don't need to sculpt - you need to RENAME!