I have a bone that acts as a container for two other bones along its primary axis for limb twisting. The top bone does an inverted twist rotation of 50% of its container/parent to make it work (the second bone just follows the parent/container normally). It works great, but there is a serious problem related to the way Blender flips its angles between -/+ 180. When the container bone is at +179.999, the child bone (at 50%) would be 89.9995, but then if I rotate slightly to +180.001 (-179.999), the child bone instantly changes to -89.9995.

For the parent, flipping +180 to -180 looks natural, but because of the math, the result on the child definitely does not. Is there any way to get this same behavior of having the child rotate to 50% of the parent without this popping effect?

If I were writing this in code, I would just make the child's updates additive instead of absolute. When the parent rotates, add 50% of the changes to the child, ignoring the parent's actual angle. Is something like this possible?

  • $\begingroup$ This isn't possible with constraints, but this is possible with drivers. Use "single property" type drivers and read the transform channel directly. Use a scripted expression to multiply this by 0.5. Doing this on anything rotating in multiple Euler channels is not recommended, because Eulers don't rotate straight (ie, half of your Euler channels is not in the same axis as your full Euler angles.) If you need arbitrary axes, consider axis-angle (copying XYZ axis, and halving W angle.) I would probably provide a full answer if there were more details provided. $\endgroup$
    – Nathan
    Feb 25 at 19:33


You must log in to answer this question.

Browse other questions tagged .