# How do I rig a BB-8 robot?

I have made a BB-8 robot from the new Star Wars: The Force Awakens movie, now I want to rig it so the head will stay on top when I move the body.

Here is some reference footage of what it looks like moving.

How can I create the lag in the head moment seen when the robot starts or stops?

Further more, how can I make the body rotate when I simply move it?

• The body will be very similar to this: blender.stackexchange.com/a/21406/7777 and for the head there can be a softbody delay, but I would prefer full manual controls over the head and animating it by hand. That control always pays off in the end. – Jaroslav Jerryno Novotny Dec 20 '15 at 21:03
• I was looking for a way to have the robot roll without using a curve to define where it goes. – David Dec 29 '15 at 20:09
• I am afraid it is impossible to rig without the curve. If you want to control the ball rotation based on translation, it has to know where it was the frame before, because the rotation direction depends on this information. And such curve defines all the points of translation and where it was previous frame. If you want an interactive rig, you would have to script it (I would go with bpy.app.handlers). – Jaroslav Jerryno Novotny Dec 29 '15 at 20:17
• Maybe have a parallel translation controller that your rig follows, and create a node that feeds the x and z translation data direction into the rotation of the sphere. I guess you'd have to experiment with it a bit. Without a SOLID understanding of rigging this is my best answer, maybe someone can fill the rest in for me :) – Simon Dec 30 '15 at 23:51

The basic key to getting the head to react to the motion of the body is using the Slow Parent function. Similar results can be achieved with soft body or cloth sim, however, this method has the advantage of no simulation baking.

The slow parent function is then used the drive the rotation of the head around the center of the body, so that acceleration causes the head to "lag" behind the body.

### Setup

First we will set up the rotation of the ball based on location. Start with the ball, next, add an empty. This will be the control for your droid. I chose the type of circle, and rotated it by 90 degrees along the X axis, and set the display size to 1.1, to create something that looks like a belt:

Next, I named it Ctrl (name your emtpies now, or you will become hopelessly confused).

We want our ball to be at the location of our control object. We could parent it, but that might cause conflict over the rotation later. Instead we will use a copy location constraint, with the object set to Ctrl. leave all other settings as they stand.

In order to have the ball rotate correctly, we will need two drivers, linked to the X and Y location of the control object respectively.

