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!