From b86be9b3f3dbe04ec4e3bcd56e8059176a86a839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=A8=81=E5=BB=89=E4=BC=AF=E7=88=B5?= <958261649@qq.com> Date: Thu, 20 Jan 2022 15:31:22 +0800 Subject: [PATCH] 0.46 --- MikuMikuRig/operators/rig.py | 776 ++--------------------------------- 1 file changed, 41 insertions(+), 735 deletions(-) diff --git a/MikuMikuRig/operators/rig.py b/MikuMikuRig/operators/rig.py index 356a036..7d94f1d 100644 --- a/MikuMikuRig/operators/rig.py +++ b/MikuMikuRig/operators/rig.py @@ -38,64 +38,9 @@ def load_pose(): bpy.ops.mmd_tools.import_vpd(filepath=vpd_file, files=[{"name":"MMR_Rig_pose.vpd", "name":"MMR_Rig_pose.vpd"}], directory=my_dir) bpy.ops.object.mode_set(mode = 'OBJECT') -def add_constraint2(constraint_List): - - index_list=[] - bpy.ops.object.mode_set(mode = 'POSE') - - for i,tuple in enumerate(constraint_List): - To=tuple[0] - From=tuple[1] - rotation=tuple[2] - location=tuple[3] - if From in mmd_bones_list and To in rig_bones_list: - if rotation: - index_list.append(i) - elif location: - COPY_LOCATION=mmd_arm.pose.bones[From].constraints.new(type='COPY_LOCATION') - COPY_LOCATION.target = rig - COPY_LOCATION.subtarget = To - COPY_LOCATION.name="rel_location" - mmd_arm.data.bones[From].hide=False - - bpy.ops.object.mode_set(mode = 'EDIT') - - for i in index_list: - From = constraint_List[i][1] - To = constraint_List[i][0] - parent_name=From + '_parent' - parent_bone=rig.data.edit_bones.new(name=parent_name) - parent_bone.head=mmd_arm2.data.edit_bones[From].head - parent_bone.tail=mmd_arm2.data.edit_bones[From].tail - parent_bone.roll=mmd_arm2.data.edit_bones[From].roll - parent_bone.parent=rig.data.edit_bones[To] - - bpy.ops.object.mode_set(mode = 'POSE') - - for i in index_list: - From = constraint_List[i][1] - To = constraint_List[i][0] - location=constraint_List[i][3] - con= mmd_arm.pose.bones[From].constraints - for c in con: - c.mute=True - parent_name=From + '_parent' - rig.data.bones[parent_name].hide=True - if location: - COPY_TRANSFORMS=con.new(type='COPY_TRANSFORMS') - COPY_TRANSFORMS.target = rig - COPY_TRANSFORMS.subtarget = parent_name - COPY_TRANSFORMS.name="rel_transforms" - COPY_TRANSFORMS.mix_mode = 'REPLACE' - COPY_TRANSFORMS.owner_space = 'WORLD' - COPY_TRANSFORMS.target_space = 'WORLD' - else: - COPY_TRANSFORMS=con.new(type='COPY_ROTATION') - COPY_TRANSFORMS.target = rig - COPY_TRANSFORMS.subtarget = parent_name - COPY_TRANSFORMS.name="rel_rotation" - def add_constraint3(constraint_List,preset_dict): + global match_bone_nunber + match_bone_nunber=0 index_list=[] bpy.ops.object.mode_set(mode = 'POSE') @@ -112,13 +57,8 @@ def add_constraint3(constraint_List,preset_dict): From=preset_dict[From] if From in mmd_bones_list and To in rig_bones_list: - if rotation: - index_list.append(i) - elif location: - COPY_LOCATION=mmd_arm.pose.bones[From].constraints.new(type='COPY_LOCATION') - COPY_LOCATION.target = rig - COPY_LOCATION.subtarget = To - COPY_LOCATION.name="rel_location" + match_bone_nunber+=1 + index_list.append(i) mmd_arm.data.bones[From].hide=False bpy.ops.object.mode_set(mode = 'EDIT') @@ -140,6 +80,7 @@ def add_constraint3(constraint_List,preset_dict): From = preset_dict[constraint_List[i][1]] From1=constraint_List[i][1] To = constraint_List[i][0] + rotation=constraint_List[i][2] location=constraint_List[i][3] con= mmd_arm.pose.bones[From].constraints for c in con: @@ -147,640 +88,27 @@ def add_constraint3(constraint_List,preset_dict): parent_name=From1 + '_parent' rig.data.bones[parent_name].hide=True if location: - COPY_TRANSFORMS=con.new(type='COPY_TRANSFORMS') - COPY_TRANSFORMS.target = rig - COPY_TRANSFORMS.subtarget = parent_name - COPY_TRANSFORMS.name="rel_transforms" - COPY_TRANSFORMS.mix_mode = 'REPLACE' - COPY_TRANSFORMS.owner_space = 'WORLD' - COPY_TRANSFORMS.target_space = 'WORLD' - else: - COPY_TRANSFORMS=con.new(type='COPY_ROTATION') - COPY_TRANSFORMS.target = rig - COPY_TRANSFORMS.subtarget = parent_name - COPY_TRANSFORMS.name="rel_rotation" - - -def RIG(context): - - #属性准备阶段 - global mmd_arm - global mmd_arm2 - global rig - global mmd_bones_list - global rig_bones_list - - mmd_arm=context.view_layer.objects.active - - scene=context.scene - mmr_property=scene.mmr_property - - my_dir = os.path.dirname(os.path.realpath(__file__)) - rigify_blend_file = os.path.join(my_dir, "MMR_Rig.blend") - - bpy.ops.object.mode_set(mode = 'OBJECT') - bpy.ops.object.select_all(action='DESELECT') - context.view_layer.objects.active=mmd_arm - mmd_arm.select_set(True) - - #检查骨架并翻译 - if check_arm()==False: - return{False} - bpy.ops.mmd_tools.translate_mmd_model(dictionary='INTERNAL', types={'BONE'}, modes={'MMD', 'BLENDER'}) - - #建立骨骼关系字典 - mmd_bones_dict_j={} - mmd_bones_dict_e={} - for bone in mmd_arm.pose.bones: - bone.bone.hide=True - if bone.mmd_bone.name_e not in mmd_bones_dict_e: - mmd_bones_dict_e[bone.mmd_bone.name_e]=bone.name - if bone.mmd_bone.name_j not in mmd_bones_dict_j: - mmd_bones_dict_j[bone.mmd_bone.name_j]=bone.name - - load_pose() - bpy.ops.object.select_all(action='DESELECT') - - #替换特殊名称骨骼 - mmd_bones_list=mmd_arm.data.bones.keys() - if "UpperBodyB" in mmd_bones_list: - mmd_arm.data.bones["UpperBodyB"].name="UpperBody2" - mmd_bones_list=mmd_arm.data.bones.keys() - - - #生成第二套骨骼 - mmd_arm2=mmd_arm.copy() - context.collection.objects.link(mmd_arm2) - mmd_arm2.data=mmd_arm.data.copy() - context.view_layer.objects.active=mmd_arm2 - bpy.ops.object.mode_set(mode = 'POSE') - bpy.ops.pose.armature_apply(selected=False) - bpy.ops.object.mode_set(mode = 'OBJECT') - - - #导入metarig骨骼 - #import metarig armature - rigify_arm_name="MMR_Rig_relative" - - with bpy.data.libraries.load(rigify_blend_file) as (data_from, data_to): - data_to.objects = [rigify_arm_name] - - rigify_arm=data_to.objects[0] - context.collection.objects.link(rigify_arm) - - bpy.context.view_layer.objects.active=rigify_arm - bpy.ops.object.mode_set(mode = 'EDIT') - bpy.ops.armature.select_all(action='DESELECT') - - #修正只有两节拇指骨骼的模型 - if "Thumb1_L" in mmd_bones_list: - if mmd_arm.data.bones["Thumb1_L"].parent.name !="Thumb0_L": - rigify_arm.data.edit_bones.remove(rigify_arm.data.edit_bones["Thumb2_L"]) - rigify_arm.data.edit_bones["Thumb1_L"].name='Thumb2_L' - rigify_arm.data.edit_bones["Thumb0_L"].name='Thumb1_L' - - if "Thumb1_R" in mmd_bones_list: - if mmd_arm.data.bones["Thumb1_R"].parent.name !="Thumb0_R": - rigify_arm.data.edit_bones.remove(rigify_arm.data.edit_bones["Thumb2_R"]) - rigify_arm.data.edit_bones["Thumb1_R"].name='Thumb2_R' - rigify_arm.data.edit_bones["Thumb0_R"].name='Thumb1_R' - - rigify_bones_list=rigify_arm.data.edit_bones.keys() - disconnect_bone_set=set(mmd_bones_list).intersection(rigify_bones_list) - exist_bones=list(disconnect_bone_set) - - #新骨骼匹配方法 - - roll_list=[] - vector_list=[] - length_list=[] - disconnect_bone_set=set(exist_bones) - - for name in exist_bones: - rigify_bone=rigify_arm.data.edit_bones[name] - offset=np.array(rigify_bone.tail)-np.array(rigify_bone.head) - vector_list.append(offset) - length_list.append(rigify_bone.length) - roll_list.append(rigify_bone.roll) - - for name in exist_bones: - rigify_bone=rigify_arm.data.edit_bones[name] - mmd_bone=mmd_arm2.pose.bones[name] - rigify_bone.head=mmd_bone.head - - if rigify_bone.parent!=None and rigify_bone.use_connect: - parent_name=rigify_bone.parent.name - disconnect_bone_set.discard(parent_name) - - for name in disconnect_bone_set: - rigify_bone=rigify_arm.data.edit_bones[name] - if rigify_bone.parent!=None and rigify_bone.parent.name in exist_bones: - parent_bone=rigify_bone.parent - parent_index=exist_bones.index(parent_bone.name) - index=exist_bones.index(rigify_bone.name) - offset=vector_list[index]/length_list[parent_index]*parent_bone.length - rigify_bone.tail=np.array(rigify_bone.head)+offset - - #修正部分骨骼 - - rigify_arm.data.edit_bones["UpperBody2"].tail=mmd_arm2.pose.bones["Neck"].head - rigify_arm.data.edit_bones["LowerBody"].head=mmd_arm2.pose.bones["LowerBody"].tail - rigify_arm.data.edit_bones["LowerBody"].tail=mmd_arm2.pose.bones["LowerBody"].head - if mmd_arm2.pose.bones["LowerBody"].head==mmd_arm2.pose.bones["UpperBody"].head: - rigify_arm.data.edit_bones["LowerBody"].tail[2]-=0.01 - #rigify_arm.data.edit_bones["Head"].tail=mmd_arm2.pose.bones["Head"].tail - rigify_arm.data.edit_bones["Neck_Middle"].head=(np.array(mmd_arm2.pose.bones["Neck"].head)+np.array(mmd_arm2.pose.bones["Head"].head))/2 - - #调整缺失UpperBody2情况 - no_UpperBody2=False - if 'UpperBody2' not in mmd_bones_list and 'UpperBody' in mmd_bones_list: - no_UpperBody2=True - rigify_arm.data.edit_bones['UpperBody2'].head=np.array(mmd_arm2.pose.bones["UpperBody"].head)+np.array([0.001,0.001,0.001]) - rigify_arm.data.edit_bones['UpperBody'].name='UpperBody3' - rigify_arm.data.edit_bones['UpperBody2'].name='UpperBody' - #rigify_arm.data.edit_bones['UpperBody2'].tail = np.array(rigify_arm.data.edit_bones['UpperBody2'].head)+np.array([0.001,0.001,0.001]) - - bpy.ops.object.mode_set(mode = 'POSE') - head_scale=mmd_arm2.pose.bones["Head"].length/rigify_arm.pose.bones["Head"].length - rigify_arm.pose.bones["Head"].scale=[head_scale,head_scale,head_scale] - bpy.ops.pose.armature_apply(selected=False) - bpy.ops.object.mode_set(mode = 'EDIT') - - #匹配眼睛骨骼 - invert_eyes=False - if 'Eye_L' in mmd_bones_list and 'Eye_R' in mmd_bones_list: - eye_L=rigify_arm.data.edit_bones['eye.L'] - mmd_eye_L=mmd_arm2.pose.bones['Eye_L'] - eye_L.head[2]=mmd_eye_L.head[2] - eye_L.head[0]=max(mmd_eye_L.head[0],mmd_eye_L.tail[0]) - eye_L.head[1]=min(mmd_eye_L.head[1],mmd_eye_L.tail[1]) - eye_L.tail=eye_L.head - eye_L.tail[1]-=0.1 - - eye_R=rigify_arm.data.edit_bones['eye.R'] - mmd_eye_R=mmd_arm2.pose.bones['Eye_R'] - eye_R.head[2]=mmd_eye_R.head[2] - eye_R.head[0]=min(mmd_eye_R.head[0],mmd_eye_R.tail[0]) - eye_R.head[1]=min(mmd_eye_R.head[1],mmd_eye_R.tail[1]) - eye_R.tail=eye_R.head - eye_R.tail[1]-=0.1 - - if eye_L.head[0]