backwards bending knees in some poses/animations with pole_vector = 0
A proper layout for different bones (muscle, helper, MCH, etc.) to Rigify layers is a mission feature for now.
update 0.6.0
add-on renamed
support for muscle rigs
bug fixes
update 0.5.3:
fixed: renaming vertex groups for legacy mode
Hi, i tried to transfer weights from mb to rigify but seems there are bones missing from vertex groups.Mb has fewer bones than rigify that deform. Am i doing something wrong?
Bw i tested on 2.8
Could it be you mean this: (see one of the previous posts): Weight paint for the neck bones “DEF-spine.004” and “DEF-spine.005” needs to be done manually! MB-Lab rig has one neck bone. The default Rigify rig has two neck bones.
Thanks! I am all new to Blender, but I finanlly found this - not by using “View3D”/tools - but using shortcut key N.
However I also added the Rigify, and that gives four buttons to press… the first ‘Add Meta rig’ reports “Missing”, when hovering over. The other two, i do not know what they actually do…
Well, I forgot to write the description. I just wrote bl_description = "MISSING" in the code and forgot about it. That was unintentional trolling. Sorry!
Thanks - just in case, can you tell me why i can not parent two objects. In 2.79 you can drop one object on the other… and it will be shown. In 2.8 you can either link or parent, but you can not see that it is done. Also when you export it… the two objects are separated - drives me nuts!
Found that in that view you can not see the parrenting - you need to go to the other view in the same panel, forgot what it is called… still a silly newbi…
I got the muscle rig working with rigify rig - kind of. There are some issues I could not solve. The knee IK targets are crossed. The feet are rolled in. This makes the feet go unter the ground.
This code is for testing only! Don’t damage your work!
Select the “MBlab_sk_” rig and run this to get the rigify rig:
This takes a long time.
import bpy
from mathutils import Vector
mblab_rig = None
rigify_rig = None
muscle_rig = None
muscle_parents = {}
subtargets = {}
bpy.ops.object.mode_set(mode='OBJECT')
# Duplicate MB-lab rig
bpy.ops.object.duplicate()
mblab_rig = bpy.context.active_object
# EDIT MODE
bpy.ops.object.mode_set(mode='EDIT')
# Fix disconnected toe
bpy.context.active_object.data.edit_bones['toes_R'].use_connect = True
# Disconnect upperarms
bpy.context.active_object.data.edit_bones['upperarm_L'].use_connect = False
bpy.context.active_object.data.edit_bones['upperarm_R'].use_connect = False
# re-parent thumbs
bpy.context.active_object.data.edit_bones['thumb01_L'].parent = bpy.context.active_object.data.edit_bones['index00_L']
bpy.context.active_object.data.edit_bones['thumb01_R'].parent = bpy.context.active_object.data.edit_bones['index00_R']
# Connect spine with neck
bpy.context.active_object.data.edit_bones['spine03'].tail = bpy.context.active_object.data.edit_bones[
'neck'].head.copy()
bpy.context.active_object.data.edit_bones['neck'].use_connect = True
# Create heels
for ext in ["_L", "_R"]:
bone_name = "heel" + ext
bone_heel = bpy.context.active_object.data.edit_bones.new(bone_name)
bone_heel.bbone_x = 0.01
bone_heel.bbone_z = 0.01
foot_bone = bpy.context.active_object.data.edit_bones["foot" + ext]
# heel x location relative to foot head
bone_heel.tail.x = 0.1 if ext == "_L" else -0.1
heel_head_x = (bone_heel.tail.x - foot_bone.head.x) / 2 + foot_bone.head.x
heel_tail_x = (foot_bone.head.x - bone_heel.tail.x) / 2 + foot_bone.head.x
bone_heel.head = Vector((heel_head_x, mblab_rig.location.y, mblab_rig.location.z))
bone_heel.tail = Vector((heel_tail_x, mblab_rig.location.y, mblab_rig.location.z))
# parent
bone_heel.use_connect = False
bone_heel.parent = foot_bone
# Rename muscle bones on layer 1
for name, bone in bpy.context.active_object.data.edit_bones.items():
if "rot_helper" in name:
bone.name = "MCH-" + name
bone.use_deform = False
if "muscle" in name:
if "_H" in name or "_T" in name:
bone.name = "MCH-" + name
bone.use_deform = False
else:
bone.name = "DEF-" + name
bpy.ops.object.mode_set(mode='POSE')
# Subtargets
for name, bone in bpy.context.active_object.pose.bones.items():
if "rot_helper" in name or "muscle" in name:
temp_constraints = {}
for c_name, constraint in bone.constraints.items():
sub_name = constraint.subtarget
if "MCH" not in constraint.subtarget:
sub_name = "DEF-" + sub_name
temp_constraints[c_name] = sub_name
subtargets[name] = temp_constraints
bpy.ops.object.mode_set(mode='EDIT')
# Save the parents
for name, bone in bpy.context.active_object.data.edit_bones.items():
if "rot_helper" in name or "muscle" in name:
if "MCH" not in bone.parent.name and "DEF" not in bone.parent.name:
parent_name = "DEF-" + bone.parent.name
else:
parent_name = bone.parent.name
muscle_parents[name] = parent_name
for name, bone in bpy.context.active_object.data.edit_bones.items():
if "rot_helper" in name or "muscle" in name:
bone.parent = None
bpy.ops.object.mode_set(mode='POSE')
# Unlock transforms
for name, bone in bpy.context.active_object.pose.bones.items():
bone.lock_location[0] = False
bone.lock_location[1] = False
bone.lock_location[2] = False
bone.lock_scale[0] = False
bone.lock_scale[1] = False
bone.lock_scale[2] = False
# set rigify types
bpy.context.object.pose.bones["pelvis"].rigify_type = "spines.super_spine"
bpy.context.object.pose.bones["pelvis"].rigify_parameters['neck_pos'] = 5
bpy.context.object.pose.bones["clavicle_L"].rigify_type = "basic.super_copy"
bpy.context.object.pose.bones["clavicle_R"].rigify_type = "basic.super_copy"
bpy.context.object.pose.bones["breast_L"].rigify_type = "basic.super_copy"
bpy.context.object.pose.bones["breast_R"].rigify_type = "basic.super_copy"
for ext in ["_L", "_R"]:
bone_name = 'thigh' + ext
bpy.context.object.pose.bones[bone_name].rigify_type = "limbs.super_limb"
bpy.context.object.pose.bones[bone_name].rigify_parameters.limb_type = 'leg'
bpy.context.object.pose.bones[bone_name].rigify_parameters.segments = 1
bpy.context.object.pose.bones[bone_name].rigify_parameters.rotation_axis = 'x'
bone_name = 'upperarm' + ext
bpy.context.object.pose.bones[bone_name].rigify_type = "limbs.super_limb"
bpy.context.object.pose.bones[bone_name].rigify_parameters.limb_type = 'arm'
bpy.context.object.pose.bones[bone_name].rigify_parameters.segments = 1
bpy.context.object.pose.bones["index00" + ext].rigify_type = "limbs.super_palm"
for name in ['thumb01', 'index01', 'middle01', 'ring01', 'pinky01']:
bone_name = name + ext
bpy.context.object.pose.bones[bone_name].rigify_type = "limbs.simple_tentacle"
bpy.context.object.data.bones["breast" + ext].hide = False
bpy.ops.object.mode_set(mode='OBJECT')
# Duplicate MB-lab rig
bpy.ops.object.duplicate()
muscle_rig = bpy.context.active_object
bpy.ops.object.select_all(action='DESELECT')
bpy.context.view_layer.objects.active = muscle_rig
# Delete bones on layer 1
bpy.ops.object.mode_set(mode='EDIT')
bpy.context.object.data.layers[0] = True
bpy.context.object.data.layers[1] = True
for name, bone in bpy.context.active_object.data.edit_bones.items():
if bone.layers[0]:
bone.select = True
else:
bone.select = False
bpy.ops.armature.delete()
# Move bones to layer 3
for name, bone in bpy.context.active_object.data.edit_bones.items():
bone.layers[2] = True
for name, bone in bpy.context.active_object.data.edit_bones.items():
bone.layers[1] = False
bpy.ops.object.mode_set(mode='OBJECT')
# generate rigify rig
bpy.ops.object.select_all(action='DESELECT')
bpy.context.view_layer.objects.active = mblab_rig
bpy.ops.pose.rigify_generate()
rigify_rig = bpy.context.active_object
# add copy rig to rigify rig
muscle_rig.select_set(True)
rigify_rig.select_set(True)
bpy.context.view_layer.objects.active = rigify_rig
bpy.ops.object.join()
bpy.ops.object.mode_set(mode='EDIT')
for bone_name, parent_name in muscle_parents.items():
# re-parent bones
bpy.context.active_object.data.edit_bones[bone_name].parent = bpy.context.active_object.data.edit_bones[parent_name]
# reconnect muscle bones
if "muscle" in bone_name:
if not ("_H" in bone_name or "_T" in bone_name):
bpy.context.active_object.data.edit_bones[bone_name].use_connect = True
bpy.ops.object.mode_set(mode='POSE')
# Subtargets
for bone_name, constraint in subtargets.items():
for c_name, sub_name in constraint.items():
bpy.context.object.pose.bones[bone_name].constraints[c_name].subtarget = sub_name
bpy.ops.object.mode_set(mode='OBJECT')
Select the mesh “MBlab_bd_” and run this for renaming the vertex groups:
import bpy
for name, v_group in bpy.context.active_object.vertex_groups.items():
new_name = "DEF-" + name
v_group.name = new_name
Hey @DanielEngler am i doing something wrong or the naming of vertex group in blender 2.8 for riggify is no more the same as what the addon changes to.
I’ll start to rewrite the add-on next week. There are too many issues. Starting with fact, that putting two add-ons in the same tab causes trouble. Other issue will be solved, too, like manual wight paint and renaming will be more simple.