Creating Smooth Bone Animations in Blender Using Bezier Curves

Today we’re going to make this rigged arm follow a bezier curve. 

Sometimes we’ve spent hours and days polishing our animation arcs. Only to hear that the client/director wants something else.
Can’t we just animate bones on a bezier curve? It’s cleaner and faster. And non-destructive.

The answer is yes, we can. sometimes at least….

Watch this video or read the post if you prefer reading your tutorials. Maybe you just want a written recap, never the less I hope this is useful to you. 

Setting Up the Scene

I’ve used the 3d model of the main character to do a different animation in this shot I’m working on.

After all, I need a rigged arm, so why not use the one we already have?

I highly recommend working from the origin, this helps prevent potential errors and frustration when working with the curve modifier. A slight offset between the origin of the curve and the object following the curve could lead to weird deformation issues. 

We’ll fix the placement later on.

This arm is rigged with Rigify. It’s best to use the FK bone setup for now. This makes it easier to work with the bezier curves. 

The next thing we need is a plane that you can cut in as many segments as you have bones.

For the arm rig that is three bones, so that means three segments in the planes. 

This plane is going to be our “Curve Guide” so I like to rename that. 

Snap the right edge of the plane to the 3D cursor. I recommend you use “selection to cursor keep offset”  because otherwise, you will collapse the points, and be left with a triangle.

Then move to the other side in place. 

After this, it becomes a bit repetitive. But hey, we’ll do this for the middle one as well.    

Introduce a new loop cut and snap it to the cursor as well. I like to scale the Curve Guide so its width is neatly encompassing the arm.

Now we’re going to add a curve modifier. This will let your plane move smoothly along the bezier curve. Set the curve object to be your bezier curve and the plane will snap into place.

Normally, the more segments it has, the more fluid the curve modifier is going to look, of course. 

However this time our segments are going to be determined by the number of bones we have.

Tip, when working on your rig, disable the curve modifier in the viewport. We can toggle this whenever we want to check our progress or the effect of certain constraint settings. Then toggle it off when we want to adjust the rig again

Preparing the Bones 

We keep going, so let’s create new vertex groups for the curve guide. Three to be precise. 

I’m going to call them root elbow and wrist, to match the limb I’m animating.    

For these groups, We’re going to assign each corresponding edge on the plane going from right to left, and that will look something like this.  

You can visualize it in the weight-paint mode. 

Configuring the Constraint

We can now set up the constraints. 

Select your first bone and go to the constraints tab here. Choose copy location. Select your curve guide as the target and in the vertex group say root.

On top of that, add another constraint. This time choosing the copy rotation. So the target is the curve guide and the vertex group is the root. 

We just have to add a “stretch to” constraint and the vertex group is the elbow this time. So that is the next vertex group in the line. Now points in the right direction only it’s too big and looks like it is stretched out.

What you have to do is go to the original length and click on this cross right here, and that will reset the length.

Each section of the arm weight is painted to their corresponding bones. These in their turn are constraints to an edge of the “Curve Guide”. Once they’re all set up, the rig will follow the curve.

So what I’m going to do is select the next bone in line then, select the other bone we just did.    Search for copy constraints to selected bones.    

Now, everything is set up already, but we need to fix the vertex groups in the constraints.

First, We’re going to delete every vertex group from the constraint fields, just to be sure.

For the vertex group of the second copy location constraint we insert “elbow”, the name of your corresponding vertex group.

Then for the next constraint, the copy rotation, you should use the same vertex group. (or whatever your vertex group is called here)  And then, of course, don’t forget to reset your length for the stretch to constraint. The vertex group field here should always point to the next edge on the “Curve Guide”.

Now the wrist bone has nothing to point to, so what we could do is create another edge on the plane. Simply extrude the edge in edit mode and assign this a new vertex group.

You might need to remove some weights from the wrist vertex group as well. When you extrude an edge the weights painting of the original edge is copied over.    

Perfect! Now go back to the wrist bone constraints.

We need to stretch it and select the target that’s going to be our curve guide.    

And the vertex group is going to be the one that was just created.    Reset the length with that cross icon again, just to be sure.    

And there you go.

Does it follow the curve?    

Checkpoint! Before you start animating this is a good moment to sort out everything that might come back to bite us in the rear. For example, the orientation is a bit off.

To fix this we have some options. We can rotate the plane, preferably in edit mode, or we can go into the copy rotation constraints. 

Go to where it says mix and change the setting right there. 

We see by default it is set to ‘replace’ but we can go ahead and change that from ‘replace’ to ‘add’. And with this set to add, you can now add your rotation on top of the copy rotation constraint, if that makes sense. In my case, I only do this for the wrist bone, since I want to be able to add to that rotation if needed.

