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$
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$
  • $\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 Nov 14 '15 at 23:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.