Creating Animated 3D Models for AR
Static model in AR is a showcase. Animated is interaction. Character waves hand, engine rotates pistons, molecule demonstrates bond oscillations. For AR, animation imposes constraints absent in regular 3D animation: skeleton weight, keyframe count, USDZ format compatibility.
Animation Types and Implementation
Skeletal animation (rigging). Characters, animals, robots. Skeleton of bones controls mesh deformation. For AR characters—maximum 60–80 bones. More overwhelms GPU on mobile.
Blender pipeline for AR character:
- Low-poly mesh modeling
- Rigging via Armature (automatic Rigify or manual for stylized characters)
- Skinning:
Weight Paint Modecritical—incorrect weights cause mesh tearing at joints - Animation in
Action Editor: idle, walk, run, interaction (each Action = separate clip) - Bake animation to keyframes (important for USDZ—not all curves supported)
Morph target animation (blend shapes). Faces, expressions, deformations without skeleton. Face AR filters use 52 ARKit blend shape coefficients. Create corresponding morph targets in Blender:
jawOpen → ARKit blendShapeLocation.jawOpen
eyeBlinkLeft → ARKit blendShapeLocation.eyeBlinkLeft
1:1 compatibility with ARKit names enables automatic expression control via ARFaceAnchor.blendShapes.
Procedural animation. Gear rotation, leaf sway, pulsation. In USDZ via UsdGeom.Xformable with animated xformOpOrder. In RealityKit—via AnimationResource with FromToByAnimation. Requires no skeleton, minimal weight.
Key Problems When Creating AR Animation
USDZ and animation limits. USDZ supports only specific animation curve types. Blender exports to USD via standard exporter, but Driver animations, nonlinear editor, some modifiers are ignored. Must bake to keyframes before export:
Object → Animation → Bake Action
→ Only Selected Bones, Visual Keying, Clear Constraints
After baking—verify in Reality Composer or Quick Look on iOS. What looks normal in Blender may not play in ARKit.
Animated USDZ file size. Animation adds keyframe data. 10-second walk cycle on 60-bone character at 24 fps = 240 keyframes × 60 bones × transform data. Optimization: reduce animation framerate to 12–15 fps for secondary motion (clothing, hair), primary bones—24 fps. Difference: 20–40% by weight.
Loops and transitions between clips. In RealityKit, switching animations:
entity.stopAllAnimations()
entity.playAnimation(walkAnimation, transitionDuration: 0.3, startsPaused: false)
transitionDuration ensures smooth transition. For correct idle→walk→run transitions, bone positions in final frame of one clip should be close to initial frame of next—otherwise character "teleports".
Formats and Export
USDZ with animation—for iOS. Reality Composer Pro (Xcode 15+) supports preview and basic animation editing. reality-converter CLI for converting from Alembic or FBX with animation:
xcrun reality-converter -i character_animated.fbx -o character.usdz
GLB with animation—for Android and WebAR. Blender → Export → glTF 2.0 → Format: GLB. Animations export as animations[] array in glTF structure. Draco compression for geometry, not animation data (not compressible via Draco).
Case
AR mascot for marketing campaign: penguin with 5 animations (idle, wave, dance, point, celebrate). Model—8,000 polygons, 42 bones. Blur AR on iOS, ARCore on Android. Main challenge: same GLB worked correctly in Chrome WebAR, but dance animation "broke" on Android ARCore—hip rotation exceeded [-π, π] bounds and GLB parser handled differently. Solution: normalize all euler rotation curves in Blender before export via Python script.
Timeline
| Animation Type | Timeline |
|---|---|
| Simple procedural (rotation, pulsation) | 1–3 days |
| Character with 3–5 animations (rig + skinning) | 1–3 weeks |
| Facial animation with ARKit blend shapes | 1–2 weeks |
| Complex character with 10+ animations and LOD | 3–6 weeks |
Cost calculated individually. Basic 3D models without animation—separate.