Instead, I rotate the plane in edit mode as we have seen before or alternatively twist the curve in edit mode. You can do this with CTRL + T.

This is a good moment to test out the whole thing.

When you’re ready, then we can enable the curve modifier for the plane, and we can see that the arm now follows the curve. 

For one, I can see my setup is not perfect. The hand is flipping upside down, but that’s also because we are moving over one axis. I think if we animate up or down over the curve it will sort itself out. Then in the worst-case scenario, you’ll have to keyframe some shape keys for the plane. Or of course, add additional keyframes to our rotation when the constraint is set to add instead of replace.

So when we’ve come this far it would be a shame to go into animation without testing if we actually can adjust the curve in a non-destructive manner. You can now adjust your curve and see if it breaks a simple animation over the x-axis.

I can move it along the x-axis and it swiftly moves along the curve. For me, it’s time now to adjust some weight painting because this comes from another mesh. I don’t have the shoulder bone to influence the upper arm, so I need to fix that and say that it’s part of the upper arm. Right. 

This might or may not be necessary for you, but it’s always good to check your weight painting.    

Placing the rigged object in the scene

Like I suggested we worked from the world origin, but 9 times out of 10 this ain’t where we want the animation to be in our scene right? So how do we get it where we want?

So for this example, I need to scale it up. It’s a bit unrealistic, I know, but that’s the aesthetic of the scene. 

Usually, for this, I use the origin set to the cursor and to move it around in the scene I usually parent in the plane to the curve. If you want to adjust the curve, you have to unparent the plane from the curve again.    

I like this to be a spiral around a doorbell and then just hit it and go back. So after some extruding rotating, and translating, you can see that I came up with this bezier curve path.

Now the next is not a necessary step, but I like to add a single bone so I can drive the plane by using this bone in the bone settings. We can create or choose a widget. Now, this helps me to declutter the viewport.

 Now I’ve got this nice spherical widget and then the only thing left for me to do here is parent the ‘’Curve Guide” to this bone and use automatic weights.    

From here on out, I can use this bone to animate my arm and that’s exactly what we can do now.

Smooth Bone Animations on curves

We’re going to start animating, right now.

And I’m going to set a first keyframe on the timeline, then move forward in the timeline and move my controller over the X-axis.

So the arm moves forward and now keyframe this again.

And that is our basic animation done.

To animate the fingers, I usually select everything and then go into the set rotation mode by pressing CTRL + R or going into the menus. For this animation, I’ll use X-Y-Z Euler instead of Quarternion. With all bones selected, I set my pivot point to individual origins. Then, by rotating the fingers on the x-axis locally, they will move individually and create a fist.

To start the animation, I set my first finger post touching the doorbell, keyframe the rotation, and then move a few frames back to set another keyframe in a rest pose. I repeat this process for the other fingers, keeping them a bit closer for a more esthetically pleasing look.

After creating the basic animation, I add an anticipation keyframe for the finger so that it moves slightly back before touching the doorbell. This creates a more snappy animation. From here on, it’s just a matter of playing with the timing, which means moving keyframes around and adjusting the rotation of the fingers to get better-looking poses.

Next, I set a keyframe for the location of the doorbell, apply the location, move a few frames forward, set another keyframe, and then mirror those doorbell poses to the other side. This creates an in-and-out motion, with a little bit of rest in between. I then adjust the stopping point of the finger on the doorbell to make sure the animation holds.

Once the basics are done, I adjust the root controller spacing, starting slowly and speeding up, then slowing down again in a more condensed way. I also have it snap back more by scaling the keyframe and adjusting the curve. To fix any offset, I use the doorbell’s keyframes to place them a bit forward on the timeline.

To animate the material emission of the doorbell, I have a mix RGB node set to blue and green, then I use the factor to switch between them. I keyframe the factor by hovering over it and pressing “I”. After duplicating the keyframe and setting it in the dope sheet editor, I create a new keyframe by hitting “I” in the curve editor.

Finally, I add a corrective smooth modifier above the subdivision modifier and play around with the factor, repeat, and scale settings for a cleaner result.

Additionally, you will discover that you can apply the same principle of making armature bones follow a curve using path constraint, but achieve different, equally impressive results.   By using various modifiers. I use the Curve Guide here not to follow a curve, but to shrinkwrap it onto a landscape. If you want to learn more about this particular instance, check out this short video.

And with that said, I hope you enjoyed this tutorial.  I hope you learned something if you did leave a like! 

As always, stay creative.  I’ll see you next time. Ciao.