Rigging in USD. Mgear in Maya

Hello everyone,

Just joined the USD community, looking for some guidance regarding USD and rigging.

We are trying to transition our pipeline into USD and I wonder how well does USD integrates rigging within one DCC.

Our goal is to work with rigging in USD using Maya so no compatibility with other DCCs is required. The documentation indicates that in this case it should be alright Introduction to USD — Universal Scene Description 25.08 documentation . Am I on the right direction or this isn’t possible?

If so I wonder if there’s any known limitation or advices regarding the use of the mgear plugin in USD.

Thanks!

Currently USD doesn’t have a concept of rigs. It can define characters as joints, skinning, animation and blendshape but anything beyond that requires custom schemas for the time being.

This is an area of interest though, so solutions will likely come eventually, but today that’s the state of things.

1 Like

Many years ago now (before USD even had attribute connections!) Ubisoft came up with their own complete encoding of Maya rigs into USD, for their internal use. Totally legit and doable, and you should be able to do the same with mgear. The only limitation is what Dhruv said… we’re currently working on solidly rolling out OpenExec, and a portable rigging framework is a consideration for after that project.

We are still doing it, with different internal rigging technologies. For those exploring the subject for the first time, in practice, it looks roughly like this (those are not the actual property / schema names):

def Skeleton "UbiHuman" (
  apiSchemas = ["UbiInternalRiggingTechAPI"]
)
{
  asset ubi:rig = @rig_state.xml@
}

usdview can’t make sense of the ubi:rig property, so the skeleton seems to be broken in usdview, but both ends of our pipeilne (DCCs and our game engine) can interpret the xml file.

Engine side, we write 100% of the USD I/O code, so natively support this schema. DCC side, we extend the native USD I/O plugin. For example, in Maya, it’s implemented as a SchemaApiAdaptor, something like:

class UbiInternalRiggingTechApiImporter(mayaUsdLib.SchemaApiAdaptor):
    def CopyFromPrim(self, prim, _args, _context) -> bool:
        api = pxr.Ubi.InternalRiggingTechApi(prim)
        rig_data_path = api.GetRigAttr().Get()
        return UbiInternalRiggingTech.LoadFile(rig_data_path)

This technique is useful to transport other third party data that can’t (or don’t need to) be represented in USD, like original DCC files, original super high res textures (not the compressed textures we send to the GPU, etc).

4 Likes