# Introduction
# What is Multiverse
Multiverse | USD is a plug-in for Autodesk Maya made by J Cube Inc (opens new window) which allow users to write, read, import, compose, override, layer, preview, playback and procedurally render USD files (Alembic files are also supported and treated as in-memory USD data, with other formats in the works).
# Philosophy
Rather than exposing the vastness and complexity of USD in its "raw" form into Maya, Multiverse goes great lengths into providing a way to work with USD that is as natural as possible for a Maya artist.
The driving principles for Multiverse are user-friendliness, ease of adoption, fast path to productivity and a gentle learning curve.
Multiverse offers clear workflows, pleasant UX, clear UI and an extremely easy Python API for automation and scripting. The API does not require any knowledge of the vast and complex set of USD APIs: as a result, integrating USD in your Maya workflow is very straight forward.
# Differentiating factors with maya-usd
Some differentiating and unique aspects about Multiverse:
- Used on major real world productions since 2015, worldwide.
- Stable, predictable and rock solid.
- Customer-demand driven development.
- Designed and crafted by a small company ran by developers rather than by a committee in a corporation ran by managers and marketers.
- 100% native USD compatibility. Currently using USD v23.02 without any
vendor-intermediate layer of abstractions (such as
ufe
in maya-usd) nor in-memory "virtual" nodes (nodes that do not exist in the Maya DG, such as, again, in maya-usd). This prevents incompatibility between Maya versions allowing Multiverse to run as far back as Maya 2018, and ensure the best performance and the lowest memory usage. - Unified workflow that is common to all renderers, this makes it easy to switch renderer.
- Unmatched, well thought and unique workflow for the lifecycle and consumption of USD Assets, Compositions and Overrides.
- Multi-stage design where each asset/composition and their overrides are well defined in individual USD stages (rather than single scene stage like in maya-usd). If a single stage is desired, simply use a single compound loading everything.
- Minimal memory footprint usage, great I/O performance.
- Ability to strategically choose viewport draw modes at compound level and at type level (for instances / point instances).
- Ability to decouple viewport and render visibility, similarly to Houdini
- Support for light-linking between Maya lights and items in the USD stage.
- USD-to-Maya procedural data importer with "live connection" allowing to import modify and synchronize "back to Maya" individual prims of various types (including instances), or portions of hierarchies or entire hierarchies.
- Powerful override logic with inheritance (to minimize scene description) and full support for animated data on transform, attributes, shading values etc.
- Native USD material schema to serialize any Maya shading networks without the need for 3rd-party intermediate layer of abstraction libraries. These can be used for interchange and/of for procedural rendering.
- Support for writing and reading USD files over NFS on any platform.
- Full procedural rendering with the most popular production render engines.
- Ability to procedurally render USDZ (or any USD file with usdPreviewSurface) files with PBR shading.
- Access to the very same features and workflow without limitations on all Maya versions: 2018 2019 2020 2022 2023 2024
- Support for multiple Python versions, matching each Maya version py27, py37, py39, py310.
- Easy to use with a pleasant and logical user interface.
- Python API that is easy to use and does not require any USD knowledge.
- Asset Resolution 2.0 support
- Unique workflow for MoCap and crowds
- OpenPype (open source) and Prism (closed source) out-of-the-box integration
To setup Multiverse on your computer refer to the setup documentation.
# What can you do with Multiverse
With Multiverse you can quickly introduce a non destructive USD workflow in your existing pipeline without any low level knowledge about USD and without any custom development.
Multiverse allows to easily accomplish any of these tasks without writing any code:
- Create USD Assets
- Compose hierarchies of USD Assets into Compositions (and, recursively, nest other Compositions)
- Override USD data hierarchically (transform, material assignment, attributes, variants, visibility etc.) with full support for animation and sparse data.
- Read USD data into Multiverse "Compound" shape nodes. This reads USD files (and also Alembic, STEP, IGES, IFCm OBJ and STL files as native USD data) into Maya by streaming them to the viewport.
- Compound shape nodes can be also "empty", waiting for data, and also remember overrides, this means swapping assets with same hierarchy will accept existing overrides.
- Draw USD data in the Maya viewport in a multitude of ways.
- Easily author and override attribute and geometry variants
- Easily author and override (animated) USD attributes and primvars, and use them to drive Maya attributes or shading network attributes.
- Layer Assets with Asset sparse data and Overrides
- Render USD data procedurally with 3DelightNSI, Arnold, Redshift, RenderMan and VRay. This reads USD files by streaming them procedurally to the renderer, at render time.
- Selectively import USD data in Maya, modify it and put it back into USD via layering.
- Interchange USD data with other DCC applications
- Apply skeleton animation data to hierarchies (very useful for MoCap)
- Create UDZ Material Packages
- Serialize renderer-arbitrary shading networks in USD (via USD Shade API) for interchange or rendering.
- Callback functionality, allowing a TD to execute custom Python scripts on Multiverse USD write. Any functionality available from the USD and Python API can be used, such as removing unwanted prims, adding custom attributes, and even notifying databases.
For who can write code Multiverse offers an extremely easy Python API that makes all the above tasks quickly scriptable, this allows any degree of automation in your pipeline.
USD files written by Multiverse are 100% native USD data, they can be exchanged
with any other DCC applications able to interchange USD. Likewise, Multiverse
can read native USD data created by other applications. All the extensions are
supported: .usd
, .usdc
, .usda
, .usdz
. Sequences of USD files can also be
read, as USD clips.
It is also possible to load Alembic data (.abc
) in Multiverse Compounds,
further compose it & override it in other USD files, and render it procedurally.
Alembic data is always converted on the fly (in memory) to USD data. USD clip
from Alembic data are also supported.
# Assets, Compositions, Overrides, Compounds and Layering
In Multiverse we use the following concepts with USD I/O.
# Asset
In Multiverse, the term "asset" refers to a USD file that contains a hierarchy of primitives (transforms, shapes and other). In Maya this is typically a hierarchy of nodes, as it can be seen in Outliner, that is written out to a USD file. Once read, the same hierarchy will be visible in MEOW (the Multiverse Explore and Override Window):
An asset is generated from static or animated Maya data, such as:
- poly meshes
- instances
- instancers
- blend shapes
- reference objects
- particles/points
- curves (such as paint effects, nhair and nurbs)
- joints & skeletons
- subdivision surfaces (smooth mesh)
- full shading networks
- StingrayPBS shading networks (which will become usdPreviewSurface networks)
- cameras
- lights
and other Maya attributes such as:
- normals
- (multiple) UV sets
- color sets
- visibility
- tangents
- skin weights
- material assignment (which Maya or embedded USD material is assigned to which prim)
- custom Maya-typed attributes
- Custom USD-typed attributes
It is also possible to specify Maya data to be part of variants and to be used for different USD purpose by tagging them with attributes.
# Compound
Any USD file is read (streamed) into Maya with a Multiverse "Compound" shape node. The node has several controls for drawing, time, generic rendering and renderer-specific attributes.
All data is streamed to the viewport and not contained in Maya.
Thanks to the various viewport load options the user can strategically decide how to minimize the cost of viewport draw effectively being able to load any data, this allows to bring into Maya scenes of virtually unlimited complexity.
It is also possible to stack multiple "Layers" (where top wins over bottom) so that data can be non-destructively overridden with sparse or entirely new USD data. Compounds can transformed, animated, composed, overridden, instanced, point-instanced etc.
Compounds can be created without any layer, waiting to receive data, can point to empty USD files (waiting to be filled by other write operations) and remember overrides, so it is possible to swap assets with similar or same hierarchy and inherit pre-existing overrides.
# Composition
In Multiverse, the term "composition" refers to composing more than one USD file, whether from a Compound or from its layers. More specifically:
- a USD file resulting from writing a hierarchy of Multiverse Compounds shape nodes (including any layer in it) and Maya transform nodes, as they were seen in Outliner before writing the data. This hierarchy is written out to a USD file that effectively contains a static or animated composition of other USD files written as USD "references" or "payloads" depending on the relative setting in the Compound before writing.
- a USD file resulting from writing a single Multiverse Compound shape node with more than one layer in as they were seen in the Compound Shape before writing the data. This compound is written out to a USD file that effectively contains a static or animated composition of a single USD files with its layers written as USD "subLayers" depending whether the "Write as Compound Layers" option was enabled in the composition writer.
Once read, the same hierarchy will be visible in MEOW:
A Composition, just like an Asset, us read back into Maya into a Multiverse Compound shape and it can be, again, further composed, layered, overridden etc.
# Override
In Multiverse, the term "override" refers to a USD file that contains static or animated overrides for a USD hierarchy. Overrides are set in MEOW, they can be:
- render visibility overrides
- transform overrides (with support for hierarchy propagation from the foster parent)
- attribute overrides
- material assignment overrides
- variant and variant definition overrides
- instancing state overrides
- activity state overrides
For example, if in MEOW we apply a transform override on one of cats, indicated by the axis triad icon, we will insert a transform node in the hierarchy for easy manipulation and animation.
# Layering
Overrides are stored in Maya for until they are written out to a USD file that effectively contains a static or animated hierarchy of overrides that can be "layered" on top of Assets, Compositions and other Overrides. The auto-sync option in the override writer will layer it automatically.
An Override is is typically read back into Maya as a layer of a Multiverse Compound shape and it can be further composed and overridden.
It is important to understand layering allows to layer any type of data but when overlayed to a matching hierarchy item layering will override the data. Sparse data can also be layered (the asset writer of Multiverse has an option to write sparse data).
Typically in production with multiple teams or people working on different aspects of the asset it is common to see several layers to define the asset, as an example:
> [ more_overrides.usd ]
> [ overrides.usd ] (attributes, material assignment, transforms...)
> [ animated_point.usd ] (sparse)
> [ material_assignment.usd ] (sparse)
> [ material_shading_networks.usd ] (for interchange or 3Delight NSI rendering)
> [ final_uv.usd ] (sparse)
> [ model_basic_uv.usd ]
2
3
4
5
6
7
A compound with multiple layers can be also "consolidated" into a composition by itself and the resulting layers will be not visible anymore in the compound UI when further read back.
# Importing as Maya data with "live connection"
Multiverse Compound nodes reference data on disk (.usd and .abc files) and streams their content into the Maya viewport and into the renderers. This data is typically not editable, instead it is possible to non-destructively override it, and overrides can be saved as USD layers.
When desired, Multiverse can "import" USD data into the scene as Maya data. Multiverse permits to import individual prims, sub hierarchies or even full hierarchies of prims into the Maya scene as Maya data. This can be done selectively from MEOW or from the File> Import> USD (Multiverse) option.
Multiverse tracks what is being imported, so upon modification, it is possible to write the modified data as a USD file for being layered on top of its relative Compound (this can happen automatically with the auto-sync option) as a live connection, see the importer documentation.
# Rendering
Multiverse offers procedural rendering with all the major production renderers, supporting virtually any version of them:
- 3DelightNSI (version 1, 2, 3)
- Arnold (version 5, 6, 7)
- Redshift (version 3, 3.5)
- RenderMan (version 23, 24, 25)
- VRay (version 4, 5, 6)
Procedural rendering effectively means that data is streamed to the renderer at render-time. No heavy data is ever stored in the Maya scene nor in the renderer scene description files, this effectively means:
- small Maya files that load fast (.ma/.mb)
- small scene description files for rendering that load fast (
.nsi
/.ass
/.vrscene
/.rib
)
This is completely transparent to the user: Multiverse Compound nodes present in the scene, once a render is launched, will stream data to the renderer in a procedural fashion.