Notifications
Clear all

[Closed] Animation layers

 PEN

The system that I have doesn’t have clips that can be dragged and what not other then just filtering for the current list controller and only seeing the keys in the track bar. You can’t see the others at the same time how ever so a nice NLA editor would be nice. One of the things on a very long list. I tend to use Motion Mixer for that sort of thing at the moment.

 JHN

Eek, for poses I’m thinking of using the same technique Pauls attribute holder is doing, values of the instanced controllers, probably be copy and pasting it for a bit (with proper credits in the script! ;)). I’m thinking in 3 “layers” of poses: eyes, mouth and all. And storing and ramping the poses in. Interface is just going to be position markers on the face, no seperate UI for now. The controls provide acces to an empty mod with storing and posing.
No baking (or now), we’re just doing “pre-rendered” animation for TV and such.
The magic comes in tweaking the weights of the controls and skinning, imo. Since controls drive other controls in a weighted sense (like for example 20% of the cheek “muscles” moves with the mouth corner). I feel that’s going to be the magic part… the rest is just layering controllers… for now I’m still not using a scripted controller… all wire and lookats. and some position constraints.

Paul, do you instance the tracks to temporary nulls? I have a morphtarget animation script that assigns instances of the selected morph controllers to a customAttribute track on a temporary null that then only shows the keyframes of the selected tracks. But that clearly means you don’t have the object itself selected anymore. Good you maybe give a hint of how you do that?
And motionmixer? You really use that…!? I tried and just ran away, but maybe I missed out the obvious!

Thanks,
-Johan

2 Replies
 eek
(@eek)
Joined: 11 months ago

Posts: 0

Hey Johan,

I’ve built and am still building a pretty dam flexible face pipeline for our characters at work, and no i cant discuss it too much as i’m bound by NDAs. What i will say is that it leans towards a lot of what were discussing, and is very flexible into how poses are mediated. With game engines you have to worry about not only save/loading in you source too, but how the engine interpolates its exported data, whether there’s a middle man etc etc.

If your using list controllers to store the face poses, you can not only control them by there weight. But also internally by using wiring, script controllers on the actual controller.

For example you could do this:

Have an eyelid follow pose, where is rotation controller or morph value follows the eye, via a script or wire. But on top of this drive its actual weight, for things like sleepy eyes. Or just if the animator wants to animate the eyelids by hand.

As for instancing controls, I do this with CA (not related to faces). But as you say the issue is you haven’t got the actual object selected. All you care about in the end is if the animator or use believes that this ‘temp’ object or slider is the value. Its just a case of making the controller easily accessible, in the viewport/rollout or trackview.

The other thing you can do is have a weak pointer/reference to the morph object, and re populate the rollout on the fly using execute “”. But that would be quite a bit of work if you rebuilding the morphs for a character into instanced controllers via rollout sliders.

Nice thing about this is that you only need to do it when you swap characters. Make the rollout tearable (pop out) and you have a pretty nice system.

(@polimeno)
Joined: 11 months ago

Posts: 0

have you seen POSETOOL script ?
i would strongly recomend you to ckeck it out, i use it a lot since it can layer things as you said.

 JHN

Hi Eek, I understand you cannot go in to deep with this stuff. Trying to keep it flexible here to… in the end I have build 2 scripted plugins, 1 for the setting up of stuff and 1 for the control objects. For tearing off rollouts I use a subrollout on the control that needs that specific rollout, I use a maxObject/instance to the other CA and just pops the rollouts in the subrollout tool.

Setting this stuff up is quite an interresting journey, I first build my tool as CA on a emptymodifier (no plugin errors on the renderfarm) but less flexible with updating. So now I build a set of scripted modifiers (thanks paul ;)) which are easy updateably but a bit less flexible on instancing, since now it references the object it’s applied to, so no instance modifiers… So I tear of the rollouts that I need to the new scripted plugin on the control objects. A bit convoluted still, but I think it will work out in the end. What I want to end up with is a setup script, that guides the whole process and 2 or 3 scripted plugins that take care of all wiring and weighting of the controls, and a script to quickly setup/align all the stretchy bones. Abstracting this stuff further and further I feel that 1 particular control system can be used to control all sorts of animation. And I have some pretty interresting setup for following the contours of a face for the control points, which I cannot tell to much about right now…

Really starting to like this rigging business, mostly did pipeline tools before this.

-Johan

 eek

So now I build a set of scripted modifiers (thanks paul ;)) which are easy updateably but a bit less flexible on instancing, since now it references the object it’s applied to, so no instance modifiers…

