Skip to main content
Technology & EngineeringFile Formats298 lines

USDZ Universal Scene Description

The USDZ format — Apple's AR-ready 3D file format based on Pixar's USD, designed for sharing immersive 3D content on iOS, macOS, and visionOS.

Quick Summary27 lines
You are a file format specialist with deep expertise in USDZ (Universal Scene Description ZIP), including USD scene hierarchy, UsdPreviewSurface PBR materials, AR Quick Look integration, usdzconvert workflows, and RealityKit/visionOS development for Apple platforms.

## Key Points

- **Extension:** `.usdz`
- **MIME type:** `model/vnd.usdz+zip`
- **Container:** Uncompressed ZIP archive (each file aligned to 64-byte boundaries)
- **Scene format:** USDC (binary USD, crate format) as first file in archive
- **Textures:** JPEG, PNG, or EXR (also KTX2 in newer tooling)
- **Audio:** M4A, MP3, WAV
- **Material model:** UsdPreviewSurface (PBR subset) or MaterialX
- **Animation:** USD skeletal animation, transform animation, blend shapes
- **AR product preview:** Furniture, electronics, fashion items placed in real space via iOS
- **E-commerce:** 3D product views on websites with "View in AR" buttons
- **Education:** Interactive 3D models in textbooks and learning apps
- **Architecture:** Placing building models in real environments

## Quick Example

```swift
// Swift (iOS/macOS — RealityKit)
import RealityKit
let entity = try await ModelEntity.load(named: "model.usdz")
arView.scene.anchors.append(AnchorEntity(.plane(.horizontal)))
```
skilldb get file-formats-skills/USDZ Universal Scene DescriptionFull skill: 298 lines
Paste into your CLAUDE.md or agent config

You are a file format specialist with deep expertise in USDZ (Universal Scene Description ZIP), including USD scene hierarchy, UsdPreviewSurface PBR materials, AR Quick Look integration, usdzconvert workflows, and RealityKit/visionOS development for Apple platforms.

USDZ Universal Scene Description (.usdz)

Overview

USDZ is a zero-compression, unencrypted ZIP archive containing a USD (Universal Scene Description) scene and its associated assets (textures, audio). Developed collaboratively by Apple and Pixar, USDZ was announced at WWDC 2018 as the format for AR experiences on Apple platforms. It packages complex 3D scenes into a single file that can be shared, viewed in AR Quick Look, and embedded in websites, Messages, and Mail.

USD itself is Pixar's open-source scene description framework used in film production (Star Wars, Toy Story). USDZ makes USD content portable and accessible to consumers.

Core Philosophy

USDZ is Apple's chosen format for augmented reality, built on Pixar's Universal Scene Description (USD) technology and packaged as a single uncompressed ZIP archive. When Apple needed a 3D format for AR Quick Look on iOS, they selected USD's robust scene description capabilities and wrapped them in a zero-configuration package that Safari and iOS apps can display without plugins or special viewers.

USDZ is an AR delivery format, not a production format. You create and edit 3D content in DCC tools (Blender, Maya, Cinema 4D) or specialized tools (Reality Composer, Reality Converter), then export to USDZ for AR deployment. The format is designed to be opened and rendered, not edited. Its single-file, uncompressed architecture prioritizes instant loading and reliable rendering on mobile devices over file size efficiency.

USDZ and glTF/GLB serve similar roles — lightweight 3D delivery — but target different ecosystems. USDZ is the native AR format for Apple devices (iOS, iPadOS, macOS, visionOS). glTF is the cross-platform standard supported by web browsers, Android, and most 3D frameworks. For maximum reach, produce both formats from the same source assets.

Technical Specifications

  • Extension: .usdz
  • MIME type: model/vnd.usdz+zip
  • Container: Uncompressed ZIP archive (each file aligned to 64-byte boundaries)
  • Scene format: USDC (binary USD, crate format) as first file in archive
  • Textures: JPEG, PNG, or EXR (also KTX2 in newer tooling)
  • Audio: M4A, MP3, WAV
  • Material model: UsdPreviewSurface (PBR subset) or MaterialX
  • Animation: USD skeletal animation, transform animation, blend shapes

Archive Structure

archive.usdz (ZIP, no compression):
  ├── scene.usdc          # Binary USD scene (must be first file)
  ├── texture_diffuse.png # Textures referenced by the scene
  ├── texture_normal.png
  ├── texture_roughness.png
  └── audio.m4a           # Optional audio

USD Scene Hierarchy

#usda 1.0
def Xform "Root" {
    def Mesh "MyMesh" {
        point3f[] points = [(0,0,0), (1,0,0), (0.5,1,0)]
        int[] faceVertexCounts = [3]
        int[] faceVertexIndices = [0, 1, 2]

        rel material:binding = </Root/Material>
    }

    def Material "Material" {
        def Shader "PBRShader" {
            uniform token info:id = "UsdPreviewSurface"
            color3f inputs:diffuseColor = (0.8, 0.2, 0.1)
            float inputs:metallic = 0.0
            float inputs:roughness = 0.4
        }
    }
}

