Cannot create rigify rig from vrm rig
I get an error when I use the Menu Search and click Generate Rigify armature for VRM model:
Same error from me. Using latest version of vrm-rigify with Blender 4.5.2. Using 3.13 of VRM import addon. Also tested with Avatar Toolkit importer, no luck.
Fix:
metarig_bone = getattr(metarig_human_bones, bone_type).node
vrm_bone = getattr(vrm_human_bones, bone_type).node
replace with:
metarig_bone_attr = getattr(metarig_human_bones, bone_type, None)
vrm_bone_attr = getattr(vrm_human_bones, bone_type, None)
if (
hasattr(metarig_bone_attr, "node") and
hasattr(vrm_bone_attr, "node")
):
metarig_bone = metarig_bone_attr.node
vrm_bone = vrm_bone_attr.node
if hasattr(vrm_bone, "bone_name") and vrm_bone.bone_name:
bone_mapping.append((metarig_bone.bone_name, vrm_bone.bone_name))
Tested Blender 4.5.2 latest version of plugin.
Fix:
metarig_bone = getattr(metarig_human_bones, bone_type).node vrm_bone = getattr(vrm_human_bones, bone_type).nodereplace with:
metarig_bone_attr = getattr(metarig_human_bones, bone_type, None) vrm_bone_attr = getattr(vrm_human_bones, bone_type, None) if ( hasattr(metarig_bone_attr, "node") and hasattr(vrm_bone_attr, "node") ): metarig_bone = metarig_bone_attr.node vrm_bone = vrm_bone_attr.node if hasattr(vrm_bone, "bone_name") and vrm_bone.bone_name: bone_mapping.append((metarig_bone.bone_name, vrm_bone.bone_name))Tested Blender 4.5.2 latest version of plugin.
This seems to aleviate the error that I was having, but now another one arises:
Python: Traceback (most recent call last):
File "/home/USER/.config/blender/4.5/scripts/addons/vrm_rigify/__init__.py", line 225, in rename_rig_bones_to_match_vrm_model_vertex_groups
rig_bone = armature_rig.edit_bones[f"DEF-{metarig_bone_name}"]
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyError: 'bpy_prop_collection[key]: key "DEF-spine" not found'
@rblz 正常動作しました。ありがとう。 It worked properly. Thank you.
@KingKrouch 少し注意点があるようですね。その次のif文も含めて置き換えましょう。 There seems to be a slight caveat. Let's try replacing it, including the next if statement.
# Compute a bone mapping between the metarig
# and VRM model based on VRM bone types.
bone_mapping = []
for bone_type in metarig_human_bones.keys():
if bone_type in ["last_bone_names", "initial_automatic_bone_assignment"]:
continue
# metarig_bone = getattr(metarig_human_bones, bone_type).node # ⭐️
# vrm_bone = getattr(vrm_human_bones, bone_type).node # ⭐️
# if vrm_bone.bone_name: # ⭐️
# bone_mapping.append((metarig_bone.bone_name, vrm_bone.bone_name)) # ⭐️
# =============== replace start👌
metarig_bone_attr = getattr(metarig_human_bones, bone_type, None)
vrm_bone_attr = getattr(vrm_human_bones, bone_type, None)
if (
hasattr(metarig_bone_attr, "node") and
hasattr(vrm_bone_attr, "node")
):
metarig_bone = metarig_bone_attr.node
vrm_bone = vrm_bone_attr.node
if hasattr(vrm_bone, "bone_name") and vrm_bone.bone_name:
bone_mapping.append((metarig_bone.bone_name, vrm_bone.bone_name))
# =============== replace end👌
return bone_mapping
@rblz 正常動作しました。ありがとう。 It worked properly. Thank you.
@KingKrouch 少し注意点があるようですね。その次のif文も含めて置き換えましょう。 There seems to be a slight caveat. Let's try replacing it, including the next if statement.
# Compute a bone mapping between the metarig # and VRM model based on VRM bone types. bone_mapping = [] for bone_type in metarig_human_bones.keys(): if bone_type in ["last_bone_names", "initial_automatic_bone_assignment"]: continue # metarig_bone = getattr(metarig_human_bones, bone_type).node # ⭐️ # vrm_bone = getattr(vrm_human_bones, bone_type).node # ⭐️ # if vrm_bone.bone_name: # ⭐️ # bone_mapping.append((metarig_bone.bone_name, vrm_bone.bone_name)) # ⭐️ # =============== replace start👌 metarig_bone_attr = getattr(metarig_human_bones, bone_type, None) vrm_bone_attr = getattr(vrm_human_bones, bone_type, None) if ( hasattr(metarig_bone_attr, "node") and hasattr(vrm_bone_attr, "node") ): metarig_bone = metarig_bone_attr.node vrm_bone = vrm_bone_attr.node if hasattr(vrm_bone, "bone_name") and vrm_bone.bone_name: bone_mapping.append((metarig_bone.bone_name, vrm_bone.bone_name)) # =============== replace end👌 return bone_mapping
This alongside rblz's tweaks to the code fixes the plugin for me. Now it works, I'd suggest finding a way of opening up a pull request if possible.