Converting 3D Models to USDZ Format for iOS AR
USDZ is Apple's native AR format. Quick Look, RealityKit, ARKit—all use it. Loading model from Blender, Maya, SketchUp, or supplier directly into ARKit won't work: requires USDZ conversion with compatibility verification and mobile device optimization.
Conversion isn't just file extension change.
What is USDZ
USDZ—ZIP archive containing USD files (Universal Scene Description from Pixar) and textures. USD is hierarchical scene: meshes, materials, light, animations, physics. Apple took USD and added mobile constraints: only specific shaders, texture formats, animation types.
Compatible USDZ for iOS works via UsdPreviewSurface—standard PBR shader. Parameters:
-
diffuseColor— base color or texture -
roughness/metallic— PBR parameters (0.0–1.0) -
normal— normal map -
opacity/opacityThreshold— transparency
Anything beyond these parameters (process-based shaders, node graphs) doesn't display in Quick Look.
Where Conversion Problems Arise
FBX/OBJ → USDZ. Most common path from supplier. reality-converter (GUI) or xcrun usdz_converter (CLI) from Apple:
xcrun usdz_converter model.obj model.usdz \
-color_map diffuse.png \
-normal_map normal.png \
-roughness_map roughness.png \
-metallic_map metallic.png
Problem: usdz_converter doesn't handle FBX with animation correctly. FBX with animation better converts via reality-converter or Blender intermediate export to USD:
FBX → (Blender) → USD → (usdzip) → USDZ
Blender → USDZ. Blender 3.0+ has built-in USD exporter with caveats: Custom Properties, Driver animations, modifiers not exported. Before export: apply all modifiers (Apply All Modifiers), bake animation (Bake Action), convert materials to Principled BSDF (maps to UsdPreviewSurface).
Textures. USDZ accepts PNG and JPEG inside archive. Problem: Blender often exports textures with names containing spaces or special characters—USD parser on iOS won't find them. Rule: Latin characters only, no spaces, no parentheses in texture filenames.
Scale. USD defaults to centimeters (legacy Pixar). iOS ARKit expects meters. Via usdz_converter—metersPerUnit set automatically. Manual USD assembly—explicitly set:
stage.SetMetadata('metersPerUnit', 1.0)
USDZ Validation
After conversion—mandatory verification:
-
Quick Look on real iPhone—fastest way. Send via AirDrop or email, tap "View in AR". If doesn't work—format problem.
-
Reality Composer Pro (Xcode 15+)—shows scene, material errors, object hierarchy.
-
usdchecker—CLI utility from Pixar USD library:
usdchecker model.usdz
Outputs validation errors: unsupported shaders, incorrect scale, missing textures.
Batch Conversion
For 50–500 models—automate via Python USD API:
from pxr import Usd, UsdGeom, UsdShade, Sdf
import zipfile
# Script: read FBX via Blender API → export USD → pack to USDZ
# Validate each file via usdchecker
# Upload to S3/CDN
Average automatic conversion time: 30–120 seconds per model depending on complexity. CI/CD: GitHub Actions with macOS runner (macOS required for usdz_converter).
Case
Furniture supplier, 300 SKU in FBX from different design studios—different scale, different texture naming conventions, some without UV unwrap. Wrote normalizer in Blender Python:
- Load FBX
- Check scale (bounding box) against product spec from CSV
- Normalize to metric units
- Apply modifiers, convert materials to Principled BSDF
- Export USD, pack to USDZ via
usdzip - Run
usdchecker, log errors
Of 300 models, 47 required manual intervention: incorrect UV, complex custom shaders, missing textures.
Timeline
| Volume | Timeline |
|---|---|
| Convert 1–10 models manually | 1–3 days |
| Setup automatic conversion pipeline | 1–2 weeks |
| Batch process 100+ models with validation | 2–4 weeks |
Cost calculated based on source formats, model quality, and automation level.







