Are Constraints (from Machinima) still available as an extension?

Machinima beta is deprecated, with animation retargeting, the sequencer, and timeline all now in Composer 105 by default.

One feature in Machinima that I cannot find as an extension in 105 are the animation constraints. Things like omni.anim.pinConstraint which can make one object track another object. (Full list: Transform, aim, and pin constraints.)

https://docs.omniverse.nvidia.com/extensions/latest/ext_animation-constraints.html

Are these constraints still available in an extension that can be added to Composer? Or is there a way to do them in OmniGraph or similar now?

Thanks!

1 Like

Honestly the quickest and easier way is to simply create an XFORM with object A and then put Object B under that Xform. Then B will follow A. etc

I think the reason they added the constraint in Machinima for characters is you cannot do the parenting trick with Skeletons. In USD the bone hierarchy gets instantiated at runtime, so you cannot “parent” a cup to the hands in a USD stage. You have to do run time tricks like a pinning constraint that gets applied at run time, after the stage is loaded. (There was talk of changing this in the future, but it’s how it works today.) So the only way to parent objects to characters with skeletons is using constraints.

2 Likes

I really need the feature of parenting some object to characters hand ( joint at skeleton ).

I am not able to do that now in Composer 2023.2.5
Please help if there is any solution?

Pekka Varis

Are you looking to bind on object permanantely or temporarily to a chacterers hand ? For permanantly, you would just put the object under the same xform as the hand, and it will automatically follow.

It is not possible. Skeletons in USD are “different”. The skeleton is in an array of joints property, not a hierarchy of prims. Its different to every other platform I know of. At runtime, it then creates a prim hierarchy. So it looks like there is a prim hierarchy, but it does not exist in saved files.

E.g.,

      uniform token[] joints = [
        "Root",
        "Root/J_Bip_C_Hips",
        "Root/J_Bip_C_Hips/J_Bip_C_Spine",
        "Root/J_Bip_C_Hips/J_Bip_C_Spine/J_Bip_C_Chest",
        "Root/J_Bip_C_Hips/J_Bip_C_Spine/J_Bip_C_Chest/J_Bip_C_UpperChest",
        ...

The Skeleton prim does not have any children prims. My guess is this has to do with crowd support, which is what skeletons in USD were originally for. Instancing does not allow overrides for the prim hierarchy, only properties on the root prim. So I wonder if they put all these things into attributes to support instancing for crowds.

With OpenUSD, I believe people are looking to support more traditional skeletons and animation curves etc, to make interchange etc easier. At that time, parenting will be possible. But its not supported today.

Note that constraints rather than reparenting are often supported in platforms like Unreal Engine and Unity as well. Sometimes parenting makes a mess of your project structure, or you get animation cases like a cup on a table is picked up by a hand. Rather than restructure the hierarchy mid-animation, you have a constraints that you turn on/off with an animation curve, so the cup stays in place originally, then starts tracking the hand when the hand reaches the cup.

But bottom line is, for USD, until they rework the skeleton structure, the only way to do the parenting in a saved file is with a constraint. So those Machinima constraints I think were to solve that problem in Omniverse. Ideally there would be a “parenting” schema in USD so everyone does it the same way, with an “on/off” attribute to animate.

Can someone send me a file so I can play with it ? I am not a character person but I can see what I can find out.

Here is a ZIP file I was using to ask about instancing with skeletons (I cannot work out how to make it work - when I set “instanceable = true” the animations all stop), but you can ignore the instancing stuff and just open instancing-stage.usda and hit “play”.

character.usda is the character model with skeleton etc defined.
animation*.usda are silly little SkelAnimation clips created from a webcam.
instancing-stage.usda is the stage linking them all together.

Once you open the character, you will see Skeleton prim has the bone structure under it, even though its not in the USDA file. It gets that from the joint paths array.

Thanks for having a look!

Oh, and if you do “ask an expert”, I would love to know what I am doing wrong for instancing. ;-) ;-) ;-)
I tried in the AOUSD forums but did not get any suggestions. SkelAnimation and instancing for crowds - what am I doing wrong? - USD - Alliance for OpenUSD

Ok I am going to dig in more, but aparently its now all done in OmniGraph using the “constrain” node in there. I will find out more about get back to you.

1 Like

Just adding some updates in case others interested.

I found documentation for an Action Graph node Xform Constraint that sounded like it might have been Machinima inspired, but I cannot find the actual code. (So either the node is missing, or the docs should be deleted since it does not exist.)

But I have tried a few things to try and get a child object to track hands or the head inside Omniverse without success. E.g. I used a Get Xform node and bound it to a hand, then Set Xform on a cube. The cube vanished as soon as it started running (scale, translate, and rotate were all set to zeros). The properties window showed the position of the hand, but the Action Graph nodes did not seem to be able to pick it up.

I also tried to create a separate layer file then parent a cube under the hand. The layer used “over” clauses to path all the way down to the hand, but the cube again was not visible.

I also tried adding physics to the hand in the override layer, but got lots of errors from the physics subsystem.

So then I wondered about using “Get Animation Graph Joint Transform”. I assume I have to create an animation graph rather than time samples data to make that work (?). I try pointing it at my SkelRoot but I get “Invalid Character”. Not sure what that means!