To add a driver, select the ball, and go into the object properties. In the X and Y rotation boxes, enter a pound sign (#).

Next, enter the graph editor, it is time to setup some drivers! Switch to driver mode:

Starting with the X Euler Rotation, we need to add a variable, var. Use single property, and set the object to Ctrl (aren't you glad we named it :D). Into the data bath box, enter location[1]. This will get the Y location of our droid. Set the expression to -var.

Repeat for the Y Euler Rotation, except use location[0] in the data path. and var (not negative) for the expression this time.

Our rotation is now set up, but lets quickly look back to the expression we used, -var. This might not seem logical at first, since you'd think we'd need to multiply be π and some number of degrees etc; however, we aren't working with degrees we are working with radians. 1 Radian is equal to a turn such that the each point on the circumference of the is moved along by a distance equal to the radius of the circle in the direction of rotation. Basically, if our droid has a radius of 1, it will turn 180 degrees when we travel π radius. So, when our droid moves π units, it will rotate by 180 degrees, which is the correct rotation. Note the actual expression should be -var * 1 since it is location * radius in blender units. If your droid has a radius other then one, be sure the put the multiplication in there.

After writing this, I did a couple tests, and I am now convinced that the above method of driving rotation produces incorrect results. I am still searching for a definitive answer to this, at least the above method has the benefit of producing reasonably convincing results, so it is being left in.

Now, its on to the head. This is where the slow parent comes back in. For this portion, we will need three new empties all added at the origin. Name these "Drag", "Face", and "Point".

We'll deal with drag first. It needs to be parented to Ctrl, but with slow parent under relation extras checked. The offset will control the amount of forward motion the head has when the droid moves. I liked a value of 1.8, but set it to whatever looks right for you.

Drag now, as it name implies, drags behind the droid. We can use this to drive the position of the head.

Lets work on "face" next. This empty should face drag, hence the name. To do this, we need to use a track to constraint. Add a track to constraint and set the target to drag, that is all that needs to be done. leave the other settings at default. Finally, add a copy location constraint to face, set to Ctrl, like the one we used on the sphere earlier.

Finally it is time to work with "Point". Point works by pointing to the location of the center of the head. when the head is parented to point, it will move to this location on the outside of the sphere. The set up for point consists of two constraints and a driver.

The first constraint is yet another copy location set to Ctrl, like we had earlier. With "Face" and the droid body. The second constraint is a copy rotation constraint, which should have the target set to "Face: and only the X axis checked:

Finally, we need to set up a driver that uses "Drag" to animate the position of the head. In the X rotation property of "Point" add a driver by entering the pound sign (#), and proceed into the graph editor.

Add anther variable, but this time set it from Single Property to Distance and select the Ctrl and Drag objects. Finally, enter var into the expression.

Last but not least, parent BB8's Head to the "Point" object.

Lets watch our droid roll!

Note: The head may act strangely while you position the droid or jump to a different position in the timeline. However, when you play back a completed animation, it should act normally.

• you da man! that looks perfect! – Scalia Jan 9 '16 at 18:39
• Comment above describes everything pretty clear, but "face" empty need only one constraint - track to. Connection to control "Ctrl" object must be applied through parenting instead of "copy location" constraint, otherwise turn rate of the droid head will be super slow and unefficient (that's how it realized in attached file. have no idea why here is difference between description and realisation). I've spent like an hour to realize what caused that problem, so think it might help someone else. – strangest Feb 16 '17 at 3:31
• Holy cow it took me a while to get it but this is one heck of a useful tutorial! I am totally using this rigged little guy :) – lakerice Dec 7 '17 at 3:00
• @lakerice I'm glad a could help feel free to ping me in chat if you need more help. – GiantCowFilms Dec 7 '17 at 3:19
• @GiantCowFilms I've posted a new question related to your answer here, wondering if you might be able to help blender.stackexchange.com/questions/99657/… – lakerice Jan 29 '18 at 19:04

For the bottom ball maybe you could put a bone in it and rotate it to make it seem like it’s rolling. Or you could parent the head to the ball and rotate the ball normally. Rigging may not even be required.

• Hi and welcome to the site. If the future please try to put more detail into your answers so that they are helpful to all, not just "maybe try ..." – David Oct 27 '18 at 22:40
• I say “maybe try” because I’m not a veteran like you. I don’t KNOW that my suggestion will work. That is why I say “maybe try”. If I knew that it would work then I wouldn’t have said it. – MBSONIC Oct 28 '18 at 0:07
• I’m not here to argue, but why shouldn’t I try to help. At the time I didn’t notice that someone had already answered this question. For some reason I found this in the unanswered section. Secondly if this is their first project and they don’t understand parenting in blender then I’m not sure how the answer above will help that much. I’m also not sure how he could be frustrated since what I’m suggesting doesn’t take long to do at all. If he understands parenting which is what he would have to understand to follow the answer above anyway then I’m not sure what problem is with my answer. – MBSONIC Oct 29 '18 at 21:36
• I think it is good 😇 you suggested an alternative answer. I do not believe your answer should be helpful to all. It is your right to suggest an answer. Just know that [maybe] you will get negative votes from the [maybe my way is the only way] club. Whether your answer helped this particular person is only part of the potential benefit. If a user will ["rage"] 😡, that is not your problem. If you want your answer to be helpful to all, or give some momentary pleasure, include sugary snacks and the latest 📱. You do not need to follow the thought 🧠 picktaters. Please continue to answer. – atomicbezierslinger Nov 16 '18 at 5:36