Bone Copy Rotation constraint and bone roll

Hi. I have a hard time understanding the Copy Rotation constraint.
I have an armature with two bones pointing upward:

Then in Edit mode I rotate the first (left) bone 90° around the global Y-axis:

On the image above I highlighted the value of the bone’s Roll which changed from 0° to 90° when I rotated the bone. So this is the first thing I don’t understand. Blender Docs say that bone roll is the rotation around the Y-axis of the bone. But I did not rotate the bone around its local Y axis, I rotated it around the global Y-axis which is not the same in this particular case. How come the Roll value changed? Is the bone’s Roll value calculated in some different coordinate system other than the bone’s local space? Or maybe bones in edit mode have some rotation mode other than Euler (not sure that this last question even correctly formulated :slightly_smiling_face:)?

Next, I’m adding Copy Rotation constraint to the first bone:

As you can see at this point the first bone starts to point upward again.
Here is my understanding of how this constraint works (or, to be more precise, how I expect it to work). It applies rotation to the first bone in the way that new rotation angle around the global Y-axis is the same as the second bone rotation angle around the global Y-axis. But this explanation is rather wrong or incomplete because when I change the Roll angle of the left bone to 0° the constraint stops to behave as it did and the left bone does not point upward anymore. Could somebody please explain me why?

Here you can play with the Roll value of the left bone to reproduce:
bone copy rotation.blend (101.5 KB)

Also any good in depth guides (videos, articles, posts) that will shed the light on how Copy Location constraint works would be much appreciated! I’ve seen some videos on the YouTube but in most of them authors whether don’t explain why they getting the specific result or seem to also lack understanding, cause they fiddle with constraint values to get the result they need.

The roll of a bone isn’t quite as clear as intuition suggests. There’s no “natural” way for the roll to behave when you rotate a bone. Consider rotating a bone 180 in X vs 180 in Y+Z. Same orientation, so is the roll 0 or 180?

All roll is, is some number to measure where the X+Z axes are pointing. It appears to be the Y of XYZ Eulers, and when you rotate a bone that’s currently rotated 90/0/0 (Y up instead of Z up) in its Z axis, you end up with a number in the Y. Because that’s how Eulers work.

You shouldn’t even pay attention to roll. It doesn’t exist anywhere except in Blender armature edit. Instead, pay attention to where your axes are pointing. You can control roll most easily with a “recalculate roll” operation.

This is what it’s doing:

  1. It’s reading the world space transformation matrices of both bones and decomposing those matrices into loc/rot/scale triplets. The rotation triplets are probably XYZ Eulers because you put Default in Order and bones are quaternions by default.

  2. It’s copying the Y rotation value from Bone.001 to the Y rotation value of Bone.

  3. It recomposes Bone’s matrix from its altered loc/rot/scale triplets.

No, this doesn’t do what people expect it to. Copy rotation works like you expect when you copy all axes. When you only copy some axes, it doesn’t end up doing what people expect.

If you’re ever curious about what these exact values are, you can make an empty, give it a copy transforms constraint, and apply visual transform. Then you can read the values in sidebar/item for the empty.

I recommend staying away from copy rotation unless using it at full influence, for all axes. (I also recommend staying away from limit rotation for similar reasons.) I use damped track and locked track constraints instead. If there’s a specific problem you’re trying to solve with Copy Rotation and it’s not working, I could probably tell you how to solve the problem with tracking constraints instead.

1 Like

Thank you a lot for your reply!

I would expect it to work exactly like any object (for example Suzanne’s head) in Euler rotation mode. If we rotate the object 180° on the local X axis — Y axis rotation (which IMO intuitively corresponds to Bone roll) will stay 0°. If we rotate the object 180° on local Y and Z axes — Y axis rotation will be 180°. Because in Euler rotation mode you can achieve the same orientation with more than one XYZ configuration.

Overall I find rotating the bone in Edit mode very confusing. Take a look at this example (specifically bone Roll value):

bone roll

When I rotate the bone around X axis, at the point where the rotation angle comes close to 90° bone roll value jumps from 0 to 180, but the bone’s local X and Z axes do not flip. Isn’t it strange? It kind of looks like a bug.
In Transformation options of bone in the sidebar there are no XYZ Rotation options, but instead Head and Tail location and Roll. I suppose maybe bones are not supposed to be rotated like I’m doing in Edit mode? What do you think?

To be honest I don’t understand this explanation. Maybe you could elaborate?


bone roll (2)

On record above I rotate the bone around its local Z axis and the Roll value is changing. Like if Roll represents rotation around Z, not Y axis.


Thank you. I want to create pretty simple tweezers rig:

Whenever Bone rotates around its local X axis Bone.001 should mirror its rotation. For some reason setup on screenshot above doesn’t work. That’s why I started trying to understand how Copy Rotation constraint work and what impact bone Roll has on it.
Here is the blend file:
tweezers rig.blend (100.8 KB)

I can solve my problem with this constraint setup:
image
I just change space from Pose to Local for both Target and Owner, also I change Axis. But I want to understand why it doesn’t work with original setup.

Still want to have fundamental understanding of Copy Rotation constraint and different Target and Owner spaces.

That is how it works.

Let’s look at Suzanne with her axes pointing in the same directions, and we’ll copy rotation to an empty, then apply visual transform, to get the post-matrix transform, like I talked about before:

Look at the Y values. Same thing as your bone roll for bones with the same axes. This is how Eulers work. Rotating in one axis changes the other axes. There are multiple Euler triplets that will get you the same orientation, but there is only one matrix per orientation, so your “real” Eulers are not always the Eulers you expect.

It doesn’t matter, since the Y and Z axes are fully defined by the head, tail, and roll. It’s just a different way of specifying orientations. I don’t know why Blender did it that way (and I don’t think it was the wisest) but it doesn’t matter. Like I said, I don’t think you should even pay attention to roll. Its precise value is a mathematical artifact. Instead, pay attention to what direction your axes are pointing. That’s what matters, not the roll value.

The world axes are Z up, Y forward. When you make an armature, creating the pose orientation, its axes are also Z up, Y forward. The default bone axis is Y up, Z backward. So when you’re starting with a default bone, you’re already starting with something with some rotation.

The copied bone of a simple tweezer rig will only ever rotate in one axis, so copy rotation XYZ invert X, or copy rotation X invert X, or a transformation constraint, local->local, will all work. You can do it with tracking constraints but it involves more bones and isn’t necessary. Here is the essence of what I’d make, just in case there’s any confusion:

1 Like

I was mistaken about it being like XYZ Eulers (although Eulers do what you’re showing roll doing, I think that’s important to realize.) After doing some further testing, I believe that the roll is the deviation from a damped track of the tail. See https://blender.stackexchange.com/questions/247413/how-does-blender-compute-local-rotation-axes-for-pose-bones/248830#248830 where I offer an answer and a file for testing the hypothesis yourself.

1 Like