A .usdz file packs a USD scene and the images and sounds it uses into
one ZIP archive that can be read in place, without unpacking. Pixar’s USDZ
specification (version 1.3) and the package section of the OpenUSD Core Specification
define it. Its media type, registered with IANA, is model/vnd.usdz+zip.
ZIP rules
- Every file is stored without compression (method 0) and without encryption, so a reader can map or point at its bytes directly.
- The data of every file begins at a multiple of 64 bytes from the start of the package. Writers reach this by padding the variable-length extra field of each local file header.
- The Core Specification requires a 32-bit ZIP, not Zip64, and an end of central
directory record (
50 4B 05 06) with disk numbers 0 and no comment, ending the file. - Packages are read-only: to change one, unpack it, edit and package it again.
The ZIP structures themselves are described on this site’s ZIP pages.
The default layer
The first file in the archive is the package’s root, or default, layer: the USD
file that opens when the package is opened or referenced as a whole. It must be the
first local file and the first entry of the central directory. Pixar’s packaging tool
chooses it as the only USD file at the top level, or, if there are several,
defaultLayer.usd, and otherwise asks for it to be named.
What a package may hold
| Kind | Extensions |
|---|---|
| USD layers | usda, usdc, usd, and in Pixar’s list usdz for nested packages |
| images | png, jpeg (also jpg), exr, avif (added in version 1.3) |
| audio | m4a, mp3, wav, in that order of preference |
Other files are allowed by the Core Specification but may not open everywhere. Anything inside must be readable straight from memory, which rules out formats such as Alembic that need their own file handles.
Paths into a package
A file inside a package is addressed as scene.usdz[textures/wood.png],
and the brackets nest for packages within packages. Inside a package, paths that start
with ./ or ../ resolve only within it; other paths are looked
for in the package first and then through the normal asset resolver.