4
$\begingroup$

I have a character wearing a belt that's giving some problems. Here is the setup:

  • Several Empties are the children of vertices on the character
  • Each Empty then has a bone attached to it via the Child Of bone constraint
  • The Child Of constraints needs Set Inverse pressed or it offsets away
  • The belt mesh is controlled by these bones

So as the character moves, the belt moves with it. This all works just fine in pose mode. However, if put the character's rig (which the belt bones are a part of) into Object mode and move it, then the belt mesh moves in the opposite direction. This is fixed if I hit Set Inverse on the Child Of constraints again.

Normally this isn't a problem because if I am moving the whole character, I am going to do it in pose mode via the root bone, or if I'm moving all the characters objects, I move an Empty that all of its objects, including the rig, are child of. This all works fine.

The problem arises when I Link the character into a new scene and proxy the rig. Normally what I do is make the Linked character group a Child Of the proxied rig Object so that I an conveniently move them around (if you make the proxied rig a child of the group object, it behaves strangely.) But when I do this, my belt starts flying away again.

I know this problem is something to do with the parent/child hierarchy and the rig's object origin moving away in relation to the Set Inverse, so I experimented with different ways to set these objects up. What I've found is that if I proxy the Character's empty that I mentioned above, and make it a child of the rig proxy, then I can move the rig and everything works. But the linked group object has to NOT be a child of either, otherwise the problem comes back.

I've also tried making the belt objects the child of the rig object in the character's file, and making them a child of an empty that is a child of the rig object, and making them the child of the body object, but none of that works.

If anyone can explain to me exactly what is going on, or let me know a better way to fix or do this, or another way to rig this belt that doens't need child of, that would be great.

$\endgroup$
  • $\begingroup$ Can you provide a sample file? (or @CosmicDevGuy) Thinking a handler or modal script could be written to set inverse on modifier while in object mode. (more a workaround than a solution) $\endgroup$ – batFINGER May 25 '18 at 11:26
  • $\begingroup$ @batFINGER the file in question is for a client, so I can't share it easily i'm afraid. $\endgroup$ – Drudge May 25 '18 at 16:22
  • $\begingroup$ Tried making an example and get a cyclic redundancyi the character mesh depends on armature via modifier, the empty(s) relies on mesh thru vertex parent, the armature depends on empty via child of constraint. If I make the belt rig separate and parent it to a bone on character rig all works as expected. $\endgroup$ – batFINGER May 25 '18 at 17:01
3
+50
$\begingroup$

I've always found that parenting gear such as clothes, etc. to an armature bone would be sufficient enough to handle animating the character, armour, belts, etc. and also moving the character around in Object Mode all the same.

After testing the "Child Of" constraint on a simple mesh with a single armature and a "belt" (reshaped Sphere) I noticed the problem you described - the object always moves against the direction of the bone/armature.

All in all, I think it may be worth considering the option of directly parenting (Ctrl + P shortcut) the belt and other objects to the bone that controls them (i.e. via "Set Parent To" -> "Bone" option) and then other necessary parents (e.g. bone(s) to empty parent through "Set Parent To" option) and see if this method doesn't work better for you.

$\endgroup$
  • $\begingroup$ If you dont mind me asking, how did u parent each bone to an empty ? because the only way i manged to do it is by parenting the whole armature to the empty. not individual bone $\endgroup$ – Abukaff May 28 at 10:06
  • $\begingroup$ @Abukaff I don't have access to blender right now but from memory you should: Make sure Armature is in "Pose Mode" > Select your "empty" object > With the Armature still in "Pose Mode", then select (click) on the respective bone you wish to parent to, then follow the above action (i.e. "Set Parent To" -> "Bone"). $\endgroup$ – CosmicDevGuy Jun 10 at 8:55
0
$\begingroup$

After much more experimentation, I found a proper solution:

The offset is being caused because as the rig object is moved, a transform is being created by the Child Of constraint. This is because relative position of the parent object is changing. I don't fully understand the details of what's happening, but the solution is to use Pose Space in your constraint, as this ignores the offset of the armature object.

The problem is that Child Of does not have the option for different spaces. It is always World Space. The solution is to attach the bones to the empties with Copy Location and Copy Rotation instead, which requires the bones to have their axis match the empty object's. Then use World Space to Pose Space, and the problem is solved.

$\endgroup$

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.