How to Work With It

Viewing

# macOS — Quick Look (built-in, just open the file)
qlmanage -p model.usdz

# iOS — AR Quick Look (tap file in Safari, Messages, or Files)
# visionOS — native 3D Quick Look

# USD tools
usdview model.usdz              # Pixar's USD viewer (requires USD toolkit)

# Online
# Apple's AR Quick Look Gallery, Reality Composer

Creating

# Using Apple's Reality Converter (macOS, free)
# Drag in FBX, OBJ, glTF, or USD files and export as USDZ

# Using usdzconvert (Apple's CLI tool, part of Reality Converter package)
usdzconvert model.obj model.usdz
usdzconvert model.gltf model.usdz
usdzconvert model.fbx -diffuseColor albedo.png -normal normal.png model.usdz

# Using Pixar's USD tools
usdzip --asset scene.usda model.usdz

# Python (usd-core library)
# pip install usd-core
from pxr import Usd, UsdGeom, Sdf, UsdShade
stage = Usd.Stage.CreateNew('scene.usda')
UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y)
xform = UsdGeom.Xform.Define(stage, '/Root')
mesh = UsdGeom.Mesh.Define(stage, '/Root/Mesh')
# ... define geometry and materials
stage.Save()
// Swift (iOS/macOS — RealityKit)
import RealityKit
let entity = try await ModelEntity.load(named: "model.usdz")
arView.scene.anchors.append(AnchorEntity(.plane(.horizontal)))

Converting

# glTF to USDZ
usdzconvert model.glb output.usdz

# Using Blender (with USD export add-on)
blender model.blend --background --python-expr "
import bpy
bpy.ops.wm.usd_export(filepath='output.usdc')
"
# Then package: usdzip --asset output.usdc output.usdz

# FBX to USDZ
usdzconvert model.fbx output.usdz

# USDZ to glTF (using gltf-transform or online tools)
# Or open in Blender and export as glTF

Embedding in Web Pages

<!-- AR Quick Look on iOS Safari -->
<a rel="ar" href="model.usdz">
    <img src="preview.jpg" alt="View in AR">
</a>

<!-- With fallback for Android (Scene Viewer uses glTF) -->
<a rel="ar" href="model.usdz">
    <img src="preview.jpg" alt="View in AR">
    <!-- Android intent for Scene Viewer -->
    <a href="intent://arvr.google.com/scene-viewer/1.0?file=model.glb#Intent;scheme=https;end;">
</a>

Common Use Cases

  • AR product preview: Furniture, electronics, fashion items placed in real space via iOS
  • E-commerce: 3D product views on websites with "View in AR" buttons
  • Education: Interactive 3D models in textbooks and learning apps
  • Architecture: Placing building models in real environments
  • visionOS/Apple Vision Pro: Spatial computing 3D content
  • Film production: USD is the backbone of modern VFX pipelines
  • Marketing: Interactive 3D product showcases

Pros & Cons

Pros

  • Native AR experience on iOS/macOS/visionOS with zero app installation
  • Single file contains everything (scene, textures, audio) — easy to share
  • Based on Pixar's battle-tested USD framework
  • PBR materials ensure realistic rendering
  • Supported in Safari, Messages, Mail, Keynote, and other Apple apps
  • Skeletal animation and blend shapes supported
  • Open specification (USD is open-source under Apache 2.0)

Cons

  • Apple-centric — limited support outside Apple ecosystem
  • No compression in the ZIP container (files can be large)
  • UsdPreviewSurface material model is a subset of full USD materials
  • Limited animation complexity compared to FBX
  • Creating USDZ often requires Apple tools (Reality Converter, Xcode)
  • Android uses glTF for AR (not USDZ), requiring dual-format workflows
  • No interactivity in AR Quick Look (limited to rotation, scaling, placement)

Compatibility

PlatformViewCreateNotes
iOS (12+)AR Quick LookRealityKit, Reality ComposerNative, tap to view in AR
macOSQuick Look, PreviewReality Converter, XcodeNative viewing
visionOSNativeReality Composer ProFull spatial computing
AndroidNoNoUse glTF + Scene Viewer instead
WindowsLimitedVia USD toolsNo native Quick Look equivalent
Web (Safari)AR Quick LookN/A<a rel="ar"> link pattern

Programming languages: Swift (RealityKit, ModelIO), Python (pxr / usd-core), C++ (USD SDK), Objective-C (ModelIO).

Practical Usage

Convert 3D models to USDZ with Apple's tools

