I can't find the bone mirror option.

When I used Blender about two years ago the mirror option was tucked away in the rig/object panels, but now I see no obvious options.

How can I mirror bones in 2.7+?

up vote 16 down vote accepted

Enter edit mode then hit T to open the tools panel. under options, you will find a check box that says X-Axis Mirror. Check it.

enter image description here

This option will mirror actions performed on bones across the X axis. In order to set up a rig, simply give the bones a left or right side suffix (e.g. .R/.L, _R/_L or _right/_left…) and make sure the rest of the names match. Bones that are centered do not need a suffix, since they are not being mirrored.

Gif

  • 3
    Thats great. I never even noticed that little tab. He's just sort of hiding quietly isn't he! TY – 1Up Aug 17 '14 at 1:24
  • 3
    The tabs cause me no end of grief... They are supposed to fix usability issues... :( it never happened. – GiantCowFilms Aug 17 '14 at 1:28

Blender 2.77a

I've just discovered that if you mirror with the x-Axis option in the tool box, then you have to name each bone manually for both sides. If you are rigging a human, a humanoid character or an animal, the best way is NOT to check the x-Axis option but follow the steps below:

  1. Edit Mode, select all the bones to mirror on one side (arm, leg, hand fingers)
  2. Make sure each bone name to be mirrored ends with .L which means LEFT (e.g.: hand.L). This is vital!
  3. Make sure the cursor is centred (Shift + C).
  4. Change the pivot to 3d cursor.
  5. Press SHIFT D to duplicate the bones and left click once.
  6. Select Armature (on the left of Edit Mode), Mirror, X local.
  7. Your bones are now mirrored.
  8. Press W and select, flip names. The names of the bones you have just mirrored will have automatically replaced the extention .L (which stands for left) with .R (which stands for right).

You are done!

  • 5
    Or (in v2.79) you can use W > Symmetrize, that does all above at once. – aeroson Oct 28 '17 at 17:37

...you have to name each bone manually for both sides...

Yes, that can be a big bother,
if it turns out you imported a G2f character from DAZ,
via .fbx or Collada, and, in Blender,
you discover that the DAZ armature did not come over flawless.
In my case, I find that I need to adjust the finger bones, which,
after enough diligence, I can achieve on, say, the left hand;
but then, I want the computer to repeat all that fine-tuning
on the right hand, automatically.

If I try the standard Blender options, nothing happens, because
the DAZ armature for G2f (ditto V4) follows the convention that
the names of left and right bones use a prefix of l or r.

Correction: V4 followed that convention; the Genesis 1,2,3 figures
use a prefix of “Left ” and “Right ” as shown by DAZ Studio;
however, the transfer process, via Collada or via .fbx,
makes it so that, from the Blender side, what you see is prefix l or r,
and ditto for the associated vertex groups.

Of course, for the sake of symmetrizing,
you really don’t want to rename scores of bones,
and then be obliged to rename them again,
so that their names match the vertex groups!

Occasion to dust off some Python:

#
# Given: selected armature, with left/right bone names starting with l,r 
#       (as is the case of DAZ Victoria 4 and Genesis2) or L,R
#       (Blender assumes they end in .L,.R)
# 
# Does: symmetrizes armature, by copying coordinates of head,tail of each left EditBone 
#       to corresponding right EditBone, but with x-axis mirrored, and copies roll with opposite sign.
#
# Author, Tom Telos, presents this in June 2017 to the Public Domain, as experimental code, no warranties.
#
import bpy #, bmesh , math , mathutils

Arm = bpy.context.scene.objects.active 
if (Arm.type != 'ARMATURE') : raise RuntimeError("Please select your armature; quit().")
bpy.ops.object.mode_set(mode='EDIT') #'EDIT_ARMATURE' not available, implicit.
#print( "Armature name: " , Arm.name , '\n' )
lNames = [] 
rNames = []
for EdBone in Arm.data.edit_bones :
    NamePrx = EdBone.name[0]
    if (NamePrx == 'l' or NamePrx == 'L') : lNames.append(EdBone.name)
    if (NamePrx == 'r' or NamePrx == 'R') : rNames.append(EdBone.name)
#print( lNames , rNames , '\n' )
NamePairs = []
for iNamePair in range( len(lNames) ) :
    lName = lNames[ iNamePair ]
    rR    = 'r' if (lName[0] == 'l') else 'R'
    rName = rR + lName[1:]
    if rName in rNames : NamePairs.append([ lName , rName ])
#print( NamePairs , '\n' )
for NamePair in NamePairs :
    lName = NamePair[0]
    rName = NamePair[1]
    Arm.data.edit_bones[rName].head     =   Arm.data.edit_bones[lName].head
    Arm.data.edit_bones[rName].head[0] *= -1
    Arm.data.edit_bones[rName].tail     =   Arm.data.edit_bones[lName].tail
    Arm.data.edit_bones[rName].tail[0] *= -1

    Arm.data.edit_bones[rName].roll     = - Arm.data.edit_bones[lName].roll
# 
bpy.ops.object.mode_set(mode='OBJECT')

thank you so much for the script, it helped me a lot :) I made few adjustments to it: to be able to use any pre-defined part of the name to spacify the Left and Right part: in my example: I am using "LT" and "RT" (not my choice though)

here is the modified script:

#
# Given: selected armature, with left/right bone names starting with l,r 
#       (as is the case of DAZ Victoria 4 and Genesis2) or L,R
#       (Blender assumes they end in .L,.R)
# 
# Does: symmetrizes armature, by copying coordinates of head,tail of each left EditBone 
#       to corresponding right EditBone, but with x-axis mirrored, and copies roll with opposite sign.
#
# Author, Tom Telos, presents this in June 2017 to the Public Domain, as experimental code, no warranties.
#
# Updated by Fouad jeniani October 2018:
#           to: support any predefined Left Right text anywhere in the bone name
#               for now user has to enter manually the names in scripts
#
import bpy #, bmesh , math , mathutils

Arm = bpy.context.scene.objects.active 
if (Arm.type != 'ARMATURE') : raise RuntimeError("Please select your armature; quit().")
bpy.ops.object.mode_set(mode='EDIT') #'EDIT_ARMATURE' not available, implicit.
print( "Armature name: " , Arm.name , '\n' )
lNames = [] 
rNames = []
for EdBone in Arm.data.edit_bones :
    if EdBone.name.find("LT") != -1 : lNames.append(EdBone.name)
    if EdBone.name.find("RT") != -1 : rNames.append(EdBone.name)
print( lNames , rNames , '\n' )
NamePairs = []
for iNamePair in range( len(lNames) ) :
    lName = lNames[ iNamePair ]
    rR    = 'RT'
    rName = lName.replace("LT","RT")
    if rName in rNames : NamePairs.append([ lName , rName ])
print( NamePairs , '\n' )
for NamePair in NamePairs :
    lName = NamePair[0]
    rName = NamePair[1]
    Arm.data.edit_bones[rName].head     =   Arm.data.edit_bones[lName].head
    Arm.data.edit_bones[rName].head[0] *= -1
    Arm.data.edit_bones[rName].tail     =   Arm.data.edit_bones[lName].tail
    Arm.data.edit_bones[rName].tail[0] *= -1

    Arm.data.edit_bones[rName].roll     = - Arm.data.edit_bones[lName].roll
# 
bpy.ops.object.mode_set(mode='OBJECT')

I hope it would be of some help :)

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.