Rigging a cape on a character, without it rotating with the shoulders

Hi everyone, this is a longstanding problem I’m trying to solve.

The blender file:
test_rig_01.blend (2.0 MB)

The short story, in case you don’t want to read the whole thing:

I have a character rig based on rigify, with a cape and I’m trying to have the cape not follow the rotation of the torso, but rotate with a global controller that transforms the entire rig. I’ve tried many things and none of the results give me good results.
I’ve attached the file at the top of the post, in case someone wants to have a go.


The long story:

I have a rig for a character, based on rigify, and it has a cape, which will be keyframe animated, so cloth/soft body/jiggle bones are not options in this case.

The problem is that I don’t want the cape to follow the rotation of the torso and shoulders, because I find it easier to animate it in a believable way like this, but I want it to follow a bone I set up as a global controller.
This global controller is just like the root bone, but it stands between the actual root and every other bone.
The purpose of this global controller is to allow transforming the entire skeleton (like lifting off the ground, rotating in a pirouette, etc), but keeping the root bone at the world center, and also to avoid some double-transforms which I’ll describe below.

The closest I’ve come to achieving what I want is adding a child-of constraint to the bone at the top of each row of bones that controls the cape, with the target being a bone that’s in the same location (in edit mode) as the top bone.
The target (parent) bone is parented to the chest bone and has inherit rotation disabled, while the constrained bone is parented to the root (the actual root, not the global controller).
I do it this way because if I were to parent the cape bones to the global controller or to the bones connected to the torso, that would create some double transforms, from both the child-of constraint and the actual parent, and make the bones drift away when moving or rotating the global controller.

The reason I didn’t use a copy location constraint is because I want to be able to also move the top cape bones. If I added a copy location (with world space in both boxes) they would no longer be movable, unless I tick the offset option, but that would obviously pop the bone in a different location and I’d have to manually move it back in place (plus it wouldn’t be ideal when clearing location). And changing to local space would pretty much make the constraint useless.

I then added a copy rotation constraint and set the global controller as the target, and set the space to world space in both boxes, with the offset option ticked, of course.

This combination seems to work while rotating the global controller on the Z axis with the cape bones at their default rotation, but as soon as I rotate on another axis, the cape bones start rotating in an undesirable way. And if the cape bones also have some rotations of their own, then even when rotating the global controller on the z axis produces weird results.

I’ve tried different combinations of constraints and parenting to different bones, but this is the best I’ve come up with, and it’s still far from what I actually hope to achieve. Drivers are also not an option, because of the way they sometimes fail to update on the current frame and they would not allow me to further transform the bones, like the offset option in constraints.

So I’m turning to the community. Maybe someone has a better insight into this. I’m attaching the file with the rig in question, in case anybody wants to take a stab at it.

Any help is appreciated. Cheers!

How then, are you expecting the cape to follow? Superman has a cape rigged (pinned) onto the shoulders.
It sure looks like you need to share values between the scapulars R and L bones.

It does follow. That’s what the child-of constraints are for. I just don’t want it rotating, as I prefer to rotate it myself in a more controlled manner, as opposed to having it move together with the torso like it’s a sheet of metal.
Think about grabbing a large towel by the corners with your fingers and moving it quickly left and right a few inches - the bottom part is hardly going to move at all. That’s why I want it to rotate independently. It’s just a better starting point. Just imagine bending the character backwards - wouldn’t it be more intuitive to have the cape just hang downwards, instead of it rotating with the body?

Can’t say that I totally understand what you want, but I can help with this:

Then stick another layer of bones in there. Copy location bone, moveable child of copy loc bone, deforming child of child.

A dependency issue, that can be solved by separating the armature into two armatures. And again, you can further transform the bone by sandwiching another bone in there, same as with your copy loc.

Sounds like you just want the cape to follow the character around, but pose/animate the cape separately.

If so, Rigify or whatever rig, constraints, drivers, root controller, no matter.

Just parent the cape main bone to the neck bone, unconnected/offset. Uncheck deform, uncheck inherit rotation.

Thanks everyone for the suggestions! @bandages’ solution sounds about right, I’ll check that.

@GogoDisco, that would present the problem that it wouldn’t follow the global controller’s rotation, either. That’s pretty much what I am doing now, only with two dummy bones instead of the neck bone.

I think I’ll go with the method @bandages proposed. Thanks again!

Quick update. I got it working, for the most part. It’s not 100% the way I intended, but it’s certainly suited for the project I’m working on. I’ll describe it here, in case someone else ever comes up against such an issue.

@bandages’ suggestion helped, although I didn’t go with it, in the end, because the solution was simpler than expected. But playing around with a mock rig based on his idea did lead me to the right answer.

What I did was that I took the two dummy bones, the ones I used to link the cape bones to the torso, and gave them copy rotations constraints with the global controller as the target. They were already parented to the chest bone, with inherit rotation disabled. Then I removed the copy rotations constraints from the top cape bones and left only the child-of constraints. And, voila, everything works the way I want.

Almost. See, what I forgot to mention is that every bone down the chain along the length of the cape has a copy rotation with the parent bone as the target. This is to achieve a nice and quick bend of the whole chain while only rotating the top bone. But this also comes with problems of its own. Namely, if I rotate the global controller on any axis other than Z, the cape also bends. This can’t be avoided, given the nature of the constraint chain. But, luckily, I only need the global controller to rotate on the Z axis (plus translation, which doesn’t affect the cape’s rotation).

So not a perfect solution, but it does what I need. Thanks again for the help!