DEV Community

Cover image for Why Your 3D Model Won't Open on iPhone — and the No-Install GLB to USDZ Fix
Cenk KURTOĞLU
Cenk KURTOĞLU

Posted on

Why Your 3D Model Won't Open on iPhone — and the No-Install GLB to USDZ Fix

Why Your 3D Model Won't Open on iPhone — and the No-Install GLB → USDZ Fix

If you have ever sent a .glb file to someone with an iPhone and watched Safari shrug, you already know the wall: Apple's AR ecosystem does not speak glTF. iOS AR Quick Look, Safari previews, and Vision Pro all want one format: USDZ.

This is the story of that wall, why the usual tools don't help half of us, and how I ended up shipping a browser-only converter at renderivo.com/convert (first conversion free, no account) — with the technical details of what actually happens inside the conversion.

The wall, precisely

  • glTF/GLB is the web standard. Three.js, <model-viewer>, Shopify 3D, WebXR — they all eat GLB happily.
  • USDZ is Apple's AR format — a zip archive containing USDA (text scene description) plus textures. AR Quick Look on iOS literally refuses anything else for AR previews.
  • So any pipeline that touches an iPhone — "scan this QR code to see the product in your living room" — needs a USDZ sitting at a URL. On Android the same link works with GLB (Scene Viewer). On iPhone: USDZ or nothing.

Why the usual answers don't help

The internet's standard advice for GLB → USDZ is:

  1. Apple's Reality Converter — macOS only. If you are on Windows or Linux, this tool does not exist for you.
  2. Blender — can import glTF, and with the right USD plugin can export USD. Expect an afternoon of plugin archaeology, and check your materials afterwards; the glTF PBR → USD conversion path is exactly where things silently break.
  3. Cloud converters — upload your model to somebody else's server. Fine for a sketchfab freebie; a different conversation when the model is a client deliverable under NDA.

If you have a Mac, open Reality Converter, done, happy for you. The rest of this post is for everyone else.

What a conversion actually has to do

I shipped a converter that runs the whole pipeline in the browser (the first post covers the internals). The short version:

  1. Read the GLB with @gltf-transform (WebAssembly, in-browser — the file never leaves the machine).
  2. Clean the geometry: weld() merges duplicate vertices, dedup() removes duplicated accessors, prune() strips unused nodes and extensions, resample() compresses animation keyframes. This is where a surprising amount of dead weight lives in marketplace assets.
  3. Watch the textures. Two things bit me here and are worth knowing even if you never touch my tool:
    • Never re-encode a texture into a different container than its declared mime type (WebP textures declared as WebP must stay WebP bytes, or viewers start guessing).
    • Some Chromium builds default canvas WebP encoding to lossless — a "downsized" texture can come out 3× bigger than the original. Always pass an explicit quality, and keep the original bytes if the re-encode came out larger.
  4. Emit USDZ with three.js USDZExporter — it builds the USDA text scene, rasterizes textures, and zips everything into a valid .usdz.

The result: one file in, two files out — the AR-ready USDZ, plus the cleaned-up GLB for the web side — with before/after sizes shown so you know what actually happened.

When you actually need this

  • Custom storefronts and headless commerce wiring up <model-viewer> yourself: the GLB goes in src, the USDZ goes in ios-src, and Android/iOS AR both work.
  • Product demos via link or QR — USDZ hosted anywhere opens straight into AR Quick Look on any modern iPhone.
  • Vision Pro content previews — same USDZ surface.
  • Client handoffs — "we need the web version and the Apple version" stops meaning installing a DCC tool.

The honest limits

Draco-compressed inputs are not supported in the current version (re-export without Draco). Morph targets don't survive the USDZ hop yet. And a 150 MB monster GLB will still make your browser fan spin — the ceiling is your RAM, not a queue.


The converter is at renderivo.com/convert — drop a file, watch it convert, download both formats. The first conversion is free and no account touches it; a one-time license unlocks unlimited conversions with no subscription.

Top comments (0)