← All ideas
  • Published 1 May 2019

Two improvements over actions and action constraints for facial rigging

Hello!
I'm currently working on a facial rig and I'm making extensive use of actions and action constraints Here's how the rig basically works:

  • I have a bunch of bones spread across the face
  • I move those bones to create poses (eyebrow up/down, lips up/down, you name it)
  • I'm making one action per pose
  • I'm driving each action with an action constraint.

Here's a video of it if this helps you visualize things better (you can see the bones and wireframe at about 1min)

Coming from Maya, I find this workflow very elegant and powerful but I feel limited in two ways:

  • I can't drive an action constraint with a driver, just some object's transform channels.
  • I have no way of knowing how active an action is. Being able to access the "current_frame" of an action would solve this because I could have a driver with this expression: action.current_frame / action.frame_range[1] giving me a value between 0 and 1 representing the action's current state.

With these two things, I'd be able to know the exact state of the facial rig and drive "corrective" actions when some conflicting actions are active at the same time.

100%

Development Status: Open

Upvote 17 Downvote 0
muream
1 May 2019

12 Comments

Lauloque

Lovely rig btw ♥

2
muream Author

* @-L0Lock- * Thank you! It's my first time rigging in blender (I have 2-3 years of rigging experience in Maya) and I'm really enjoying the ride so far!

Lauloque

* @muream * My only experience with rigging is some basic rigging knowledge, Rigify addon on Blender and Advanced Skeleton on Maya. I'm more on animation side. And I'd love to use a rig like this I think. Looks neat.

1
jason

Out of curiosity, why are you not using a pose library instead of action constraints?

Josephbburg

* @Jason van Gumster * I think the OP is using action constraints to make the controls move multiple bones at once, much like driving a shapekey with a control bone's location. Instead of creating a shapekey for a particular motion, create an action with some deform bones. Then you can stack a bunch on top of each other. This actually has a potential advantage, making it easier to animate the motion of the control (shapekeys just use linear interpolation, and it's a little tricky to drive multiple relative keys on one control).

Can you use pose library to do this? I've never had the time to play around with pose libraries myself.

muream Author

* @Josephbburg * That's exactly it. Actions also offer me the ability to have non linear movement between the rest pose and the pose that's at the end of an action, that's really useful to make subtle and more believable movements.

jason

* @muream * But this can be done with a pose library. It's literally using an Action as a placeholder for multiple bones/controls. You choose the pose you want from the library, optionally tweak to taste, and set your key. It's a way better workflow (IMHO) than chaining action constraints.

Josephbburg

* @Jason van Gumster * I think the difference is how they move over time. When you use a pose library, you're setting key poses, but you still have to animate the in-betweens (which is a good thing in the sense that you can't be lazy as an animator). When you use action constraints, you can animate the transition once, in the action, and you have it whenever you move the control. Then you can animate on top of it to improve it more. It's potentially easier for the animator, who probably doesn't know or care how the rig works.

I agree that action constraints can be a bad workflow; I rarely use them myself. I especially dislike corrective actions, because they are a patch over what is probably bad design in the first place. But the fact they record an action through time is a big strength. In Maya, you have Driven Keys, but Blender's implementation is actually much better. So Maya artists come to Blender, and think "this is the same." They're excited by the improvements but confused and maybe frustrated by the differences.

I like the ideas in this proposal because they make the constraint more robust, of course I also worry that it encourages bad habits. But in this case I think the benefit outweighs the cost. Especially since they involve drivers and Python, I think these features will mostly be for advanced users.

Josephbburg

Great idea and great rig. Why can't you drive an action constraint with a driver? Just set it's influence (or do you mean the timing of the constraint? That's a little more tricky, but certainly possible via tweaking the start, end range). Or perhaps you mean the controller that sets the timing of the constraint... I suppose the solution is to have your driver set the transform of the controller, which is linked to the constraint.... that's messy. Later, maybe I can find a workaround.

Also, just a plug for my website: if you're new to rigging in Blender, you should learn to use the Python API to speed it up. Here's an article I wrote about it: nodespaghetti.xyz/riggy-bits-1/ and be sure to check out the code examples on the next post. I these scripts to rig a spinal column, saved me a ton of time because I had 9 bones in seven chains (9*7 = 63 bones). I finally am out of school for the summer so I should have time to add more content soon.

muream Author

* @Josephbburg * Yeah, I meant driving the timing of the constraint. I've thought of the solutions you're proposing but they feel messy and hacky. Having a value from 0 to 1 on the action constraint that would "scrub" the action's "current frame" between the constraint's action range start and end would make things really clean IMO.

As for learning python, I'm already more than comfortable with that, thanks :)

Josephbburg

Aww, figured you'd try that. I agree, feels hackish but no one but the rigger has to see it. As long as things look and feel good for the animator, I'd say you've done your job.

muream Author

* @Josephbburg * Yeah, but that makes going back to working on the rig months later or sharing the rig to another rigger confusing which is not a good thing.

4