3
$\begingroup$

I am struggling to get the CopyRotation bone constraint to work as I expect. Hoping someone can clear up where my confusion is.

I have simplified my issue to this three bone setup: enter image description here

  • Bone C is the parent of bone A and bone B.
  • Bone A has a Copy Rotation constraint targeting bone B (Y only, LocalWithParent -> LocalWithParent):

(There are also some limit rotation constraints on bones A and C, but I have tested and the issue persists even if they are both removed.)

If I rotate bone B around the local Y, everything works as I expect it to. Bone A acquires the same local Y rotation as bone B, and they face the same direction.

However, if I rotate B freely, allowing local X and Z rotation to occur as well, I experience behavior that I do not expect. Bone A smoothly rotates around local Y as B is rotated (as expected) until hitting certain rotations, where it then seems to "snap" to a different rotation. Here is a video of the issue occurring: Rotating around local Y causes snapping when X and Z rotations are not 0.

I'm sure this is all a misunderstanding on my part. But I'd be really grateful if someone could help sort me out. In my mind: because I can see that the local Y rotation of bone B changes smoothly as I rotate it (I'm seeing this in the "Transform" view) the Y rotation of bone A should should also change smoothly.

Thanks so much!

The example blend (I don't enough reputation to post this as a real link, sorry): www.filedropper.com/bonerotationsnapexample

$\endgroup$

1 Answer 1

5
$\begingroup$

If you rotate your bone B around Y and observe its rotation values in XYZ euler, you'll notice all the values change when you expect only the Y axis to change:

enter image description here

This is because the bone was previously rotated from its rest position. The bone rotation is represented always from its rest pose - so what those numbers are is a combined(resulting) rotation of rotating it from the rest pose and then around the Y axis.

So the first problem is that your Y channel doesn't represent the change you rotated around local Y in viewport.

The other problem is that a bone can be rotated only +-180° (with constraints). If you expect to rotate more than this (let's say +190°), the bone rotates actually the opposite shorter way (-170°).

Both these things cause the A bone to rotate the wrong amount and to have a point where it suddenly flips.

The solution is to add bones D and E:

enter image description here

  • D has Dummy Track targeting tail of B.
  • E is parented to D and has Copy Rotations from B (world/world).

This way the E bone is only rotated of what the B bone is in Y axis (because the dummy track won't rotate the bone D in Y - it will only rotate in X and Z)

Finally bone A Copies Rotation from E, but Local/Local spaces.

Now if you rotate bone B to a position with only Z or X axes, the bone A will not move. And any Y rotation will be correctly projected onto A.

$\endgroup$
1
  • $\begingroup$ Wow. I've just tried this out and it works great! Not only that, but thanks to your clear explanation, I "get it". Thanks so much for clearing up my confusion. @Jerryno: you'da'best! $\endgroup$
    – Zach
    Commented Nov 14, 2015 at 23:33

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .