22
$\begingroup$

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+?

$\endgroup$

4 Answers 4

21
$\begingroup$

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

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

Blender 2.79b

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. Your mesh has to be centred as well so that the cursor is placed at the base of it
  5. Press W and select Symmetrize (duplication is automatic)
  6. Your bones are now mirrored and the names automatically updated with extention .R (which stands for right).

You are done!

$\endgroup$
3
  • 6
    $\begingroup$ Or (in v2.79) you can use W > Symmetrize, that does all above at once. $\endgroup$
    – aeroson
    Oct 28, 2017 at 17:37
  • $\begingroup$ When I try the Symmetrize option, it seems to duplicate along with Y axis, and not the X axis. At first I thought this might be because my rig wasn't orientated correctly with the front of the character facing along the Y axis (as it was previously facing down the X axis), but even after rotating everything, it stil symmetrizes down the opposite dimension to the one I want. Any ideas? $\endgroup$
    – Fiddy Bux
    May 30, 2019 at 11:46
  • $\begingroup$ In Blender 2.8 you can also find this in Armature > Symmetrize $\endgroup$
    – Luca
    Mar 27, 2021 at 10:32
1
$\begingroup$

...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')
$\endgroup$
0
$\begingroup$

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 :)

$\endgroup$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .