Your pipeline speaks GLB; iPhones speak USDZ. AR Quick Look — the viewer that opens when someone taps a 3D model in Safari, Mail, or Messages — renders USDZ and nothing else. The fastest reliable route is Apple's `usdzconvert` with three preparation steps: decompress Draco first, swap KTX2 textures for PNG, and verify real-world scale. This guide covers all four conversion routes, the exact flags that keep PBR materials intact, and the material failures you'll hit on your first attempt.
Why USDZ is required for AR Quick Look
Apple's AR stack standardized on Pixar's Universal Scene Description years ago, and there is no glTF fallback: a plain link pointing at a `.glb` file opens a download dialog on iOS, while the same link pointing at a `.usdz` opens a full AR session with plane detection, people occlusion, and real-scale placement — no app install, no framework, no permission prompt. For product previews, furniture placement, and portfolio pieces, that one file format is the difference between a spinning thumbnail and the model sitting on the viewer's actual desk.
USDZ itself is just an uncompressed zip holding a `.usdc` scene plus textures. The catch is the material model: AR Quick Look renders `UsdPreviewSurface`, which supports base color, metallic, roughness, normal, occlusion, opacity, and emissive — and none of glTF's extensions. Everything you convert gets squeezed through that funnel, which is where most conversions fail.
Choose your conversion route
![]()
| Route | Platform | Handles Draco/KTX2? | Best for |
|---|---|---|---|
| `usdzconvert` (Apple USD tools) | macOS, Python | No — pre-process first | Batch pipelines, exact control |
| Reality Converter | macOS GUI | No | One-off drag-and-drop checks |
| Blender USD export | Any OS | Yes (imports GLB fully) | Editing during conversion |
| three.js `USDZExporter` | Browser, runtime | Yes (via loaders) | Web shops converting on the fly |
`usdzconvert` is the reference implementation and the one worth scripting. Reality Converter is the same converter with a preview window. Blender's USD exporter has matured to the point where GLB→Blender→USDZ round-trips cleanly, and because Blender decodes Draco and KTX2 on import, it doubles as a decompression stage. The three.js exporter matters when users upload their own models — an online configurator can hand an iPhone user a USDZ generated in the browser tab.
Convert with usdzconvert step by step
Draco-compressed geometry makes `usdzconvert` fail with an opaque parse error, and KTX2 textures pass through unreadable — AR Quick Look shows a white model. Strip both with glTF Transform, then convert:
```bash
# 1) decompress Draco + transcode KTX2 back to PNG
gltf-transform copy chair-draco.glb chair-clean.glb
# 2) convert, declaring PBR maps explicitly
usdzconvert chair-clean.glb chair.usdz \
-diffuseColor tex/albedo.png \
-metallic tex/metal.png -roughness tex/rough.png \
-normal tex/normal.png -occlusion tex/ao.png
```
If the GLB embeds its textures (most catalog downloads do), `usdzconvert chair-clean.glb` alone usually maps them correctly — the explicit flags are for when the auto-mapping guesses wrong, which shows up as a gray or overly shiny result. Run with `-v` to print exactly which texture landed in which slot.
Scale is the other silent killer. USD works in meters and AR Quick Look places objects at literal world scale: a chair exported at centimeter scale appears 100× too large in someone's living room. A quick sanity check before converting — BitSoul's 3D Studio shows a model's bounding box in meters in the inspector, straight from the browser. Models like the Poäng chair in the catalog ship at real-world scale specifically so this step is a confirmation, not a fix; a free account's two monthly downloads cover evaluating the pipeline, and commercial use is included with paid memberships.
Fix materials that break in USD
![]()
Expect these four failures, in descending order of frequency:
Vertex colors disappear. `UsdPreviewSurface` reads them only when explicitly wired, and `usdzconvert` doesn't wire them. Bake vertex color into the base-color texture before converting — in Blender: Bake type Diffuse, contributions Color only, to a new image.
Transparency renders as opaque or invisible. glTF's `alphaMode: BLEND` converts, but AR Quick Look's depth sorting on overlapping transparent shells is unreliable. Keep one transparent shell per object; glass-inside-glass will flicker.
Normal maps look inverted. glTF and USD both expect OpenGL-style normals (green channel up), but assets that came through a DirectX pipeline sneak in flipped. If surface detail looks embossed instead of engraved on-device, invert the normal map's green channel — no re-export needed.
Emissive looks dim. Quick Look tone-maps against real-world lighting; an emissive strip that glows in your renderer reads as a matte sticker in AR. Multiply the emissive texture toward white and accept that HDR bloom is not available.
The Blender 5 glTF export settings guide covers producing a clean GLB before any of this; a clean source removes half the failure surface.
Test on-device before you ship
Serve the file with MIME type `model/vnd.usdz+zip` — without it, Safari downloads instead of launching AR. The trigger markup is a plain anchor carrying the attribute `rel="ar"`, its href pointing at the `.usdz` file and wrapping a preview thumbnail image — Safari overlays the AR badge on that thumbnail automatically. Then check three things on a physical iPhone (the simulator renders USDZ but skips the AR session): placement scale against a known object, material response as you move the phone (metallic surfaces should pick up your room's light), and file weight — keep USDZ under ~25 MB and textures at 2048px or below, because Quick Look decodes everything into memory on devices with far less headroom than your workstation. If the model needs slimming first, the browser-based poly reduction workflow and the GLB optimization guide both apply unchanged — optimize the GLB, then convert, never the other way around.
---
*This post is part of the Ultimate Guide to Free 3D Game Assets — BitSoul's complete reference for formats, texturing, rigging, optimization, and engine integration.*