Scripted modifiers can share persistent values, all you need to do is have them point to it. For example i have a modifier that checks where it gets its data from, if the directory is undefined it asks the user to point to one. Now any additional copies of that modifier will point to this directory. The way i do it is in a file that gets created the first time the user creates the modifier. Any additional copies of the modifier point to this created file. You could do this with an custom attribute in the scene too.

So I tear of the rollouts that I need to the new scripted plugin on the control objects. A bit convoluted still, but I think it will work out in the end. What I want to end up with is a setup script, that guides the whole process and 2 or 3 scripted plugins that take care of all wiring and weighting of the controls,

Yep, you basically need to just identify an object and its controllers, i do this via its name. When i build a pose in a list controller, I check if it already exists and if not i build the pose. Then when i go about rigging it i just query the name and the rig its part of.

So really what you want is a) Functions to build the pose, delete, rename it etc. b) set of functions to build the handle/slider/ui element and c) functions to wire them, unwire etc

Thats pretty much it – i have most of mine in a struct. I do this with pretty much everything i do. I do this because firstly i like to run tools without any ui, but also have the ablity to batch everything. This is really important if you have several characters etc.

Shout if you need a hand, my brain is currently firmly stuck in character pipeline re-factoring at the minute.

1 Reply
 JHN
(@jhn)
Joined: 11 months ago

Posts: 0

Yes, that is actually a very good idea! CA’s for scene specific stuff. Thanks!
The more I use them I find them annoying to work with (setup/redefine) and invaluable atr the same time, mostly in a metadata sort of way.

Yes, I too use naming conventions in the list controller, would like to have a better handler to foolproof it, but I think names is the best a listontroller can provide. You say you build poses on layers, is that a setup pose then, I don’t think you build a pose a layer and animate it’s weights?! (or maybe for phonemes?!) Or do you store poses in the layers? And not just the controller values, like PEN attribute holder does?

Yes, most of that I have already or prototyped.

I use structs almost exclusively since a year orso, they are very versatile, although I hate the fact the order of function declaration is important when functions use each other in the struct. And I have some more pet peeves with them, but there’s nothing better in maxscript, I think.

Thanks for the offer(!!), for now I seem to cope, it’s more the abstract thinking and the consequences and simply the time I can put into the system.

Thanks for picking your mind!
-Johan

 PEN

Sounds like we are all going down similar roads. In the system that I have built I have several scripted plugins, some modifiers and some objects. All reference each other through the weak referencing. I did another system for Pinky Dinky Doo where I had scripted objects, scripted modifiers and scripted materials all talking to one another and reading XML data from the drive. That mixed with Custom Attributes for the character specific tools made a very solid character pipeline. My car rig also uses the same ideas about scripted plugins referencing each other. Works great and about as unbreakable as I think you can get.

 JHN

But you can only store node references through weak referencing or am I mistaken? I now have a instance of the modifier in a maxObject attribute. How do you go about weak referencing a modifier… first the node and then try to get the name of the modifier
<weakrefence>.node.modifiers[#theMod]?

Thanks,
-Johan

1 Reply
 eek
(@eek)
Joined: 11 months ago

Posts: 0

Nope you can have a node tab, in a custom attribute. I think even controllers etc… eg.

append nodeTab $.test.pos.controller

You can store them in a maxObject or maxObjectTab param type. You just have to store them directly, not through a nodeTransformMonitor.

def = attributes testA
   (
   	parameters testP
   	(
   		testMaxObj type:#maxObject 
   	)
   )
   
   obj = box()
   b = bend()
   em = emptyModifier()
  
   addModifier obj b
   addModifier obj em
   custAttributes.add em def
   em.testMaxObj = b
   
   em.testMaxObj.enabled = false
   em.testMaxObj.angle = 72.5
 JHN

Eek, Matthieson: I know that you can do that, that’s what I do now, I was thrown off guard bij Paul saying he’s storing weakreferences. Would instancing a controller/CA or modifier be regarded as a weak reference? I would like to use the safest way possible, and if that’s storing weakreferences in a maxObjectTab and walking the modifier array then I use that, otherwise I’d be assigning directly to maxObjectTabs.

Thanks!
-Johan

 eek

I dont think it would in a node sence, it would just be a reference as the controller itself isnt changing and if it did the reference would be lost i think.

i.e if i make a reference to a.pos.controller[1].controller which say is a list controller and now i make it a position_xyz() i dont think it will keep that reference. But if you go up a level in your reference it will i.e a.pos.controller would work i think.

Ah, okay, I misunderstood you question in the first post. Now that I understand better, good question!

There is RefTargMonitor. I have not used this before (just found it in the help right now), but it seems to work the same as nodeTransformMonitor with the ability to hold reference to any maxObject. There could be drawbacks I am not aware of, but at least now I feel like I’m contributing something! haha Maybe someone has used it before and can say a little more about it.

Page 2 / 2