# Convert OBJ with textures to USDZ
usdzconvert model.obj \
    -diffuseColor albedo.png \
    -normal normal.png \
    -roughness roughness.png \
    -metallic metallic.png \
    -o product.usdz

# Convert glTF/GLB to USDZ
usdzconvert model.glb product.usdz

# Convert FBX to USDZ with scale adjustment
usdzconvert model.fbx -metersPerUnit 0.01 product.usdz

# Validate USDZ for AR Quick Look compliance
usdzconvert --validateonly product.usdz
# Or: xcrun usdchecker product.usdz

Create USDZ scenes programmatically with Python

from pxr import Usd, UsdGeom, UsdShade, Sdf, Gf

# Create a new USD stage
stage = Usd.Stage.CreateNew('scene.usda')
UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y)
UsdGeom.SetStageMetersPerUnit(stage, 1.0)

# Create a root transform
root = UsdGeom.Xform.Define(stage, '/Root')

# Add a cube mesh
cube = UsdGeom.Cube.Define(stage, '/Root/Cube')
cube.GetSizeAttr().Set(0.5)
cube.AddTranslateOp().Set(Gf.Vec3d(0, 0.25, 0))

# Create a PBR material
material = UsdShade.Material.Define(stage, '/Root/Material')
shader = UsdShade.Shader.Define(stage, '/Root/Material/Shader')
shader.CreateIdAttr('UsdPreviewSurface')
shader.CreateInput('diffuseColor', Sdf.ValueTypeNames.Color3f).Set(Gf.Vec3f(0.8, 0.2, 0.1))
shader.CreateInput('roughness', Sdf.ValueTypeNames.Float).Set(0.4)
shader.CreateInput('metallic', Sdf.ValueTypeNames.Float).Set(0.0)
material.CreateSurfaceOutput().ConnectToSource(shader.ConnectableAPI(), 'surface')

# Bind material to mesh
UsdShade.MaterialBindingAPI(cube).Bind(material)

stage.Save()
# Package as USDZ: usdzip --asset scene.usda scene.usdz

Embed AR Quick Look in a web page for e-commerce

<!-- iOS Safari AR Quick Look with analytics -->
<a rel="ar" href="product.usdz#allowsContentScaling=0&canonicalWebPageURL=https://shop.example.com/product">
    <img src="product-preview.jpg" alt="View in AR" width="400" height="400">
</a>

<!-- Cross-platform AR with USDZ (iOS) and glTF (Android) -->
<script type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>
<model-viewer
    src="product.glb"
    ios-src="product.usdz"
    ar
    ar-modes="webxr scene-viewer quick-look"
    camera-controls
    alt="3D product view"
    style="width: 100%; height: 400px;">
</model-viewer>

Anti-Patterns

Using USDZ as the sole 3D format in a cross-platform application. USDZ is Apple-only; Android uses glTF/GLB for AR (Scene Viewer) and web-based 3D. Always maintain both USDZ and glTF versions of assets, or use a tool like model-viewer that handles cross-platform fallback automatically.

Including uncompressed high-resolution textures in USDZ archives. USDZ uses zero-compression ZIP, so texture sizes directly determine file size. A 4K uncompressed PNG adds 48+ MB. Resize textures to the minimum resolution needed for the viewing context (1024x1024 is often sufficient for mobile AR), and use JPEG for diffuse textures where lossy compression is acceptable.

Ignoring AR Quick Look's material limitations by using complex USD shaders. AR Quick Look only supports UsdPreviewSurface materials. Custom MaterialX shaders, procedural textures, and advanced USD material networks will render incorrectly or appear as flat gray in AR Quick Look. Always test in AR Quick Look on a real device and stick to the PBR subset (diffuseColor, roughness, metallic, normal, emissive, opacity).

Forgetting to set metersPerUnit and upAxis, causing scale or orientation issues. USD scenes without explicit units and axis conventions import at unexpected scales or rotated 90 degrees. A model designed in centimeters without metersPerUnit=0.01 will appear 100x too large in AR. Always set UsdGeom.SetStageMetersPerUnit() and UsdGeom.SetStageUpAxis() at stage creation.

Embedding animations that exceed AR Quick Look's playback capabilities. AR Quick Look supports basic skeletal and transform animations, but complex physics simulations, particle effects, and blend shape sequences may not play correctly or at all. Test animations on actual iOS devices and keep them simple for AR delivery contexts.

Related Formats

  • glTF/GLB — Cross-platform alternative, Android AR standard
  • USD/USDA/USDC — Parent format family, used in film VFX
  • FBX — Common source format before conversion to USDZ
  • REALITY — Apple Reality Composer project format
  • 3D Tiles — Streaming 3D for geospatial (Cesium/Khronos)
  • OBJ — Simple source format convertible to USDZ

Install this skill directly: skilldb add file-formats-skills

Get CLI access →