Face deform bones (aka PowerPose) symmetry

Issue #1813 invalid
Rakete created an issue

Trying to use blenders automatic pose mirroring with the imported daz rigs is difficult because of the bone names, but I have just hacked diffeo so that it can deal with names like Bone.l instead of lBone. Meaning I can just rename my bones to get automatic pose mirroring.

But I noticed that for the Face deform bones (like LipLowerOuter, LipLowerUpper, etc.) the symmetry does not work, they move in the wrong direction.

This can be fixed by using bpy.ops.armature.symmetry() on the armature, but I noticed all that does is set Bone.head and Bone.tail so that only one component of the head and tail vectors differs. Like it will set:

lBone.head = [-1, 3, 0] rBone.head = [1, 3, 0]
lBone.tail = [-1, 2, 0] rBone.tail = [1, 2, 0]

so that only X changes, and Y, Z are the same in both, and that makes it work.

But that means that the face deform bones import with slightly different Y, Z values on both sides? That's a little weird because I would assume they all should have the same values (for Y and Z) and only differ in X (positive for left, negative for right, or maybe the other way around, but like that).

Is that behaviour correct? Maybe it is worth considering setting those bone.head and tail values so that symmetry works by default.

Comments (10)

  1. Alessandro Padovani

    1.7.2.1889, blender 3.6.5

    The tool to add the LR blender notation is: advanced > rigging > prefix to suffix. Works fine here, I can pose the face bones with the blender mirror tool.

    You can also load poses to LR notation the pose will import fine. Not sure why Thomas doesn’t do that by default since it’s the standard in blender and the LR notation is needed for the blender animation tools to work fine, so it’s not optional. In my own rigs I always use LR and connected bones for auto-ik.

    Be aware that connected bones doesn’t work with “daz orientation“ if you want to then import poses, while it works fine with the standard orientation.

  2. Thomas Larsson repo owner

    I don’t think I understand what the request is. That the plugin should automatically convert bone names to suffix (LR) namesdirectly when the character is imported? That could be done, but conversion to mhx and rigify assumes prefix names, and even the simple rig misses some misspelt bones like lLipCorver. It is of course possible to modify mhx and rigify to accept suffix names as input, but I don’t see why add this extra complexity.

    It might be a good idea to move the Prefix to Suffix button to the main rigging panel, to make it more visible. Or to add it as an option to Add Simple IK; mhx and rigify always generate LR bones.

  3. Rakete reporter

    I was just wondering why out of the box I have to use the Armature->Symmetry to make it work here. When I just rename the bones the movement is not mirrored correctly. This only applies to the face bones, other bones work fine.

  4. Thomas2

    Sorry, but what is Armature > Symmetry? Do you mean X-Axis Mirror as in Alessandro’s picture?

    After I use the Prefix To Suffix tool X-axis mirror works fine for me, both for the face and the body. It also works fine with mhx and rigify, which always do generate LR bones.

  5. Alessandro Padovani

    Same here, the prefix to suffix tool works fine for me, including face bones. Adding LR to simple IK would be useful I guess, I don’t use the diffeomorphic rigs myself so don’t have any specific request, was just commenting to help Rakete.

  6. Rakete reporter

    Armature → Symmetry (or rather Symmetrize) is an option in the Armature menu when you are editing an armature. It symmetrizes the selected bones, it can also be called by using bpy.ops.armature.symmetrize()

    I have tried again and use_mirror_x actually works correctly for me as well, even without calling symmetrize(), so no idea what was going on there before but I assume something else I am doing causes this.

    I don’t use diffeomorphic like just any other addon, I’ve written my own addon around the diffeo that I use instead. My addon is kind of like a better Daz bridge, it consists of just a button to Import, then I can Setup the rig, and then Push and Pull poses and animation. I’ll show you guys soon. But I think I probably did something that caused this problem in my code somewhere.

    That said, even when I just import an armature and don’t use my addon, bpy.ops.armature.symmetrize() still changes the bones of the Daz armature for some reason, and my original question was basicly just asking about that. The reason I found it noteworthy to ask about it is that all bpy.ops.armature.symmetrize() does is change head and tail of the mirrored bone so that both bones are exactly equal in all components but one of them which is negated in one bone (so you get a perfect mirror bone). And I was wondering why that is even neccessary since I assume the bones should already be perfectly mirrored.

  7. Alessandro Padovani

    Be aware that the imported daz rig has metadata with it, that is necessary for the addon to work. Using the blender editing tools on the rig may not preserve the metadata, including symmetrize, you should check for that.

    As for “perfectly mirrored“, the addon gets the bones from daz studio so may be some custom figures have not perfectly mirrored bones to start with, I mean this could be the same in daz studio.

  8. Rakete reporter

    Yeah it must be that the bones are already different in Daz, but that is surprising if its actually that.

    I don’t think the tool actually changes bone properties, so all the metadata should be kept.

  9. Log in to comment