AYON USD Workflow Guide

This is a draft community guide to serve as starting point for the documentation

This post is a WIP and will be edited in the coming days. You reading this now is not recommended AND :frowning_man: frowned upon (just kidding, feel free to provide early comments or questions.) But note that it may be skipping parts here and there or just plainly suck.

Note: If you’re facing USD workflow specific issues that are not global ‘workflow’ related questions those are best kept for a separate community forum post! So, you may want to report issues you have in a separate topic.

Since a recent PR a special AYON USD workflow has been implemented. It allows to create small contribution publishes from DCCs with USD export support to directly add your publish into for example an asset’s model or look variants or a shot’s department layers.

For now I’ll skip the What is USD? and Why use USD? and get straight to building assets and shots.

Getting started

Creating an asset

The producer has his :gun: pointing at you and needs the asset now!

When we are referring to the USD asset, we mean the asset with both the model’s geometry and the look’s materials and textures. The USD structure (simplified) then becomes:

asset.usd
  - look.usd
  - model.usd

Where the look is applied over the model inside the asset.

Creating the model

From a Maya, Houdini or Blender perspective

TODO: Add visuals - maybe short video recording

We will want to create our geometry’s contribution to the asset.
For the asset structure it’s critical we work within the asset’s hierarchy so that USD referencing works. (consider that USD mumbo jumbo for now)
As such, we’ll always work within a root group with the current folder (asset)'s name.
Say our character’s folder path is assets/char_hero then the root group is char_hero

We can make a hierarchy like:

char_hero/
    geo/
        body
        pants

And yes, cool heroes wear no shirts. :tshirt: Only pants :jeans: .

When done. We publish that char_hero as USD contribution to the model layer.
The publishing logic will make the layering of the model.usd into the asset.usd for you automatically.

So no we have:

asset.usd
    model.usd

When loading that in, we’ll have our hero wearing pants.
But it needs some :paintbrush::art: paint.

Creating the look

From a Houdini perspective

  1. Reference the asset so we have the model.

Note the word “reference” here. We are usually not “sublayering” the asset USD file

  1. Make sure to add a “layer break”. This special Houdini node breaks off the USD scene above it and from that moment on any changes on the existing hierarchy are just opinions that are overlaid on top of it. This means that when writing out a USD file now we’re not re-exporting the geometry itself, but only any changes we make after the layer break.

  2. Apply your materials to the char_hero/geo meshes and make sure your materials are within char_hero group as well. So usually you end up with:

char_hero/
    geo/
       body   <- material 'char_hero/mtl/body_shader' applied
       pants  <- material 'char_hero/mtl/pants_shader' applied
    mtl/
        body_shader
        pants_shader
  1. Publish as the look product type (which is a USD look in Houdini).

Creating a shot

TODO: Add visuals - maybe short video recording

Houdini perspective

  • Quickly, reference the asset.
  • Throw some lights into the scene.
  • Set up the USD Render Settings.
  • Publish your USD render submission to Husk Standalone

You are now the USD champion - until they ask you about asset variants, LODs, purposes and a layered shot structure, and more. Easy, cowboy!

Running production

TODO: Add more production examples

  • Show usage of variants of models and materials
  • Show overriding materials in Lighting department for a Loaded Asset
  • Show render submissions
  • Show rigged character publishing to shot, with cloth/fur after by FX department

Frequent issues

I do not see my model on loading the asset

On Load warning message "Unresolved Reference Path" shows

Since you’re publishing into the asset structure make sure your data is inside the expected default primitive path for that asset, where the default primitive is always {folder[name]} so your data should be inside /{folder[name]}/... so that the data resides inside the default primitive path.

This is wrong: :warning:

/geo/marble
/materials/material1

This is correct: :trophy:

/char_hero
    /geo/marble
    /materials/material1

You are lacking the default primitive it expects.

What are all these publisher options, like Target Product?

Some technical details explained by @MustafaJafar

USD Publish Settings explained

I’ll just focus on 4 interesting settings.

  1. target-product which is a user editable text.
  2. target-product_department-name which is a selection from a drop down list. and users/admins can’t change the items in the list.
  3. variant-set-name which is by default is set to {layer} which evaluates to the selected item in the drop down list in Num2
  4. variant-name which is by default is set to {variant} as the arrow in the screenshot points.

Asset Structure

The asset structure is based on:

But, let me summarize the results.

When enabling Asset Contribution + Add as Variant

[!NOTE]
I love how the asset definition is readable!
Any data in the asset defintion are static. They are computed on publishing.
Paths can change when using AYON resolver.
List of departments, layer-ids and order are hardcoded and not exposed yet to settings.

Product: target-product

# USD Asset
{target-product}.usda
  └── Xform {folder[name]}
        ├── inherits __class__/{folder[name]}
        └── payload ./payload.usda  # Relative path

payload.usda
  └── mata data
        └── sublayers
              └── {target-product_department-name}.usda:ARGS:{layer-id}, {order}

Product: target-product_department-name

# USD Asset Layer
{target-product}.usda
  └── Xform {folder[name]}
        ├── Variant Sets -> ["{variant-set-name}"]
        └── Variant Set "{variant-set-name}"
              └── Variant {variant-name}
                    ├── reference -> Published AYON usd product variant file path
                    └── custom data
                          ├── ayon_order
                          └── ayon_uri -> AYON URI for the published AYON USD product variant

Product: AYON-product-variant

# USD product
{AYON-product-variant}.usd
# It can be any hierarchy.

When enabling Asset Contribution without Add as Variant

It still add a variant! I think there might be a bug or I did something wrong…
Also, I’ll update this section once it works on my side.

When disabling Asset Contribution

[!NOTE]
It doesn’t affect the version in the latest published target-product or target-product_department-name.

Product: AYON-product-variant

{AYON-product-variant}.usd
# It can be any usd hierarchy.

Additional context

What’s next?

  • Improving the UX of the workflow - get it into artist’s hands, receive feedback and improve to simplify and streamline the approach.
  • Support a dedicated Ayon USD Asset Resolver to use AYON entity URIs to be resolved with runtime, with support caching and pinning - ayon-usd-resolver
    • And easily make it accessible to studios (ready-to-go builds and downloads from Addon Market, etc.)
  • Providing dedicated Ayon USD editing tools to manage existing USD assets and shots and their contributions, as part of the ayon-usd plug-in.
  • Multi-shot workflows, e.g. in Houdini
  • Providing easy access to USD viewers from e.g. standalone Loader to “view” your published USD shots and assets quickly
  • Publish from Maya RIGs directly to USD layers over a USD asset (preferably even by starting from a USD asset to begin with and swapping to the animation rig from it)
2 Likes