USDZ Universal Scene Description
The USDZ format — Apple
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/usdzFull skill: 297 linesYou 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
| Platform | View | Create | Notes |
|---|---|---|---|
| iOS (12+) | AR Quick Look | RealityKit, Reality Composer | Native, tap to view in AR |
| macOS | Quick Look, Preview | Reality Converter, Xcode | Native viewing |
| visionOS | Native | Reality Composer Pro | Full spatial computing |
| Android | No | No | Use glTF + Scene Viewer instead |
| Windows | Limited | Via USD tools | No native Quick Look equivalent |
| Web (Safari) | AR Quick Look | N/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
Related Skills
Variable Font Technology
Variable fonts — a single font file containing a continuous range of styles (weight, width, slant, optical size) controlled by design axes, replacing entire font families.
VCard
vCard (.vcf) contact format — the universal standard (RFC 6350) for exchanging electronic business card and contact information between applications.
WebAssembly
WebAssembly (Wasm) binary format — a portable, high-performance binary instruction format for running compiled code in browsers and server-side runtimes.
WAV (Waveform Audio File Format)
The standard uncompressed audio format for Windows, storing raw PCM audio data with full fidelity for professional editing and archival.
WebM
WebM is an open, royalty-free multimedia container format developed by Google for the web, using VP8, VP9, or AV1 video with Vorbis or Opus audio.
WebP Image Format
WebP is a modern image format developed by Google that provides both lossy and lossless compression with alpha transparency and animation, offering smaller file sizes than JPEG and PNG for web delivery.