How to have a bone copy the location of another bone WITHOUT copying the parent's location?

I’m trying to create a system where Bone A’s location is controlled by Bone B. Bone B’s location is controlled by Bone C. HOWEVER, I don’t want Bone A to move when Bone C moves.
Also, 1) I need to be able to dial down the influence so that the bones only proportionally move, and 2) all bones need to be controlled by a master bone without any of the transformations doubling up.

My initial setup was where Bone A has a Copy Location Constraint targeting Bone B (Local Space for both Target and Owner), and Bone B has a Copy Location Constraint targeting Bone C. In other words:

  • Bone A - Copy Location of Bone B (local space)
  • Bone B - Copy Location of Bone C (local space)

However, the problem is that it creates a chain from Bone C > Bone B > Bone A. I didn’t think it would because the location values in the sidebar stay 0.
I wondered if it’s just a matter of changing the transformation space so I tried changing to all the different ones for both Owner and Target to no avail.

In another exploration, instead of the Copy Location Constraint on Bone B, I just parented it under Bone C. In other words:

  • Bone A - Copy Location of Bone B (local space)
  • Bone B - Child of Bone C

This works. However, I’m unable to dial down the influence of Bone C on Bone B, so this isn’t a solution.

What would be the best way to go about this? Attaching a Blender file of the above two setups in case it’s helpful.

BoneLocationSystemTest.blend (867.1 KB)

You want Bone A to move when Bone B moves, but not when Bone C moves? Make another bone, parented to Bone B, and give it that local->local copy location constraint instead of Bone B. Weight whatever you were going to weight to Bone B to that new bone instead.

Alternatively, create a driver from the location fields of Bone B for Bone A, a “single property” type driver rather than a “transform channel” type driver. Use a scripted expression to modulate the effect, or do it with the driver curve.

Or, one more alternative I guess, give Bone A two different copy location constraints, both local->local: copy location from Bone B, and copy location from Bone C, but enable “invert” on all axes, and enable “offset”.

1 Like

Thanks, @bandages!

Your first solution works! I was hoping to be able to solve it with just constraints instead of adding another bone, but still, it seems to be doing what I was hoping to do. :grinning:

I haven’t tried the second solution as I’m not entirely sure what the suggestion is, and I generally try to avoid drivers because they’re a bit cumbersome, haha.

The third solution is a smart effort (and the first one I tried because it attempts to resolve it with just constraints), but seems to be failing once I dial down the influence of the constraints. (Though if I’m missing something here, would love to know!)

It would need to be linked to the influence of the original copy location constraint that you were inverting. If B copies at 0.5 influence from C, then A need to invert that copy at 0.5 influence as well. This could be done manually, or they could be linked with drivers.

1 Like

Wow, I can’t believe I overlooked such a simple solution. Thanks so much, man!

If you’re up for it, I posted issues I have with Child Of Constraints that maybe your expertise can also help with: Child Of Constraint issues with parenting