Symmetrize/Mirroring of Bones does not properly invert Bone Axises

Hi,

I am trying to get a blender armature exported via FBX, for usage in Unreal and other software such as Maya’s motion builder.

The issue I am having is that the symmetric/mirror tools of bones do not properly invert the bone axises, as is the norm in most other modeling software I have used.

Here is a diagram of what I would expect to happen when bones are mirrored:

This is causing me tons of grief when trying to use symmetry in other software, and I am wondering how others deal with this issue.

Thanks

Also, I should note that on the left side, the Y axis should be pointing up, and not down.

So for a bone that, on the armature’s right, you have set to point +X in global +X, +Y in global -Z, +Z in global +Y, you want a left-side bone that points in global +X, +Z, -Y? Select all left-side bones, make sure they’re disconnected, switch to individual orientations pivot, normal orientation, r Z 180 enter, r Y 180 enter.

You don’t specify the direction you want the bone’s +X axis pointing. If you want the left side +X pointing in global -X, but otherwise the same as specified above, well, you can’t do that. Because of the handedness of the coordinate system. (Can’t really do it anywhere else either, although the engines can lie to you about what direction is plus and minus.)

However, Blender’s tools are based around what you’re showing being the proper mirrors of those bones. If you change what a mirrored bone is, then paste mirrored, x-mirror editing/posing, and probably more, will all end up breaking in Blender.

Sorry, that image doesn’t show the entire picture. The coordinate system should remain the same, but if I remember correctly the secondary axis is rotated 180 degrees for the opposite side, like this:

However, Blender’s tools are based around what you’re showing being the proper mirrors of those bones. If you change what a mirrored bone is, then paste mirrored, x-mirror editing/posing, and probably more, will all end up breaking in Blender.

Yeah, this is the hardest issue. Maya and UE4 use the symmetry approach above, while blender forces both sides down the same primary and secondary axises for symmetry.

I wish there was a way to simply correct it at export.

Ideally, your export functions should correct at export, for exporting to wherever you need. Obviously, any kind of rotations can be scripted, and that script can be built into export. Posing can be reinterpreted about new axes. Export functions aren’t always what they could be though.

Probably, some things could be dealt with by using a layer of Blender-appropriate bones, controlling a layer of whatever-appropriate bones. But I don’t think I could say with certainty without more details.

(Pic’s not any use to me, because it can be interpreted multiple ways-- is blue pointing toward camera or away?)

Blue is pointing towards the camera on the left, and away from the camera on the right.

Although I really enjoy Blender, its approach to rigging that forces objects of the rig to all be bones with a length and a Y+ forward vector is very constraining for producing skeletons that will be used somewhere else.

I am definitely experiencing the problem described by @DeathDream when trying to mirror “bodies” in Unreal’s physics editor. The mirror tool in Unreal is expecting the forward vector to be inverted on the opposite limb, but in Blender, the forward vector of a bone is always Y+.

Here a couple of workaround I can think of to address this:

  1. Create a custom Python mirror script for Blender that will mirror bones in such a way that they are all pointing in the opposite direction and parented while keeping offset (disconnected). It will look atrocious in the viewport, but it should produce the correct FBX on export.
  2. Convert the exported FBX to ASCII (Blender cannot write ASCII FBXs) and change those bones orientation in Python by literally modifying the text. Might be tricky with weights and all the things I am not thinking about.
  3. Write custom mirroring tools for Unreal that will understand this Blender setup. Likely require branching engine code, but I have already done that for my project, so not really a problem in my case.

Ultimately those are not the real solution. I have described that in more detail on Right-Click Select which I think is the official feature request board for Blender.