[Closed] Animation layers
Does anyone use animation layers?
I never cared for the interface and use of animation layers, but I just discovered they have the useful .exposedN where N = X, Y or Z properties. So with that you can wire to just the exposed controllers and add layers at will above that, no worrying to break anything. One thing I don’t like though is that disabling a layer still that layers values get sent out to a .exposeN property, you also have to weight the layer to 0 to make it work.
So I’m wondering is anyone using this layer controller? I want to incorperate different layers for setting stuff up (base layer) then different layers for mocap, procedural and handkey animation.
I wonder if people have experience using it in a scripted setup and are finding it usefull/stable to work with, before I’m setting up to much stuff depending on the layer controller.
Thanks,
-Johan
huh?
Is this like position list controllers? of the non-linear animation thingy?
It’s an interface that exposes a “new” (since max 9 I believe ) controller type: layer_controller.
It works almost identical to list controllers except for a bunch of features I do not care for, besides the exposeX Y and Z properties of the controller. If you wire a lot, you would have to wire to all sub controllers in the list controller, the layer controller exposes 1 value to wire to, and N number of layers. That’s a good thing for me.
But now I’m hoping you can nest a layer controller in a list controller, if that can be done I’d be all set… but I’m not quite sure yet, but I think I can think of another way to work around that problem.
The thing I don’t like is that you can’t rename the base layer.
But again the UI is just crap to work with, so hopefully I’ll be scripting it all together.
Anyone with some more insights/experience?
-Johan
Layer controller was added in Max 8 I think. I do use them but mostly I use my own systems as I developed it years ago that uses list controllers. I hadn’t tried just switching off a layer in the layer controller as I think I have always just weighted it off. I would say that is a bug and should be reported. If a track is off I expect that it will be off every where. When I wire to the list controller I just break the tracks up my self and in the case of rotations I do the conversion my self. Much of the time how ever I use the exposeTM helper and get the values I want through that. The reason I do that is the whole controller stack can be changed and you don’t break anything.
What I like about a layer / list controller setup is that I can get values out of the controllers there are zero’d out by nature. And I don’t need to put an extra null between the point needed to zero it out, but that means the base controller holds the “world” or “adjust” values. I’m looking for a way to have both. And use the base layer/controller as a world/adjust value and all following layers (preferably accumulated, like layer controller does) as the animation/keyframe/mocap values. I’m mostly talking facial rigging now, so the zeroing out of controller values are very handy. But now I can’t have 1 controller which does both.
I want the results of all layers above base layer in 1 value and the base layer as 1 value. Probably have to zero out. What I don’t like about the exposeTM helper is that I can’t get the offset of an object to the exposeTM itself, it creates dependency loop… so that means another layer off nulls to manage… I like to keep it as simple as possible.
How do you manage layers with listcontrollers, you have a callback or some scene traversell to set all necessary weights and active controllers?
Thanks!
-Johan
Well this is something that I do in my list controller layer setup as well. I use a list controller with two list controllers in it. The first is the current value or the setup controller list and the send contains all the animation tracks. I do wire directly some times to the animation list controller some times. All depends on what I’m doing and what I might think could happen to it all. I’m often over cautious about rigs as they are always being done for other productions. so I want to make sure that I can fix/change/update anything with out problems.
Alright so you wire to a listcontroller sub controller’s .x, y or z property… I see know, that’s great! I thought you could only wire directly to a track, but you can wire to a xyz controller to if you choose the .x y or z property…
Yes then a list controller is more effective to me then the layer controller, since you can’t nest layer controllers it seems…
Ok cool! Thanks!
Some things I’m wondering, do you have a global control to switch all layers on a rig to a certain layer?
How do you do automated lipsync, do you plot to a layer or have a layer for each phoneme and animate the weights, a script I found here is setup like that, but I don’t like it at all… I’d rather have the intermediate tool, figure out the keyframes from the data provided and plot it to 1 track each control. Then in a next layer I can keyframe on top of that.
Just starting to really like this rigging business
Thanks again for all the answers so far!
-Johan
To both of you,
yes this is pretty much how I do my rigging with list controllers. Puppet shop too pretty much works this way, and sort of the paradigm of max in general layers of things ontop of each other. Modifiers, controllers etc etc…
I’ve never really built my own anim layer system yet, – but if i would id basically abstract the list-controller methodology for it. I.e
Treat animation layers as the weight of a controller. Then interface the set active, weighting etc etc in a simple affective rollout. Have a ‘base’ or ‘neutral’ controller to act as the original pose of the rig to easily go back to the base pose – synonymous to PS. The key is to keep everything in sync when deleting layers etc etc.
$.pos.controller = position_list()
$.pos.controller.available = position_xyz()
$.pos.controller.setName 1 “layer_1”
$.pos.controller.setActive 1 – makes it editable…
$.pos.controller.weight[1] = 100.0
etc,etc… (this is very basic) maybe ill have some time to build a really simple (but solid) script. Current really busy refactoring and building new pipeline stuff.
Eek, thank you very much for your insights! I’m glad I’m on the right track with this.
Thanks both for your answers.
Sincerely,
Johan
I think the hardest part is not so much doing the actual math and functions, its making it realy simple to the user – i.e making like an NLA animation system, draggable clips and so forth.
You are absolutely right! For now I’d be happy to store and apply poses, apply automated lipsync and support an easy setup of the rig. The rest is still too much for a small studio to invest in right now. And we are using CAT for our body rigs, so some of that is covered.
What I am trying to build right now is a flexible, customizable facial rigging system. That is easy to setup and animate an automate, and I have all the pieces in my head right now, and half of it is coded and for the rest I have most proof of concept done. In it’s first incarnation the animators controls will probably leave room for improvement as I like to have some feedback and improve on it again.
Thanks!
-Johan
What I would say about going into any big endevour like this, really spend a good chunk of time thinking and writing notes how the system would work, on a whole overview I.e
How to make poses?
How to wire them to an interface method?
How to save and load poses/interfaces?
How to export/bake into rig etc,etc
And crucial how to make it appear to work beautifully, as if ‘magic’ to the tech guy or animator making the poses/interface. Thats like 60% of the work
oh and p.s get your animators to give feedback as your building it!
Well to add and subtract layers I have all the control objects referenced into the control modifier and when you add a layer it works on all control objects at once. This is part of my RAIC system that I have built over the last couple of years.
As for facial I’m usually using a blended morph system and phonemes are built from multiple targets. I have not put layers on the facial animation in most cases but I can, not a bad idea to do automatically.