Shapekeys used to drive bones?

I have a question about using shapekeys. I have a character that I have been building in Blender 2.6x, and I put together some shape keys to make lipsync movements via an import of Papagayo files, which then is used for my lipsync. However, I also have bones connected to my character’s face rig, and I want them to do things such as moving my character’s jaw up and down when talking. Can I use shapekeys to drive the bone actions, or do I just have to do it manually by aligning the actions while observing the shapekey behavior? I’ve tried using drivers, and nothing seems to be working for that.

You have it backwards - the bones should affect the shapekey values. This is one of the cases where drivers are used - add a driver to the shapekey’s value slider and make it use the bone’s transform channel. The bone doesn’t need to deform the mesh - it is used as a controller for the shapekey right on the face, so make sure you have “deform” off for it.

But if you still wish to use papagayo, just do the reverse - have shapekey values drive the bones.

Moved from “General Forums > Blender and CG Discussions” to “Support > Animation and Rigging”

Right, I am aware that bones typically drive shape keys, but my big hangup has been that when I would try rigging the bones to reflect changes made by the shapekey values, that nothing would happen. Would this need to be resolved using python instead?

Have you tried using vertex parenting for the bones? The problem here, of course, is that unless you use a separate armature, you’re going to introduce a cyclic dependency.

I think you’re putting too much change in your shape keys; if part of the deformation being done in the shape could be done by a bone, it should be done by the bone, and not the shape. For instance, a bicep bulge shape should not move the arm into a flexed position, there should be a bone for that. The shape would just create the bulge once the flex is there.

For creating the shapes, I’d suggest moving the bones into a posed position, and then sculpting the shape on top of that pose. That way only the additional deformation on top of the bone deformation is recorded. The shape won’t look correct if you turn it on while the bone isn’t in position, but that’s why bones usually drive shapes; as the bone moves into position, it’s relevant for the shape key to be applied then.

No, all you need is the RNA path of the shapekey value.

  1. Add a driver to the bone’s rotation in Pose Mode (may want to use Euler mode here for simplicity)
  2. Open up a graph Editor in “Drivers” mode to check if the drivers are there and select your desired channel (X axis rotation for example).
  3. Select the object and then select the shapekey you want in the properties window. Rightclick the value slider and choose “Copy Data Path”.
  4. In the Graph Editor, go to the Nkey panel and change the “Var” variable from “Transform Channel” to “Single property”.
  5. Under the “Prop” dropdown select “Key” and then “Key” again in the box next to it.
  6. Paste the Data Path you copied earlier into the Path field, should be something like key_blocks[“Key 1”].value
  7. At the top of the driver settings where it says “Scripted expression”, put “var” instead of “0.000”. This will take the slider value and use it directly as rotation. If you need to change the range or use more than 1 variable, you can use a scripted expression like for example “-var” or “var*0.5”.

Have in mind that the changes won’t automatically update in the viewport when you move the shapekey slider. The slider needs to have keyframed animation for the thing to work. You can also “force” an update by pressing Enter on any input field in the driver panel (bug?).

Here is a .blend file of it in action - http://www.pasteall.org/blend/12142

To everyone:
Thank you all for your prompt and helpful responses. I have been agitating over this one for some time. I just tried Pesho’s solution a couple of minutes ago, and it has been solved! I got the ID data type changed from mesh data (my big mistake) to key, and then I did a test with a couple of keyframes, and that was what I needed.

Thank you! That was the solution I was looking for!