diff --git a/ffxiv_mmd_tools_helper/__init__.py b/ffxiv_mmd_tools_helper/__init__.py index 74c44c8..1388a2f 100644 --- a/ffxiv_mmd_tools_helper/__init__.py +++ b/ffxiv_mmd_tools_helper/__init__.py @@ -1,7 +1,7 @@ bl_info = { "name": "FFXIV MMD Tools Helper", "author": "wikid24", - "version": (0, 871), + "version": (0, 872), "blender": (2, 80, 0), "location": "View3D > Sidebar > FFXIV MMD Tools Helper", "description": "Fork of MMDToolsHelper for FFXIV Models & updated Blender to be compatible with 2.8+", @@ -49,6 +49,7 @@ def register_wrap(cls): importlib.reload(bone_tools) importlib.reload(bone_rigify) importlib.reload(bone_mektools) + importlib.reload(bone_retargeting_addon) importlib.reload(bones_renamer) importlib.reload(convert_to_blender_camera) importlib.reload(display_panel_groups) @@ -68,6 +69,7 @@ def register_wrap(cls): importlib.reload(shaders) importlib.reload(tex_converter) importlib.reload(panels) + importlib.reload(panels_retargeting_addon) else: import bpy @@ -88,6 +90,7 @@ def register_wrap(cls): from . import bone_rigify from . import bone_mektools from . import bones_renamer + from . import bone_retargeting_addon from . import convert_to_blender_camera from . import display_panel_groups from . import facepaint @@ -106,6 +109,7 @@ def register_wrap(cls): from . import shaders from . import tex_converter from . import panels + from . import panels_retargeting_addon if bpy.app.version < (2, 80, 0): bl_info['blender'] = (2, 70, 0) diff --git a/ffxiv_mmd_tools_helper/bone_mektools.py b/ffxiv_mmd_tools_helper/bone_mektools.py index 517b16c..866e3cc 100644 --- a/ffxiv_mmd_tools_helper/bone_mektools.py +++ b/ffxiv_mmd_tools_helper/bone_mektools.py @@ -7,6 +7,31 @@ print(f"The addon 'mek_tools' is not installed or is not enabled. Please install and enable it.") +def is_addon_installed(): + addon_name = 'mek_tools' + addon_required_version = (0,3,5) + addon_module = None + + try: + addon_module = [m for m in addon_utils.modules() if m.__name__ == addon_name][0] # get module + except: + return False + #raise Exception(f"The addon {addon_name} is not installed or is not enabled. Please install and enable it.") + + if addon_module: + installed_version = addon_module.bl_info.get('version',(-1,-1,-1)) + + # Check if the addon is enabled + if addon_name not in bpy.context.preferences.addons.keys(): + return False + #raise Exception(f"The addon '{addon_name}' is not installed or is not enabled. Please install and enable it.") + elif installed_version < addon_required_version: + return False + #raise Exception(f"Addon '{addon_name}' version is {installed_version} please install {addon_required_version} or higher.") + else: + return True + #print(f"The addon '{addon_name}' is installed and enabled.") + def auto_create_mektools_armature_from_race(target_armature): @@ -174,9 +199,6 @@ def apply_copy_location_for_mektools_armature_from_meshes(target_armature): - - - @register_wrap class ApplyMekToolsRig(bpy.types.Operator): """Adds a MekTools rig based on the current FFXIV Race""" @@ -200,25 +222,7 @@ def poll(cls, context): def execute(self, context): - addon_name = 'mek_tools' - addon_required_version = '0.35' - addon_module = None - try: - addon_module = [m for m in addon_utils.modules() if m.__name__ == addon_name][0] # get module - except: - raise Exception(f"The addon 'mek_tools' is not installed or is not enabled. Please install and enable it.") - - if addon_module: - installed_version = addon_module.bl_info.get('version',(-1,-1,-1)) - installed_version = float(str(installed_version[0])+'.'+str(installed_version[1])+str(installed_version[2])) - - # Check if the addon is enabled - if addon_name not in bpy.context.preferences.addons.keys(): - raise Exception(f"The addon '{addon_name}' is not installed or is not enabled. Please install and enable it.") - elif installed_version < float(addon_required_version): - raise Exception(f"Addon '{addon_name}' version is {installed_version} please install {addon_required_version} or higher.") - else: - #print(f"The addon '{addon_name}' is installed and enabled.") + if is_addon_installed(): active_armature = None diff --git a/ffxiv_mmd_tools_helper/bone_retargeting_addon.py b/ffxiv_mmd_tools_helper/bone_retargeting_addon.py new file mode 100644 index 0000000..84a698b --- /dev/null +++ b/ffxiv_mmd_tools_helper/bone_retargeting_addon.py @@ -0,0 +1,399 @@ +import bpy +import addon_utils +from . import register_wrap +from . import bone_tools + +""" +import sys +from pathlib import Path + +addon_name = "blender-animation-retargeting-stable" +# Get the addon's path +addon_path = Path(bpy.utils.user_resource('SCRIPTS')).joinpath('addons', addon_name) +# Add the addon's path to sys.path temporarily +sys.path.append(str(addon_path)) +# Now you can import modules from the addon +from mapping import * +# Remove the addon's path from sys.path to avoid conflicts +sys.path.remove(str(addon_path)) +""" + +####################### INFO ############################### + +#enter bone mapping mode +#bpy.ops.mappings.edit() + +#adds a row +#bpy.ops.mappings.list_action(action="ADD") +#removes a row +#bpy.ops.mappings.list_action(action="REMOVE") + +#source_armature +#bpy.context.object['retargeting_context']['source'] + +#target_armature +#bpy.context.object['retargeting_context']['target'] + + +#data_rows +#bpy.context.object['retargeting_context']['mappings'][0]['source'] +#bpy.context.object['retargeting_context']['mappings'][0]['target'] + +###################################################### + +def is_addon_installed(): + addon_name = 'blender-animation-retargeting-stable' + addon_required_version = (2,1,0) + addon_module = None + try: + addon_module = [m for m in addon_utils.modules() if m.__name__ == addon_name][0] # get module + except: + return False + #raise Exception(f"The addon {addon_name} is not installed or is not enabled. Please install and enable it.") + + if addon_module: + installed_version = addon_module.bl_info.get('version',(-1,-1,-1)) + + # Check if the addon is enabled + if addon_name not in bpy.context.preferences.addons.keys(): + return False + #raise Exception(f"The addon '{addon_name}' is not installed or is not enabled. Please install and enable it.") + elif installed_version < addon_required_version: + return False + #raise Exception(f"Addon '{addon_name}' version is {installed_version} please install {addon_required_version} or higher.") + else: + return True + #print(f"The addon '{addon_name}' is installed and enabled.") + +def is_source_and_target_mapped(armature): + source_arm = armature.get('retargeting_context').get('source') + target_arm = armature.get('retargeting_context').get('target') + if source_arm and target_arm: + return True + else: + return False + +def compare_str(string1,string2): + if string1 and string2: + cleaned_string1 = string1.strip().lower() + cleaned_string2 = string2.strip().lower() + + return cleaned_string1 == cleaned_string2 + else: + return False + +def add_bone_mapping(target_armature, source_bone,target_bone): + + + #print(f"source_armature:{source_bone.id_data.name}, source_bone:{source_bone.name}, target_armature:{target_armature.name}, target_bone:{target_bone.name}") + + if source_bone and target_bone: + + # THERE IS A DIFFERENCE BETWEEN active_object.retargeting_context and active_object.get('retargeting_context') + rtc = target_armature.get('retargeting_context') #THIS IS A PROPERTY GROUP FOR USING .get('source')/.get('target')/.get('mappings') TO GET DATA + art_mapping_controls = bpy.context.active_object.retargeting_context #THIS IS OPERATOR CONTROLS FOR WHAT IS SEEN ON THE VIEWPORT SOMETIMES IT IS WRONG + art_mapping_controls.ui_editing_mappings = True + + #get mapping list + read_only_mapping_data = rtc.get('mappings') #THIS RETURNS A VIEWABLE LIST but you can't edit it YOU NEED ART_MAPPING_CONTROLS FOR THIS + + if len(read_only_mapping_data) == 0: + #bpy.ops.mappings.list_action(action="ADD") + #needed because mappings won't exist until at least one thing is added + art_mapping_controls.mappings.add() + art_mapping_controls.active_mapping = 0 + + #THIS IS NOT ADDED IN ERROR, THIS IS BECAUSE THIS FUNCTION IS CURSED + read_only_mapping_data = rtc.get('mappings') + + if read_only_mapping_data: + + if len(read_only_mapping_data) == 1 and art_mapping_controls.mappings[0].get('source') is None and art_mapping_controls.mappings[0].get('target') is None: + art_mapping_controls.mappings[0]['source'] = source_bone.name + art_mapping_controls.mappings[0]['target'] = target_bone.name + + else: + mapping_found = False + art_mapping_controls.active_mapping = 0 + #loop through all the mappings and see if there is an existing mapping + for i,mapping in enumerate(read_only_mapping_data): + source_bone_mapping = mapping.get('source') + target_bone_mapping = mapping.get('target') + art_mapping_controls.active_mapping = i + + if compare_str(source_bone_mapping,source_bone.name) and compare_str(target_bone_mapping,target_bone.name): + mapping_found = True + + #check if source bone is mapped to a different target bone, and remove the source bone from mapping + elif compare_str(source_bone_mapping,source_bone.name) and not(compare_str(target_bone_mapping,target_bone.name)): + art_mapping_controls.mappings[i]['source'] = '' + + #check if target bone is mapped to a different source bone, and remove the target bone mapping + elif compare_str(target_bone_mapping,target_bone.name) and not(compare_str(source_bone_mapping,source_bone.name)): + art_mapping_controls.mappings[i]['target'] = '' + + if mapping_found == False: + mapping = art_mapping_controls.mappings.add() + mapping['source'] = source_bone.name + mapping['target'] = target_bone.name + art_mapping_controls.active_mapping = len(read_only_mapping_data) + + + # Garbage cleanup, iterating backward + for i,mapping in enumerate(read_only_mapping_data): + art_mapping_controls.active_mapping = i + + if (art_mapping_controls.mappings[i].get('source') is None or art_mapping_controls.mappings[i].get('source') =='') \ + or (art_mapping_controls.mappings[i].get('target') is None or art_mapping_controls.mappings[i].get('target') ==''): + art_mapping_controls.mappings.remove(i) + + #bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1) + + bpy.context.view_layer.update() + + return + +def remove_bone_mapping(source_bone_name,target_bone_name): + + rtc = bpy.context.object.get('retargeting_context') + mapping_list = rtc.get('mappings') + active_mapping = rtc.get('active_mapping') + for i,mapping in enumerate(mapping_list): + active_mapping = i + source_bone_mapping = mapping.get('source') + target_bone_mapping = mapping.get('target') + + if (source_bone_mapping == source_bone_name) and (target_bone_mapping == target_bone_name): + bpy.ops.mappings.list_action(action="REMOVE") + active_mapping = i-1 + + + #check if exists on the bone mapping + + + #remove + + + return + +def get_mapping_bone_group_list(bone_group): + + bone_group_dictionary = ['all_verbatim','body','breast','eye','eyelid','eyebrow','nose','mouth','ear','skirt'] + + if bone_group in bone_group_dictionary: + #get ALL bones names from ALL target_columns where animation_retargeting_group is not blank + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] + FFXIV_BONE_METADATA_DICTIONARY = bone_tools.get_csv_metadata_by_bone_type('animation_retargeting_group', target_columns) + + bone_list = [] + + if FFXIV_BONE_METADATA_DICTIONARY is not None: + + #run through the bone dictionary and only append bones that match bone_group + for metadata_bone in FFXIV_BONE_METADATA_DICTIONARY: + if metadata_bone[0] == bone_group: + bone_list.append(metadata_bone[1]) + #print(metadata_bone[1]) + + return bone_list + + return None + +def get_mapping_target_bones(bone_group,target_armature): + + #get ALL bones that match the bone group + all_bones_in_bone_group = get_mapping_bone_group_list(bone_group) + + #run through all the bones and append it to bone_list if it exists on the target armature + if all_bones_in_bone_group: + + bone_list = [] + + for bone_name in all_bones_in_bone_group: + target_bone = target_armature.pose.bones.get(bone_name) + + if target_bone: + bone_list.append(target_bone) + + if bone_list is not None: + return bone_list + + return None + + + +@register_wrap +class ART_AddBoneMapping(bpy.types.Operator): + """Adds a bone mapping""" + bl_idname = "ffxiv_mmd.art_add_bone_mapping" + bl_label = "Applies Bone Rotation to Target Bone Group" + bl_options = {'REGISTER', 'UNDO'} + + #reference data only + bone_group_list = ['all_verbatim','body','breast','eye','eyelid','eyebrow','nose','mouth','ear','skirt','clear_mapping'] + + bone_group = bpy.props.StringProperty(name="bone_group", update=None, get=None, set=None) + + def execute(self, context): + + if is_addon_installed(): + active_object = context.active_object + # THERE IS A DIFFERENCE BETWEEN active_object.retargeting_context and active_object.get('retargeting_context') + rtc = active_object.get('retargeting_context') + + source_arm = rtc.get('source') + target_arm = rtc.get('target') + + if is_source_and_target_mapped(active_object): + + if self.bone_group=='clear_mapping': + active_object.retargeting_context.reset() + + elif self.bone_group =='all_verbatim': + for target_bone in target_arm.pose.bones: + source_bone = None + + source_bone = source_arm.pose.bones.get(target_bone.name) + + if not(source_bone): + source_bone = bone_tools.get_equivalent_bone_from_armature(target_arm,target_bone,source_arm) + + if source_bone and target_bone: + add_bone_mapping(target_arm, source_bone,target_bone) + else: + + target_bone_list = get_mapping_target_bones(self.bone_group,target_arm) + + if target_bone_list: + + #loop through all the target bones and see if it exists on the source armature + for target_bone in target_bone_list: + source_bone = bone_tools.get_equivalent_bone_from_armature(target_arm,target_bone,source_arm) + if source_bone and target_bone: + add_bone_mapping(target_arm, source_bone,target_bone) + + + ##############ADD SPECIAL CODE FOR MMD KAITO MODEL BECAUSE IT USES DIFFERENT THUMB BONES + if self.bone_group in ('body','all_verbatim'): + has_all_kaito_bones = True + mmd_kaito_bones = ('親指0.L','親指1.L','親指0.R','親指1.R') + #mmd_e_bones = ('thumb1_L','thumb2_L','thumb1_R','thumb2_R') + + for bone_name in mmd_kaito_bones: + print(bone_name) + if bone_name not in source_arm.pose.bones: + print('its not in it') + has_all_kaito_bones = False + else: + print('its in it') + + print('has all kaito bones:', has_all_kaito_bones) + + if has_all_kaito_bones: + for kaito_bone_name in mmd_kaito_bones: + kaito_bone_mmd_e = bone_tools.get_mmd_english_equivalent_bone_name(kaito_bone_name,'mmd_kaito') + source_bone_name = bone_tools.get_armature_bone_name_by_mmd_english_bone_name(source_arm,kaito_bone_mmd_e) + source_bone = source_arm.pose.bones.get(source_bone_name) + + target_bone = bone_tools.get_equivalent_bone_from_armature(source_arm,source_bone,target_arm) + print(f'source bone {source_bone.name} target bone {target_bone.name}') + add_bone_mapping(target_arm,source_bone,target_bone) + + ####################################################################################### + + + + return {'FINISHED'} + + +def get_rotate_bone_group_list(bone_group): + + if bone_group == 'upperarm': + return ['arm_L','arm_R'] + if bone_group == 'forearm': + return ['elbow_L','elbow_R'] + if bone_group == 'wrist': + return ['wrist_L','wrist_R'] + if bone_group == 'hand': + return ['thumb1_L','thumb2_L','fore1_L','fore2_L','fore3_L','middle1_L','middle2_L','middle3_L','third1_L','third2_L','third3_L','little1_L','little2_L','little3_L', + 'thumb1_R','thumb2_R','fore1_R','fore2_R','fore3_R','middle1_R','middle2_R','middle3_R','third1_R','third2_R','third3_R','little1_R','little2_R','little3_R'] + if bone_group == 'upperleg': + return ['leg_L','leg_R'] + if bone_group == 'lowerleg': + return ['knee_L','knee_R','knee_2_L','knee_2_R'] + if bone_group == 'feet': + return ['ankle_L','ankle_R'] + if bone_group == 'toe': + return ['toe_L','toe_R'] + + + return False + + +@register_wrap +class ART_ApplyBoneRotationToTarget(bpy.types.Operator): + """Applies Bone Rotation to Target Bone Group""" + bl_idname = "ffxiv_mmd.art_apply_bone_rotation_to_target" + bl_label = "Applies Bone Rotation to Target Bone Group" + bl_options = {'REGISTER', 'UNDO'} + + #reference data only, this isn't used anywhere + bone_group_list = ['upperarm','forearm','wrist','hand','upperleg','lowerleg','feet','toe','clear_mapping_source','clear_mapping_target'] + + bone_group = bpy.props.StringProperty(name="bone_group", update=None, get=None, set=None) + + bpy.types.Scene.art_reset_rot_if_no_match = bpy.props.BoolProperty(name="art_reset_rot_if_no_match", default=False) + + def execute(self, context): + active_object = context.active_object + rtc = active_object.get('retargeting_context') + source_arm = rtc.get('source') + target_arm = rtc.get('target') + + print(source_arm) + print(target_arm) + + if self.bone_group == 'clear_mapping_source': + for pose_bone in source_arm.pose.bones: + bone_tools.clear_rotation(pose_bone) + bone_tools.clear_location(pose_bone) + + + elif self.bone_group == 'clear_mapping_target': + for pose_bone in target_arm.pose.bones: + bone_tools.clear_rotation(pose_bone) + bone_tools.clear_location(pose_bone) + + elif is_source_and_target_mapped(active_object): + + bone_list_mmd_english = get_rotate_bone_group_list(self.bone_group) + + if bone_list_mmd_english: + + for bone in bone_list_mmd_english: + source_bone_name = bone_tools.get_armature_bone_name_by_mmd_english_bone_name(source_arm,bone) + target_bone_name = bone_tools.get_armature_bone_name_by_mmd_english_bone_name(target_arm,bone) + source_bone = None + target_bone = None + + if target_bone_name: + target_bone = target_arm.pose.bones.get(target_bone_name) + if source_bone_name: + source_bone = source_arm.pose.bones.get(source_bone_name) + + if source_bone and target_bone: + bone_tools.rotate_target_pose_bone_to_source_bone(source_arm,target_arm,target_bone) + + elif target_bone and source_bone == None: + + if context.scene.reset_rot_if_no_match == True: + bone_tools.clear_rotation(target_bone) + + #special coding for knee_2_L and knee_2_R, if it's not found, then reset rotation + knee_2_bones = ('knee_2_L','knee_2_R') + for mmd_e_bone_name in knee_2_bones: + target_bone_name_mmd_e = bone_tools.get_mmd_english_equivalent_bone_name(target_bone_name) + if target_bone_name_mmd_e == mmd_e_bone_name: + bone_tools.clear_rotation(target_bone) + + return {'FINISHED'} \ No newline at end of file diff --git a/ffxiv_mmd_tools_helper/bone_tools.py b/ffxiv_mmd_tools_helper/bone_tools.py index 4a5a735..5896bc6 100644 --- a/ffxiv_mmd_tools_helper/bone_tools.py +++ b/ffxiv_mmd_tools_helper/bone_tools.py @@ -170,7 +170,7 @@ def get_csv_metadata_by_bone_type(metadata_column, bone_types): def hide_special_bones(armature): #Get bones from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] FFXIV_BONE_METADATA_DICTIONARY = get_csv_metadata_by_bone_type("hidden", target_columns) if FFXIV_BONE_METADATA_DICTIONARY is not None: @@ -215,7 +215,7 @@ def move_vg_to_pos(mesh, vg_name, target_pos): def set_mmd_bone_order(armature): #Get bones from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] FFXIV_BONE_METADATA_DICTIONARY = get_csv_metadata_by_bone_type("PMXE_bone_order", target_columns) if FFXIV_BONE_METADATA_DICTIONARY is not None: @@ -257,7 +257,7 @@ def set_mmd_bone_order(armature): move_vg_to_pos(bone_order_mesh_object, bone[0],i) #Get deformation tier from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] FFXIV_BONE_METADATA_DICTIONARY = get_csv_metadata_by_bone_type("PMXE_deform_tier", target_columns) if FFXIV_BONE_METADATA_DICTIONARY is not None: @@ -278,7 +278,7 @@ def set_mmd_bone_order(armature): def lock_position_rotation_bones(armature): #Get bones from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'],'mmd_kaito' FFXIV_BONE_METADATA_DICTIONARY = get_csv_metadata_by_bone_type("disable_rotate", target_columns) if FFXIV_BONE_METADATA_DICTIONARY is not None: @@ -297,7 +297,7 @@ def lock_position_rotation_bones(armature): #Get bones from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] FFXIV_BONE_METADATA_DICTIONARY = get_csv_metadata_by_bone_type("disable_move", target_columns) if FFXIV_BONE_METADATA_DICTIONARY is not None: @@ -317,7 +317,7 @@ def lock_position_rotation_bones(armature): def set_fixed_axis_local_axis_bones(armature): #Get bones from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] FFXIV_BONE_METADATA_DICTIONARY = get_csv_metadata_by_bone_type("fixed_axis", target_columns) if FFXIV_BONE_METADATA_DICTIONARY is not None: @@ -338,7 +338,7 @@ def set_fixed_axis_local_axis_bones(armature): #Get bones from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] FFXIV_BONE_METADATA_DICTIONARY = get_csv_metadata_by_bone_type("local_axis", target_columns) if FFXIV_BONE_METADATA_DICTIONARY is not None: @@ -359,7 +359,7 @@ def set_fixed_axis_local_axis_bones(armature): def auto_fix_mmd_bone_names(armature): #Get bones from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] FFXIV_BONE_METADATA_DICTIONARY_MMD_J = get_csv_metadata_by_bone_type("mmd_japanese", target_columns) FFXIV_BONE_METADATA_DICTIONARY_MMD_E = get_csv_metadata_by_bone_type("mmd_english", target_columns) @@ -393,7 +393,7 @@ def auto_fix_mmd_bone_names(armature): def get_armature_bone_name_by_mmd_english_bone_name(armature,mmd_e_bone_name): #Get bones from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] FFXIV_BONE_METADATA_DICTIONARY_MMD_E = get_csv_metadata_by_bone_type("mmd_english", target_columns) if FFXIV_BONE_METADATA_DICTIONARY_MMD_E is not None: @@ -423,11 +423,16 @@ def get_bone_name_by_mmd_english_bone_name(mmd_e_bone_name,bone_type): return metadata_bone[1] #doesn't check the armature, just returns equivalent mmd_english bone name -def get_mmd_english_equivalent_bone_name(bone_name): +def get_mmd_english_equivalent_bone_name(bone_name,bone_type = None): #Get bones from the metadata dictionary - target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv'] - FFXIV_BONE_METADATA_DICTIONARY_MMD_E = get_csv_metadata_by_bone_type("mmd_english", target_columns) + target_columns = ['mmd_english', 'mmd_japanese', 'mmd_japaneseLR', 'blender_rigify', 'ffxiv','mmd_kaito'] + + if bone_type and bone_type in target_columns: + bone_type = [bone_type] + FFXIV_BONE_METADATA_DICTIONARY_MMD_E = get_csv_metadata_by_bone_type("mmd_english", bone_type) + else: + FFXIV_BONE_METADATA_DICTIONARY_MMD_E = get_csv_metadata_by_bone_type("mmd_english", target_columns) if FFXIV_BONE_METADATA_DICTIONARY_MMD_E is not None: #run through the MMD English bone dictionary @@ -454,21 +459,160 @@ def is_bone_bone_type(armature,bone_name,bone_type): isbone_bonetype = True return isbone_bonetype +def clear_rotation(pose_bone): + + # Check if the provided pose bone is valid + if pose_bone is None: + return + + # Store the original rotation mode + original_rotation_mode = pose_bone.rotation_mode + + # Check if the rotation mode is not quaternion, then set it to quaternion + if original_rotation_mode != 'QUATERNION': + pose_bone.rotation_mode = 'QUATERNION' + + # Clear the rotation by setting it to the identity rotation + pose_bone.rotation_quaternion.identity() + + # Restore the original rotation mode + pose_bone.rotation_mode = original_rotation_mode + +def clear_location(pose_bone): + + # Check if the provided pose bone is valid + if pose_bone is None: + return + + # Clear the location by setting it to (0, 0, 0) + pose_bone.location = (0, 0, 0) + + +def clear_scale(pose_bone): + # Check if the provided pose bone is valid + if pose_bone is None: + return + + # Clear the scale by setting it to (1, 1, 1) + pose_bone.scale = (1, 1, 1) + + + +def clear_armature_bone_roll(armature): + # Store the current mode + current_mode = armature.mode + + # Check if the provided object is an armature + if armature.type == 'ARMATURE': + # Switch to Edit mode + bpy.context.view_layer.objects.active = armature + bpy.ops.object.mode_set(mode='EDIT') + + # Run the bpy.ops.armature.roll_clear() operator + bpy.ops.armature.roll_clear() + + # Switch back to the original mode + bpy.ops.object.mode_set(mode=current_mode) + else: + print("The provided object is not an armature.") + + + +def copy_roll(source_armature, source_bone_name, target_armature, target_bone_name): + # Store the current mode for both armatures + original_active_object = bpy.context.active_object + original_selected_objects = bpy.context.selected_objects + original_active_pose_bone = None + original_selected_pose_bones = None + source_bone_parent_name = None + original_mode = bpy.context.object.mode + if bpy.context.object.mode == 'POSE': + if bpy.context.active_pose_bone: + original_active_pose_bone = bpy.context.active_pose_bone + if bpy.context.selected_pose_bones: + original_selected_pose_bones = bpy.context.selected_pose_bones + + + + # Check if the provided objects are armatures + if source_armature.type == 'ARMATURE' and target_armature.type == 'ARMATURE': + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + + # Switch to edit mode for the source armature + bpy.context.view_layer.objects.active = source_armature + source_armature.select_set(True) + target_armature.select_set(True) + + bpy.ops.object.mode_set(mode='EDIT') + + # Get the source bone + source_bone = source_armature.data.edit_bones.get(source_bone_name) + source_bone_parent = source_armature.data.edit_bones.get(source_bone_name).parent + source_bone_parent_name = source_bone_parent.name + + if source_bone: + # Get the roll of the source bone + source_roll = source_bone.roll + source_parent_roll = source_bone_parent.roll + + target_bone = target_armature.data.edit_bones.get(target_bone_name) + target_bone_parent = target_bone.parent + if target_bone: + # Set the roll for the target bone + target_bone.roll = source_roll + #special code for leg_L/R, arm L/R to set the bone roll of it's parent first + special_bones_mmd_e = ('arm_L','arm_R','leg_L','leg_R') + for mmd_e_bone_name in special_bones_mmd_e: + target_bone_name_mmd_e = get_mmd_english_equivalent_bone_name(target_bone_name) + if target_bone_name_mmd_e == mmd_e_bone_name: + target_bone_parent.roll = source_parent_roll + #print(f"Roll copied from {source_bone_name} in {source_armature.name} to {target_bone_name} in {target_armature.name}") + else: + print(f"Target bone {target_bone_name} not found in {target_armature.name}") + else: + print(f"Source bone {source_bone_name} not found in {source_armature.name}") + + # Return to the original mode for both armatures + bpy.ops.object.mode_set(mode='OBJECT') + bpy.context.view_layer.objects.active = original_active_object + if original_selected_objects: + for obj in original_selected_objects: + obj.select_set(True) + bpy.ops.object.mode_set(mode=original_mode) + if original_mode == 'POSE' and original_active_pose_bone: + if original_selected_pose_bones: + for pose_bone in original_selected_pose_bones: + pose_bone.bone.select = True + + else: + print("Provided objects are not armatures.") + + + def apply_rotation_from_bone_to_posebone(source_armature_name, source_bone_name, target_armature_name, target_posebone_name, apply_and_delete_constraint = True): + + #print(f"source_arm_name: {source_armature_name},source_bone_name: {source_bone_name},target_armature_name: {target_armature_name},target_posebone_name: {target_posebone_name},apply_and_delete_constraint: {apply_and_delete_constraint}") + # Get the source armature and bone source_arm = bpy.data.objects.get(source_armature_name) source_bone = source_arm.data.bones.get(source_bone_name) + #print(f"source_arm: {source_arm},source_bone: {source_bone}") # Get the target armature and posebone target_arm = bpy.data.objects.get(target_armature_name) target_posebone = target_arm.pose.bones.get(target_posebone_name) + #print(f"target_arm: {target_arm},target_posebone: {target_posebone}") + if source_arm and source_bone and target_arm and target_posebone: + + # Check if the copy rotation constraint already exists copy_rotation_constraint = target_posebone.constraints.get('ffxiv_mmd_copy_bone_rotation') @@ -480,8 +624,14 @@ def apply_rotation_from_bone_to_posebone(source_armature_name, source_bone_name, copy_rotation_constraint.target = source_arm copy_rotation_constraint.subtarget = source_bone_name ## TESTING ## - copy_rotation_constraint.target_space = 'LOCAL_OWNER_ORIENT' - copy_rotation_constraint.owner_space = 'LOCAL' + #copy_rotation_constraint.target_space = 'LOCAL_OWNER_ORIENT' + #copy_rotation_constraint.owner_space = 'LOCAL' + #clear_armature_bone_roll(source_arm) + #clear_armature_bone_roll(target_arm) + + + copy_roll(source_arm,source_bone_name,target_arm,target_posebone_name) + if apply_and_delete_constraint == True: @@ -618,6 +768,7 @@ def get_equivalent_bone_from_armature(source_armature, source_bone, target_armat def rotate_target_pose_bone_to_source_bone(source_armature,target_armature,target_bone): source_bone = get_equivalent_bone_from_armature(target_armature,target_bone,source_armature) + #print(f'source_bone: {source_bone}') if source_bone: apply_rotation_from_bone_to_posebone(source_armature.name, source_bone.name, target_armature.name, target_bone.name) return @@ -627,7 +778,7 @@ def rotate_target_pose_bone_to_source_bone(source_armature,target_armature,targe # Custom function to be called upon update of the comparison_bone property def _comparescale_update(self, context): - if self.bone_compare_comparison_bone == '' or self.bone_compare_source_armature is None or self.bone_compare_target_armature is None: + if self.bone_compare_comparison_bone == '' or self.bone_compare_target_armature is None: self.bone_compare_scale_x = 0 self.bone_compare_scale_y = 0 self.bone_compare_scale_z = 0 diff --git a/ffxiv_mmd_tools_helper/data/bones_metadata_ffxiv_dictionary.csv b/ffxiv_mmd_tools_helper/data/bones_metadata_ffxiv_dictionary.csv index 3b0f5a9..0c7a2a4 100644 --- a/ffxiv_mmd_tools_helper/data/bones_metadata_ffxiv_dictionary.csv +++ b/ffxiv_mmd_tools_helper/data/bones_metadata_ffxiv_dictionary.csv @@ -1,217 +1,217 @@ -id,mmd_english,mmd_japanese,mmd_japaneseLR,blender_rigify,ffxiv,description,required,is_special,PMXE_bone_order,PMXE_deform_tier,tip_bone,fixed_axis,local_axis,controller,disable_rotate,disable_move,hidden,physics,blender_bone_group,mmd_bone_group_jap,mmd_bone_group_eng,cancel,cancel_parent,IK_target,IK_children,IK_child_limit_min,IK_child_limit_max,add_to_rig -1,view cnt, 操作中心, 操作中心,,,view cnt,y,y,0,,,,,,,,,,motherbone,センター,Center,,,,,,,Y -2,root, 全ての親, 全ての親,,,motherbone,y,y,1,,,,,,,,,,motherbone,Root,Root,,,,,,,Y -3,center, センター, センター,,,center,y,y,2,,y,,,,,,,,motherbone,センター,Center,,,,,,,Y -4,groove, グルーブ, グルーブ,,,groove,,y,3,,,,,,,,,,motherbone,センター,Center,,,,,,,Y -5,waist, 腰, 腰,spine,n_hara,waist,y,y,4,,,,,,,y,,,torso,センター,Center,,,,,,,Y -6,lower body, 下半身, 下半身,,j_kosi,lower body,y,,5,,,,,,,y,,,torso,体(下),Lower Body,,,,,,, -7,upper body, 上半身, 上半身,spine.001,j_sebo_a,upper body,y,,6,,,,,,,y,,,torso,体(上),Upper Body,,,,,,, -8,upper body 2, 上半身2, 上半身2,spine.002,j_sebo_b,upper body 2,y,,7,,,,,,,y,,,torso,体(上),Upper Body,,,,,,, -9,upper body 3, 上半身3, 上半身3,spine.003,j_sebo_c,upper body 3,,,8,,,,,,,y,,,torso,体(上),Upper Body,,,,,,, -10,waist_cancel_L, 腰キャンセル左, 腰キャンセル.L,,,waist cancel left,y,y,9,,y,,,,,y,y,,torso,体(上),Upper Body,y,6,,,,,Y -11,leg_L, 左足, 足.L,thigh.L,j_asi_a_l,leg_L,y,,10,,,,,,,y,,,legs,足,Legs,,,,,,, -12,knee_L, 左ひざ, ひざ.L,shin.L,j_asi_b_l,knee_L_a,y,,11,,,,,,,y,,,legs,足,Legs,,,,,,, -13,knee_2_L, 左ひざ2, ひざ2.L,,j_asi_c_l,knee_L_b,,,12,,,,,,,y,,,legs,足,Legs,,,,,,, -14,ankle_L, 左足首, 足首.L,foot.L,j_asi_d_l,ankle_L,y,,13,,,,,,,y,,,legs,足,Legs,,,,,,, -15,toe_L, 左つま先, つま先.L,toe.L,j_asi_e_l,toe_L,y,,14,,,,,,,y,,,legs,足,Legs,,,,,,, -16,leg IK_root_L,左足IK親,足IK親.L,,,leg IK_root_L,,y,15,,,,,,,,,,IK,IK,IK,,,,,,, -17,leg IK_L, 左足IK, 足IK.L,,leg IK_L,leg IK_L,y,y,16,1,,,,,,,,,IK,IK,IK,,,10,9\8,-180,-0.5, -18,toe IK_L, 左つま先IK, つま先IK.L,,toe IK_L,toe IK_L,y,y,17,1,,,,,,,,,IK,IK,IK,,,11,10,,, -19,waist_cancel_R, 腰キャンセル右, 腰キャンセル.R,,,waist cancel right,y,y,18,,y,,,,,y,y,,torso,体(上),Upper Body,y,6,,,,,Y -20,leg_R, 右足, 足.R,thigh.R,j_asi_a_r,leg_R,y,,19,,,,,,,y,,,legs,足,Legs,,,,,,, -21,knee_R, 右ひざ, ひざ.R,shin.R,j_asi_b_r,knee_R_a,y,,20,,,,,,,y,,,legs,足,Legs,,,,,,, -22,knee_2_R, 右ひざ2, ひざ2.R,,j_asi_c_r,knee_R_b,,,21,,,,,,,y,,,legs,足,Legs,,,,,,, -23,ankle_R, 右足首, 足首.R,foot.R,j_asi_d_r,ankle_R,y,,22,,,,,,,y,,,legs,足,Legs,,,,,,, -24,toe_R, 右つま先, つま先.R,toe.R,j_asi_e_r,toe_R,y,,23,,,,,,,y,,,legs,足,Legs,,,,,,, -25,leg IK_root_R,右足IK親,足IK親.R,,,leg IK_root_R,,y,24,,,,,,,,,,IK,IK,IK,,,,,,, -26,leg IK_R, 右足IK, 足IK.R,,leg IK_R,leg IK_R,y,y,25,1,,,,,,,,,IK,IK,IK,,,17,16\15,-180,-0.5,Y -27,toe IK_R, 右つま先IK, つま先IK.R,,toe IK_R,toe IK_R,y,y,26,1,,,,,,,,,IK,IK,IK,,,18,,,,Y -28,bust_L, 左胸, 胸.L,breast.L,j_mune_l,bust_L,,,27,,,,,,,y,,,torso,体(上),Upper Body,,,,,,, -29,bust_2_L, 左胸2, 胸2.L,,,bust_L_2,,y,28,,,,,,y,y,,,torso,体(上),Upper Body,,,,,,, -30,bust_R, 右胸, 胸.R,breast.R,j_mune_r,bust_R,,,29,,,,,,,y,,,torso,体(上),Upper Body,,,,,,, -31,bust_2_R, 右胸2, 胸2.R,,,bust_R_2,,y,30,,,,,,y,y,,,torso,体(上),Upper Body,,,,,,, -32,neck, 首, 首,spine.004,j_kubi,neck,y,,31,,,,,,,y,,,head,体(上),Upper Body,,,,,,, -33,head, 頭, 頭,spine.005,j_kao,head,y,,32,,,,,,,y,,,head,体(上),Upper Body,,,,,,, -34,shoulder_P_L, 左肩P,肩P.L,,,raise shoulder_L,,y,33,,y,,,,,y,,,arms,腕,Arms,,,,,,, -35,shoulder_L, 左肩, 肩.L,shoulder.L,j_sako_l,shoulder_L,y,,34,,,,y,,,y,,,arms,腕,Arms,,,,,,, -36,shoulder_C_L,左肩C,肩C.L,,,shoulder_hidden_L,,y,35,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -37,arm_L, 左腕, 腕.L,upper_arm.L,j_ude_a_l,arm_L,y,,36,,,,y,,,y,,,arms,腕,Arms,,,,,,, -38,arm_twist_L, 左腕捩, 腕捩.L,,n_hkata_l,shouldertwist_L,,y,37,,y,y,,,,y,,,arms,腕,Arms,y,34,,,,, -39,arm_twist_1_L, 左腕捩1, 腕捩1.L,,,left arm twist 1,,y,38,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -40,arm_twist_2_L, 左腕捩2, 腕捩2.L,,,left arm twist 2,,y,39,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -41,arm_twist_3_L, 左腕捩3, 腕捩3.L,,,left arm twist 3,,y,40,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -42,elbow_L, 左ひじ, ひじ.L,forearm.L,j_ude_b_l,elbow_L,y,,41,,,,y,,,y,,,arms,腕,Arms,,,,,,, -43,clothes_elbow_L,,,,n_hhiji_l,clothes_elbow_L,,y,42,,,,y,,,y,y,y,armor,その他,Other,,,,,,, -44,wrist_twist_L, 左手捩, 手捩.L,,n_hte_l,wrist twist_L,,,43,,y,y,,,,y,,,arms,腕,Arms,,,,,,, -45,wrist_twist_1_L, 左手捩1, 手捩1.L,,,left hand screw 1,,y,44,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -46,wrist_twist_2_L, 左手捩2, 手捩2.L,,,left hand screw 2,,y,45,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -47,wrist_twist_3_L, 左手捩3, 手捩3.L,,,left hand screw 3,,y,46,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -48,wrist_L, 左手首, 手首.L,hand.L,j_te_l,wrist_L,y,,47,,,,y,,,y,,,arms,腕,Arms,,,,,,, -49,dummy_L, 左ダミー, ダミー.L,,n_buki_l,dummy_L,,,48,,,,,,,,y,,armor,その他,Other,,,,,,, -50,thumb1_L, 左親指1, 親指1.L,thumb.02.L,j_oya_a_l,finger_thumb_l_a,,,49,,,,y,,,y,,,fingers,指,Fingers,,,,,,, -51,thumb2_L, 左親指2, 親指2.L,thumb.03.L,j_oya_b_l,finger_thumb_l_b,,,50,,,,y,,,y,,,fingers,指,Fingers,,,,,,, -52,fore1_L, 左人指1, 人指1.L,f_index.01.L,j_hito_a_l,finger_fore_l_a,,,51,,,,,,,y,,,fingers,指,Fingers,,,,,,, -53,fore2_L, 左人指2, 人指2.L,f_index.02.L,j_hito_b_l,finger_fore_l_b,,,52,,,,,,,y,,,fingers,指,Fingers,,,,,,, -54,fore3_L, 左人指3, 人指3.L,f_index.03.L,,finger_fore_l_c,,,53,,,,,,,y,,,fingers,指,Fingers,,,,,,, -55,middle1_L, 左中指1, 中指1.L,f_middle.01.L,j_naka_a_l,finger_middle_l_a,,,54,,,,,,,y,,,fingers,指,Fingers,,,,,,, -56,middle2_L, 左中指2, 中指2.L,f_middle.02.L,j_naka_b_l,finger_middle_l_b,,,55,,,,,,,y,,,fingers,指,Fingers,,,,,,, -57,middle3_L, 左中指3, 中指3.L,f_middle.03.L,,finger_middle_l_c,,,56,,,,,,,y,,,fingers,指,Fingers,,,,,,, -58,third1_L, 左薬指1, 薬指1.L,f_ring.01.L,j_kusu_a_l,finger_ring_l_a,,,57,,,,,,,y,,,fingers,指,Fingers,,,,,,, -59,third2_L, 左薬指2, 薬指2.L,f_ring.02.L,j_kusu_b_l,finger_ring_l_b,,,58,,,,,,,y,,,fingers,指,Fingers,,,,,,, -60,third3_L, 左薬指3, 薬指3.L,f_ring.03.L,,finger_ring_l_c,,,59,,,,,,,y,,,fingers,指,Fingers,,,,,,, -61,little1_L, 左小指1, 小指1.L,f_pinky.01.L,j_ko_a_l,finger_pinky_l_a,,,60,,,,,,,y,,,fingers,指,Fingers,,,,,,, -62,little2_L, 左小指2, 小指2.L,f_pinky.02.L,j_ko_b_l,finger_pinky_l_b,,,61,,,,,,,y,,,fingers,指,Fingers,,,,,,, -63,little3_L, 左小指3, 小指3.L,f_pinky.03.L,,finger_pinky_l_c,,,62,,,,,,,y,,,fingers,指,Fingers,,,,,,, -64,shoulder_P_R, 右肩P, 肩P.R,,,raise shoulder_R,,y,63,,y,,,,,y,,,arms,腕,Arms,,,,,,, -65,shoulder_R, 右肩, 肩.R,shoulder.R,j_sako_r,shoulder_R,y,,64,,,,y,,,y,,,arms,腕,Arms,,,,,,, -66,shoulder_C_R, 右肩C,右肩C.R,,,shoulder_hidden_R,,y,65,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -67,arm_R, 右腕, 腕.R,upper_arm.R,j_ude_a_r,arm_R,y,,66,,,,y,,,y,,,arms,腕,Arms,,,,,,, -68,arm_twist_R, 右腕捩, 腕捩.R,,n_hkata_r,shouldertwist_R,,y,67,,y,y,,,,y,,,arms,腕,Arms,,,,,,, -69,arm_twist_1_R, 右腕捩1, 腕捩1.R,,,right arm rig1,,y,68,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -70,arm_twist_2_R, 右腕捩2, 腕捩2.R,,,right arm rig2,,y,69,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -71,arm_twist_3_R, 右腕捩3, 腕捩3.R,,,right arm rig3,,y,70,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -72,elbow_R, 右ひじ, ひじ.R,forearm.R,j_ude_b_r,elbow_R,y,,71,,,,y,,,y,,,arms,腕,Arms,,,,,,, -73,clothes_elbow_R,,,,n_hhiji_r,clothes_elbow_R,,,72,,,,y,,,y,y,y,armor,その他,Other,,,,,,, -74,wrist_twist_R, 右手捩, 手捩.R,,n_hte_r,wrist twist_R,,y,73,,y,y,,,,y,,,arms,腕,Arms,,,,,,, -75,wrist_twist_1_R, 右手捩1, 手捩1.R,,,right elbow rig1,,y,74,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -76,wrist_twist_2_R, 右手捩2, 手捩2.R,,,right elbow rig2,,y,75,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -77,wrist_twist_3_R, 右手捩3, 手捩3.R,,,right elbow rig3,,y,76,,y,,,,,y,y,,arms,腕,Arms,,,,,,, -78,wrist_R, 右手首, 手首.R,hand.R,j_te_r,wrist_R,y,,77,,,,y,,,y,,,arms,腕,Arms,,,,,,, -79,dummy_R, 右ダミー, ダミー.R,,n_buki_r,dummy_R,,,78,,,,,,,,y,,armor,その他,Other,,,,,,, -80,thumb1_R, 右親指1, 親指1.R,thumb.02.R,j_oya_a_r,finger_thumb_r_a,,,79,,,,y,,,y,,,fingers,指,Fingers,,,,,,, -81,thumb2_R, 右親指2, 親指2.R,thumb.03.R,j_oya_b_r,finger_thumb_r_b,,,80,,,,y,,,y,,,fingers,指,Fingers,,,,,,, -82,fore1_R, 右人指1, 人指1.R,f_index.01.R,j_hito_a_r,finger_fore_r_a,,,81,,,,,,,y,,,fingers,指,Fingers,,,,,,, -83,fore2_R, 右人指2, 人指2.R,f_index.02.R,j_hito_b_r,finger_fore_r_b,,,82,,,,,,,y,,,fingers,指,Fingers,,,,,,, -84,fore3_R, 右人指3, 人指3.R,f_index.03.R,,finger_fore_r_c,,,83,,,,,,,y,,,fingers,指,Fingers,,,,,,, -85,middle1_R, 右中指1, 中指1.R,f_middle.01.R,j_naka_a_r,finger_middle_r_a,,,84,,,,,,,y,,,fingers,指,Fingers,,,,,,, -86,middle2_R, 右中指2, 中指2.R,f_middle.02.R,j_naka_b_r,finger_middle_r_b,,,85,,,,,,,y,,,fingers,指,Fingers,,,,,,, -87,middle3_R, 右中指3, 中指3.R,f_middle.03.R,,finger_middle_r_c,,,86,,,,,,,y,,,fingers,指,Fingers,,,,,,, -88,third1_R, 右薬指1, 薬指1.R,f_ring.01.R,j_kusu_a_r,finger_ring_r_a,,,87,,,,,,,y,,,fingers,指,Fingers,,,,,,, -89,third2_R, 右薬指2, 薬指2.R,f_ring.02.R,j_kusu_b_r,finger_ring_r_b,,,88,,,,,,,y,,,fingers,指,Fingers,,,,,,, -90,third3_R, 右薬指3, 薬指3.R,f_ring.03.R,,finger_ring_r_c,,,89,,,,,,,y,,,fingers,指,Fingers,,,,,,, -91,little1_R, 右小指1, 小指1.R,f_pinky.01.R,j_ko_a_r,finger_pinky_r_a,,,90,,,,,,,y,,,fingers,指,Fingers,,,,,,, -92,little2_R, 右小指2, 小指2.R,f_pinky.02.R,j_ko_b_r,finger_pinky_r_b,,,91,,,,,,,y,,,fingers,指,Fingers,,,,,,, -93,little3_R, 右小指3, 小指3.R,f_pinky.03.R,,finger_pinky_r_c,,,92,,,,,,,y,,,fingers,指,Fingers,,,,,,, -94,leg_L_D, 左足D, 足D.L,,,leg_L_D,y,y,93,1,y,,,,,y,,,D,足,Legs,,,,,,,Y -95,knee_L_D, 左ひざD, ひざD.L,,,knee_L_D,y,y,94,1,y,,,,,y,,,D,足,Legs,,,,,,,Y -96,knee_2_L_D, 左ひざ2D, ひざ2D.L,,,j_asi_c_l_D,,y,95,1,y,,,,,y,,,D,足,Legs,,,,,,, -97,ankle_L_D, 左足首D, 足首D.L,,,ankle_L_D,y,y,96,1,y,,,,,y,,,D,足,Legs,,,,,,,Y -98,toe_L_EX, 左足先EX,足先EX.L,,,toe_L_EX,y,y,97,1,,,,,,y,,,D,足,Legs,,,,,,,Y -99,leg_R_D, 右足D, 足D.R,,,leg_R_D,y,y,98,1,y,,,,,y,,,D,足,Legs,,,,,,,Y -100,knee_R_D, 右ひざD, ひざD.R,,,knee_R_D,y,y,99,1,y,,,,,y,,,D,足,Legs,,,,,,,Y -101,knee_2_R_D,右ひざ2D, ひざ2D.R,,,j_asi_c_r_D,,y,100,1,y,,,,,y,,,D,足,Legs,,,,,,, -102,ankle_R_D, 右足首D, 足首D.R,,,ankle_R_D,y,y,101,1,y,,,,,y,,,D,足,Legs,,,,,,,Y -103,toe_R_EX, 右足先EX,足先EX.R,,,toe_R_EX,y,y,102,1,,,,,,y,,,D,足,Legs,,,,,,,Y -104,eye_L, 左目, 目.L,eye.L,j_f_eye_l,eye_L,,,103,2,,,y,,,y,,,face,頭,Head,,,,,,, -105,eye_R, 右目, 目.R,eye.R,j_f_eye_r,eye_R,,,104,2,,,y,,,y,,,face,頭,Head,,,,,,, -106,eyes,両目,両目,,,eyes,,y,105,,y,,y,,,y,,,face,頭,Head,,,,,,, -107,hat_bunny_ears_L,,,,j_ex_met_a,hat_bunny_ears_L,,,106,,,,,,,,,y,head,頭,Head,,,,,,, -108,hat_bunny_ears_R,,,,j_ex_met_b,hat_bunny_ears_R,,,107,,,,,,,,,y,head,頭,Head,,,,,,, -109,head_eyelid_upper_L,,,,j_f_umab_l,eyelid_upper_L,,y,108,,,,,,,,,,face,頭,Head,,,,,,, -110,head_eyelid_upper_R,,,,j_f_umab_r,eyelid_upper_R,,y,109,,,,,,,,,,face,頭,Head,,,,,,, -111,head_eyelid_lower_L,,,,j_f_dmab_l,eyelid_lower_L,,y,110,,,,,,,,,,face,頭,Head,,,,,,, -112,head_eyelid_lower_R,,,,j_f_dmab_r,eyelid_lower_R,,y,111,,,,,,,,,,face,頭,Head,,,,,,, -113,head_eyebrow_1_L,,,,j_f_mayu_l,eyebrow_mid_L,,y,112,,,,,,,,,,face,頭,Head,,,,,,, -114,head_eyebrow_1_R,,,,j_f_mayu_r,eyebrow_mid_R,,y,113,,,,,,,,,,face,頭,Head,,,,,,, -115,head_eyebrow_2_L,,,,j_f_miken_l,eyebrow_front_L,,y,114,,,,,,,,,,face,頭,Head,,,,,,, -116,head_eyebrow_2_R,,,,j_f_miken_r,eyebrow_front_R,,y,115,,,,,,,,,,face,頭,Head,,,,,,, -117,head_nose_upper,,,,j_f_memoto,upper_nose,,y,116,,,,,,,y,,,face,頭,Head,,,,,,, -118,head_jaw,,,,j_ago,head jaw,,y,117,,,,,,,,,,face,頭,Head,,,,,,, -119,hroth_jaw_upper,,,,j_f_uago,hroth_jaw_upper,,y,118,,,,,,,,,,face,頭,Head,,,,,,, -120,nostrils,,,,j_f_hana,nostrils,,y,119,,,,,,,y,,,face,頭,Head,,,,,,, -121,head_cheek_1_L,,,,j_f_hoho_l,cheek_L,,y,120,,,,,,,,,,face,頭,Head,,,,,,, -122,hroth_whisker_l,,,,j_f_hige_l,hroth_whisker_l,,y,121,,,,,,,,,,face,頭,Head,,,,,,, -123,head_cheek_2_L,,,,j_f_hoho_r,cheek_R,,y,122,,,,,,,,,,face,頭,Head,,,,,,, -124,hroth_whisker_r,,,,j_f_hige_r,hroth_whisker_r,,y,123,,,,,,,,,,face,頭,Head,,,,,,, -125,head_mouth_L,,,,j_f_lip_l,lip_side_L,,y,124,,,,,,,,,,face,頭,Head,,,,,,, -126,hroth_lip_side_l,,,,n_f_lip_l,hroth_lip_side_l,,y,125,,,,,,,,,,face,頭,Head,,,,,,, -127,head_mouth_R,,,,j_f_lip_r,lip_side_R,,y,126,,,,,,,,,,face,頭,Head,,,,,,, -128,hroth_lip_side_r,,,,n_f_lip_r,hroth_lip_side_r,,y,127,,,,,,,,,,face,頭,Head,,,,,,, -129,head_lip_upper_A,,,,j_f_ulip_a,lip_upper_A,,y,128,,,,,,,,,,face,頭,Head,,,,,,, -130,head_lip_upper_B,,,,j_f_ulip_b,lip_upper_B,,y,129,,,,,,,,,,face,頭,Head,,,,,,, -131,hroth_lip_upper,,,,j_f_ulip,hroth_lip_upper,,y,130,,,,,,,,,,face,頭,Head,,,,,,, -132,hroth_lip_upper_l,,,,n_f_ulip_l,hroth_lip_upper_l,,y,131,,,,,,,,,,face,頭,Head,,,,,,, -133,hroth_lip_upper_r,,,,n_f_ulip_r,hroth_lip_upper_r,,y,132,,,,,,,,,,face,頭,Head,,,,,,, -134,head_lip_lower_A,,,,j_f_dlip_a,lip_lower_A,,y,133,,,,,,,,,,face,頭,Head,,,,,,, -135,head_lip_lower_B,,,,j_f_dlip_b,lip_lower_B,,y,134,,,,,,,,,,face,頭,Head,,,,,,, -136,hroth_lip_lower,,,,j_f_dlip,hroth_lip_lower,,y,135,,,,,,,,,,face,頭,Head,,,,,,, -137,L ear,左耳, 耳.L,,j_mimi_l,earring_anchor_L,,,136,,,,,,,y,,,head,頭,Head,,,,,,, -138,earring_1_L,,,,n_ear_a_l,earring_1_L,,,137,,,,,,,y,y,,head,頭,Head,,,,,,, -139,earring_2_L,,,,n_ear_b_l,earring_2_L,,,138,,,,,,,,y,,head,頭,Head,,,,,,, -140,R ear,右耳, 耳.R,,j_mimi_r,ear_R,,,139,,,,,,,y,,,head,頭,Head,,,,,,, -141,n_ear_a_r,,,,n_ear_a_r,earring_1_R,,,140,,,,,,,y,y,,head,頭,Head,,,,,,, -142,n_ear_b_r,,,,n_ear_b_r,earring_2_R,,,141,,,,,,,,y,,head,頭,Head,,,,,,, -143,viera_ear_1_L_a,,,,j_zera_a_l,viera_ear_1_L_a,,,142,,,,,,,y,,y,head,頭,Head,,,,,,, -144,viera_ear_1_L_b,,,,j_zera_b_l,viera_ear_1_L_b,,,143,,,,,,,y,,y,head,頭,Head,,,,,,, -145,viera_ear_1_R_a,,,,j_zera_a_r,viera_ear_1_R_a,,,144,,,,,,,y,,y,head,頭,Head,,,,,,, -146,viera_ear_1_R_b,,,,j_zera_b_r,viera_ear_1_R_b,,,145,,,,,,,y,,y,head,頭,Head,,,,,,, -147,viera_ear_2_L_a,,,,j_zerb_a_l,viera_ear_2_L_a,,,146,,,,,,,y,,y,head,頭,Head,,,,,,, -148,viera_ear_2_L_b,,,,j_zerb_b_l,viera_ear_2_L_b,,,147,,,,,,,y,,y,head,頭,Head,,,,,,, -149,viera_ear_2_R_a,,,,j_zerb_a_r,viera_ear_2_R_a,,,148,,,,,,,y,,y,head,頭,Head,,,,,,, -150,viera_ear_2_R_b,,,,j_zerb_b_r,viera_ear_2_R_b,,,149,,,,,,,y,,y,head,頭,Head,,,,,,, -151,viera_ear_3_L_a,,,,j_zerc_a_l,viera_ear_3_L_a,,,150,,,,,,,y,,y,head,頭,Head,,,,,,, -152,viera_ear_3_L_b,,,,j_zerc_b_l,viera_ear_3_L_b,,,151,,,,,,,y,,y,head,頭,Head,,,,,,, -153,viera_ear_3_R_a,,,,j_zerc_a_r,viera_ear_3_R_a,,,152,,,,,,,y,,y,head,頭,Head,,,,,,, -154,viera_ear_3_R_b,,,,j_zerc_b_r,viera_ear_3_R_b,,,153,,,,,,,y,,y,head,頭,Head,,,,,,, -155,viera_ear_4_L_a,,,,j_zerd_a_l,viera_ear_4_L_a,,,154,,,,,,,y,,y,head,頭,Head,,,,,,, -156,viera_ear_4_L_b,,,,j_zerd_b_l,viera_ear_4_L_b,,,155,,,,,,,y,,y,head,頭,Head,,,,,,, -157,viera_ear_4_R_a,,,,j_zerd_a_r,viera_ear_4_R_a,,,156,,,,,,,y,,y,head,頭,Head,,,,,,, -158,viera_ear_4_R_b,,,,j_zerd_b_r,viera_ear_4_R_b,,,157,,,,,,,y,,y,head,頭,Head,,,,,,, -159,hair_back_a,,,,j_kami_a,hair_back_a,,,158,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -160,hair_back_b,,,,j_kami_b,hair_back_b,,,159,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -161,hair_front_L,,,,j_kami_f_l,hair_front_L,,,160,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -162,hair_front_R,,,,j_kami_f_r,hair_front_R,,,161,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -163,,,,,j_ex_h0005_ke_b,hair,,,162,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -164,,,,,j_ex_h0005_ke_f,hair,,,163,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -165,,,,,j_ex_h0106_ke_f_a,hair,,,164,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -166,,,,,j_ex_h0106_ke_f_b,hair,,,165,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -167,,,,,j_ex_h0002_ke_b,hair,,,166,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -168,,,,,j_ex_h0002_ke_f,hair,,,167,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -169,,,,,j_ex_h0004_ke_f,hair,,,168,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -170,,,,,j_ex_h0004_ke_l,hair,,,169,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -171,,,,,j_ex_h0004_ke_r,hair,,,170,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -172,,,,,j_ex_h0005_ke_f,hair,,,171,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -173,,,,,j_ex_h0005_ke_l,hair,,,172,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -174,,,,,j_ex_h0005_ke_r,hair,,,173,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -175,,,,,j_ex_h0101_ke_f,hair,,,174,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -176,,,,,j_ex_h0101_ke_l,hair,,,175,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -177,,,,,j_ex_h0101_ke_r,hair,,,176,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -178,hair_side_L,,,,j_ex_h0106_ke_l,hair_side_L,,,177,,,,,,,y,y,y,hair,髪,Hair,,,,,,, -179,tail_a,,,,n_sippo_a,tail_a,,,178,,,,,,,y,,y,tail,その他,Other,,,,,,, -180,tail_b,,,,n_sippo_b,tail_b,,,179,,,,,,,y,,y,tail,その他,Other,,,,,,, -181,tail_c,,,,n_sippo_c,tail_c,,,180,,,,,,,y,,y,tail,その他,Other,,,,,,, -182,tail_d,,,,n_sippo_d,tail_d,,,181,,,,,,,y,,y,tail,その他,Other,,,,,,, -183,tail_e,,,,n_sippo_e,tail_e,,,182,,,,,,,y,,y,tail,その他,Other,,,,,,, -184,armor_cape_L,,,,j_buki_sebo_l,armor_cape_L,,,183,,,,,,,y,y,y,armor,その他,Other,,,,,,, -185,armor_waist_1_l,,,,j_buki_kosi_l,armor_waist_1_l,,,184,,,,,,,,y,,armor,その他,Other,,,,,,, -186,armor_waist_2_l,,,,j_buki2_kosi_l,armor_waist_2_l,,,185,,,,,,,,y,,armor,その他,Other,,,,,,, -187,armor_waist_1_r,,,,j_buki_kosi_r,armor_waist_1_r,,,186,,,,,,,,y,,armor,その他,Other,,,,,,, -188,armor_waist_2_r,,,,j_buki2_kosi_r,armor_waist_2_r,,,187,,,,,,,,y,,armor,その他,Other,,,,,,, -189,armor_shouldpad_l,,,,n_kataarmor_l,armor_shouldpad_l,,,188,,,,,,,,y,,armor,その他,Other,,,,,,, -190,armor_elbowpads_l,,,,n_hijisoubi_l,armor_elbowpads_l,,,189,,,,,,,y,y,,armor,その他,Other,,,,,,, -191,armor_forearm_L,,,,n_buki_tate_l,armor_forearm_L,,,190,,,,,,,,y,,armor,その他,Other,,,,,,, -192,armor_cape_R,,,,j_buki_sebo_r,armor_cape_R,,,191,,,,,,,y,y,y,armor,その他,Other,,,,,,, -193,armor_shouldpad_R,,,,n_kataarmor_r,armor_shouldpad_R,,,192,,,,,,,,y,,armor,その他,Other,,,,,,, -194,armor_elbowpads_r,,,,n_hijisoubi_r,armor_elbowpads_r,,,193,,,,,,,y,y,,armor,その他,Other,,,,,,, -195,armor_forearm_R,,,,n_buki_tate_r,armor_forearm_R,,,194,,,,,,,,y,,armor,その他,Other,,,,,,, -196,armor_kneepad_r,,,,n_hizasoubi_r,armor_kneepad_r,,,195,,,,,,,y,y,,armor,その他,Other,,,,,,, -197,armor_kneepad_L,,,,n_hizasoubi_l,armor_kneepad_L,,,196,,,,,,,y,y,,armor,その他,Other,,,,,,, -198,skirt_fr_L_a,,,,j_sk_f_a_l,skirt_fr_L_a,,,197,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -199,skirt_fr_L_b,,,,j_sk_f_b_l,skirt_fr_L_b,,,198,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -200,skirt_fr_L_c,,,,j_sk_f_c_l,skirt_fr_L_c,,,199,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -201,skirt_fr_R_a,,,,j_sk_f_a_r,skirt_fr_R_a,,,200,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -202,skirt_fr_R_b,,,,j_sk_f_b_r,skirt_fr_R_b,,,201,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -203,skirt_fr_R_c,,,,j_sk_f_c_r,skirt_fr_R_c,,,202,,y,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -204,skirt_s_L_a,,,,j_sk_s_a_l,skirt_s_L_a,,,203,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -205,skirt_s_L_b,,,,j_sk_s_b_l,skirt_s_L_b,,,204,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -206,skirt_s_L_c,,,,j_sk_s_c_l,skirt_s_L_c,,,205,,y,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -207,skirt_s_R_a,,,,j_sk_s_a_r,skirt_s_R_a,,,206,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -208,skirt_s_R_b,,,,j_sk_s_b_r,skirt_s_R_b,,,207,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -209,skirt_s_R_c,,,,j_sk_s_c_r,skirt_s_R_c,,,208,,y,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -210,skirt_b_L_a,,,,j_sk_b_a_l,skirt_b_L_a,,,209,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -211,skirt_b_L_b,,,,j_sk_b_b_l,skirt_b_L_b,,,210,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -212,skirt_b_L_c,,,,j_sk_b_c_l,skirt_b_L_c,,,211,,y,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -213,skirt_b_R_a,,,,j_sk_b_a_r,skirt_b_R_a,,,212,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -214,skirt_b_R_b,,,,j_sk_b_b_r,skirt_b_R_b,,,213,,,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -215,skirt_b_R_c,,,,j_sk_b_c_r,skirt_b_R_c,,,214,,y,,,,,y,y,y,skirt,スカート,Skirt,,,,,,, -216,n_throw,,,,n_throw,n_throw,,,215,,,,,,y,y,y,,other,センター,Other,,,,,,, +id,mmd_english,mmd_japanese,mmd_japaneseLR,blender_rigify,ffxiv,mmd_kaito,description,required,is_special,PMXE_bone_order,PMXE_deform_tier,tip_bone,fixed_axis,local_axis,controller,disable_rotate,disable_move,hidden,physics,blender_bone_group,mmd_bone_group_jap,mmd_bone_group_eng,animation_retargeting_group,cancel,cancel_parent,IK_target,IK_children,IK_child_limit_min,IK_child_limit_max,add_to_rig +1,view cnt, 操作中心, 操作中心,,,,view cnt,y,y,0,,,,,,,,,,motherbone,センター,Center,,,,,,,,Y +2,root, 全ての親, 全ての親,,,,motherbone,y,y,1,,,,,,,,,,motherbone,Root,Root,,,,,,,,Y +3,center, センター, センター,,,,center,y,y,2,,y,,,,,,,,motherbone,センター,Center,,,,,,,,Y +4,groove, グルーブ, グルーブ,,,,groove,,y,3,,,,,,,,,,motherbone,センター,Center,,,,,,,,Y +5,waist, 腰, 腰,spine,n_hara,,waist,y,y,4,,,,,,,y,,,torso,センター,Center,,,,,,,,Y +6,lower body, 下半身, 下半身,,j_kosi,,lower body,y,,5,,,,,,,y,,,torso,体(下),Lower Body,body,,,,,,, +7,upper body, 上半身, 上半身,spine.001,j_sebo_a,,upper body,y,,6,,,,,,,y,,,torso,体(上),Upper Body,body,,,,,,, +8,upper body 2, 上半身2, 上半身2,spine.002,j_sebo_b,,upper body 2,y,,7,,,,,,,y,,,torso,体(上),Upper Body,body,,,,,,, +9,upper body 3, 上半身3, 上半身3,spine.003,j_sebo_c,,upper body 3,,,8,,,,,,,y,,,torso,体(上),Upper Body,,,,,,,, +10,waist_cancel_L, 腰キャンセル左, 腰キャンセル.L,,,,waist cancel left,y,y,9,,y,,,,,y,y,,torso,体(上),Upper Body,,y,6,,,,,Y +11,leg_L, 左足, 足.L,thigh.L,j_asi_a_l,,leg_L,y,,10,,,,,,,y,,,legs,足,Legs,body,,,,,,, +12,knee_L, 左ひざ, ひざ.L,shin.L,j_asi_b_l,,knee_L_a,y,,11,,,,,,,y,,,legs,足,Legs,body,,,,,,, +13,knee_2_L, 左ひざ2, ひざ2.L,,j_asi_c_l,,knee_L_b,,,12,,,,,,,y,,,legs,足,Legs,,,,,,,, +14,ankle_L, 左足首, 足首.L,foot.L,j_asi_d_l,,ankle_L,y,,13,,,,,,,y,,,legs,足,Legs,body,,,,,,, +15,toe_L, 左つま先, つま先.L,toe.L,j_asi_e_l,,toe_L,y,,14,,,,,,,y,,,legs,足,Legs,body,,,,,,, +16,leg IK_root_L,左足IK親,足IK親.L,,,,leg IK_root_L,,y,15,,,,,,,,,,IK,IK,IK,,,,,,,, +17,leg IK_L, 左足IK, 足IK.L,,leg IK_L,,leg IK_L,y,y,16,1,,,,,,,,,IK,IK,IK,,,,10,9\8,-180,-0.5, +18,toe IK_L, 左つま先IK, つま先IK.L,,toe IK_L,,toe IK_L,y,y,17,1,,,,,,,,,IK,IK,IK,,,,11,10,,, +19,waist_cancel_R, 腰キャンセル右, 腰キャンセル.R,,,,waist cancel right,y,y,18,,y,,,,,y,y,,torso,体(上),Upper Body,,y,6,,,,,Y +20,leg_R, 右足, 足.R,thigh.R,j_asi_a_r,,leg_R,y,,19,,,,,,,y,,,legs,足,Legs,body,,,,,,, +21,knee_R, 右ひざ, ひざ.R,shin.R,j_asi_b_r,,knee_R_a,y,,20,,,,,,,y,,,legs,足,Legs,body,,,,,,, +22,knee_2_R, 右ひざ2, ひざ2.R,,j_asi_c_r,,knee_R_b,,,21,,,,,,,y,,,legs,足,Legs,,,,,,,, +23,ankle_R, 右足首, 足首.R,foot.R,j_asi_d_r,,ankle_R,y,,22,,,,,,,y,,,legs,足,Legs,body,,,,,,, +24,toe_R, 右つま先, つま先.R,toe.R,j_asi_e_r,,toe_R,y,,23,,,,,,,y,,,legs,足,Legs,body,,,,,,, +25,leg IK_root_R,右足IK親,足IK親.R,,,,leg IK_root_R,,y,24,,,,,,,,,,IK,IK,IK,,,,,,,, +26,leg IK_R, 右足IK, 足IK.R,,leg IK_R,,leg IK_R,y,y,25,1,,,,,,,,,IK,IK,IK,,,,17,16\15,-180,-0.5,Y +27,toe IK_R, 右つま先IK, つま先IK.R,,toe IK_R,,toe IK_R,y,y,26,1,,,,,,,,,IK,IK,IK,,,,18,,,,Y +28,bust_L, 左胸, 胸.L,breast.L,j_mune_l,,bust_L,,,27,,,,,,,y,,,torso,体(上),Upper Body,breast,,,,,,, +29,bust_2_L, 左胸2, 胸2.L,,,,bust_L_2,,y,28,,,,,,y,y,,,torso,体(上),Upper Body,,,,,,,, +30,bust_R, 右胸, 胸.R,breast.R,j_mune_r,,bust_R,,,29,,,,,,,y,,,torso,体(上),Upper Body,breast,,,,,,, +31,bust_2_R, 右胸2, 胸2.R,,,,bust_R_2,,y,30,,,,,,y,y,,,torso,体(上),Upper Body,,,,,,,, +32,neck, 首, 首,spine.004,j_kubi,,neck,y,,31,,,,,,,y,,,head,体(上),Upper Body,body,,,,,,, +33,head, 頭, 頭,spine.005,j_kao,,head,y,,32,,,,,,,y,,,head,体(上),Upper Body,body,,,,,,, +34,shoulder_P_L, 左肩P,肩P.L,,,,raise shoulder_L,,y,33,,y,,,,,y,,,arms,腕,Arms,,,,,,,, +35,shoulder_L, 左肩, 肩.L,shoulder.L,j_sako_l,,shoulder_L,y,,34,,,,y,,,y,,,arms,腕,Arms,body,,,,,,, +36,shoulder_C_L,左肩C,肩C.L,,,,shoulder_hidden_L,,y,35,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +37,arm_L, 左腕, 腕.L,upper_arm.L,j_ude_a_l,,arm_L,y,,36,,,,y,,,y,,,arms,腕,Arms,body,,,,,,, +38,arm_twist_L, 左腕捩, 腕捩.L,,n_hkata_l,,shouldertwist_L,,y,37,,y,y,,,,y,,,arms,腕,Arms,,y,34,,,,, +39,arm_twist_1_L, 左腕捩1, 腕捩1.L,,,,left arm twist 1,,y,38,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +40,arm_twist_2_L, 左腕捩2, 腕捩2.L,,,,left arm twist 2,,y,39,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +41,arm_twist_3_L, 左腕捩3, 腕捩3.L,,,,left arm twist 3,,y,40,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +42,elbow_L, 左ひじ, ひじ.L,forearm.L,j_ude_b_l,,elbow_L,y,,41,,,,y,,,y,,,arms,腕,Arms,body,,,,,,, +43,clothes_elbow_L,,,,n_hhiji_l,,clothes_elbow_L,,y,42,,,,y,,,y,y,y,armor,その他,Other,,,,,,,, +44,wrist_twist_L, 左手捩, 手捩.L,,n_hte_l,,wrist twist_L,,,43,,y,y,,,,y,,,arms,腕,Arms,,,,,,,, +45,wrist_twist_1_L, 左手捩1, 手捩1.L,,,,left hand screw 1,,y,44,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +46,wrist_twist_2_L, 左手捩2, 手捩2.L,,,,left hand screw 2,,y,45,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +47,wrist_twist_3_L, 左手捩3, 手捩3.L,,,,left hand screw 3,,y,46,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +48,wrist_L, 左手首, 手首.L,hand.L,j_te_l,,wrist_L,y,,47,,,,y,,,y,,,arms,腕,Arms,body,,,,,,, +49,dummy_L, 左ダミー, ダミー.L,,n_buki_l,,dummy_L,,,48,,,,,,,,y,,armor,その他,Other,,,,,,,, +50,thumb1_L, 左親指1, 親指1.L,thumb.02.L,j_oya_a_l,親指0.L,finger_thumb_l_a,,,49,,,,y,,,y,,,fingers,指,Fingers,body,,,,,,, +51,thumb2_L, 左親指2, 親指2.L,thumb.03.L,j_oya_b_l,親指1.L,finger_thumb_l_b,,,50,,,,y,,,y,,,fingers,指,Fingers,body,,,,,,, +52,fore1_L, 左人指1, 人指1.L,f_index.01.L,j_hito_a_l,,finger_fore_l_a,,,51,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +53,fore2_L, 左人指2, 人指2.L,f_index.02.L,j_hito_b_l,,finger_fore_l_b,,,52,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +54,fore3_L, 左人指3, 人指3.L,f_index.03.L,,,finger_fore_l_c,,,53,,,,,,,y,,,fingers,指,Fingers,,,,,,,, +55,middle1_L, 左中指1, 中指1.L,f_middle.01.L,j_naka_a_l,,finger_middle_l_a,,,54,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +56,middle2_L, 左中指2, 中指2.L,f_middle.02.L,j_naka_b_l,,finger_middle_l_b,,,55,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +57,middle3_L, 左中指3, 中指3.L,f_middle.03.L,,,finger_middle_l_c,,,56,,,,,,,y,,,fingers,指,Fingers,,,,,,,, +58,third1_L, 左薬指1, 薬指1.L,f_ring.01.L,j_kusu_a_l,,finger_ring_l_a,,,57,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +59,third2_L, 左薬指2, 薬指2.L,f_ring.02.L,j_kusu_b_l,,finger_ring_l_b,,,58,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +60,third3_L, 左薬指3, 薬指3.L,f_ring.03.L,,,finger_ring_l_c,,,59,,,,,,,y,,,fingers,指,Fingers,,,,,,,, +61,little1_L, 左小指1, 小指1.L,f_pinky.01.L,j_ko_a_l,,finger_pinky_l_a,,,60,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +62,little2_L, 左小指2, 小指2.L,f_pinky.02.L,j_ko_b_l,,finger_pinky_l_b,,,61,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +63,little3_L, 左小指3, 小指3.L,f_pinky.03.L,,,finger_pinky_l_c,,,62,,,,,,,y,,,fingers,指,Fingers,,,,,,,, +64,shoulder_P_R, 右肩P, 肩P.R,,,,raise shoulder_R,,y,63,,y,,,,,y,,,arms,腕,Arms,,,,,,,, +65,shoulder_R, 右肩, 肩.R,shoulder.R,j_sako_r,,shoulder_R,y,,64,,,,y,,,y,,,arms,腕,Arms,body,,,,,,, +66,shoulder_C_R, 右肩C,右肩C.R,,,,shoulder_hidden_R,,y,65,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +67,arm_R, 右腕, 腕.R,upper_arm.R,j_ude_a_r,,arm_R,y,,66,,,,y,,,y,,,arms,腕,Arms,body,,,,,,, +68,arm_twist_R, 右腕捩, 腕捩.R,,n_hkata_r,,shouldertwist_R,,y,67,,y,y,,,,y,,,arms,腕,Arms,,,,,,,, +69,arm_twist_1_R, 右腕捩1, 腕捩1.R,,,,right arm rig1,,y,68,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +70,arm_twist_2_R, 右腕捩2, 腕捩2.R,,,,right arm rig2,,y,69,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +71,arm_twist_3_R, 右腕捩3, 腕捩3.R,,,,right arm rig3,,y,70,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +72,elbow_R, 右ひじ, ひじ.R,forearm.R,j_ude_b_r,,elbow_R,y,,71,,,,y,,,y,,,arms,腕,Arms,body,,,,,,, +73,clothes_elbow_R,,,,n_hhiji_r,,clothes_elbow_R,,,72,,,,y,,,y,y,y,armor,その他,Other,,,,,,,, +74,wrist_twist_R, 右手捩, 手捩.R,,n_hte_r,,wrist twist_R,,y,73,,y,y,,,,y,,,arms,腕,Arms,,,,,,,, +75,wrist_twist_1_R, 右手捩1, 手捩1.R,,,,right elbow rig1,,y,74,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +76,wrist_twist_2_R, 右手捩2, 手捩2.R,,,,right elbow rig2,,y,75,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +77,wrist_twist_3_R, 右手捩3, 手捩3.R,,,,right elbow rig3,,y,76,,y,,,,,y,y,,arms,腕,Arms,,,,,,,, +78,wrist_R, 右手首, 手首.R,hand.R,j_te_r,,wrist_R,y,,77,,,,y,,,y,,,arms,腕,Arms,body,,,,,,, +79,dummy_R, 右ダミー, ダミー.R,,n_buki_r,,dummy_R,,,78,,,,,,,,y,,armor,その他,Other,,,,,,,, +80,thumb1_R, 右親指1, 親指1.R,thumb.02.R,j_oya_a_r,親指0.R,finger_thumb_r_a,,,79,,,,y,,,y,,,fingers,指,Fingers,body,,,,,,, +81,thumb2_R, 右親指2, 親指2.R,thumb.03.R,j_oya_b_r,親指1.R,finger_thumb_r_b,,,80,,,,y,,,y,,,fingers,指,Fingers,body,,,,,,, +82,fore1_R, 右人指1, 人指1.R,f_index.01.R,j_hito_a_r,,finger_fore_r_a,,,81,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +83,fore2_R, 右人指2, 人指2.R,f_index.02.R,j_hito_b_r,,finger_fore_r_b,,,82,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +84,fore3_R, 右人指3, 人指3.R,f_index.03.R,,,finger_fore_r_c,,,83,,,,,,,y,,,fingers,指,Fingers,,,,,,,, +85,middle1_R, 右中指1, 中指1.R,f_middle.01.R,j_naka_a_r,,finger_middle_r_a,,,84,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +86,middle2_R, 右中指2, 中指2.R,f_middle.02.R,j_naka_b_r,,finger_middle_r_b,,,85,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +87,middle3_R, 右中指3, 中指3.R,f_middle.03.R,,,finger_middle_r_c,,,86,,,,,,,y,,,fingers,指,Fingers,,,,,,,, +88,third1_R, 右薬指1, 薬指1.R,f_ring.01.R,j_kusu_a_r,,finger_ring_r_a,,,87,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +89,third2_R, 右薬指2, 薬指2.R,f_ring.02.R,j_kusu_b_r,,finger_ring_r_b,,,88,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +90,third3_R, 右薬指3, 薬指3.R,f_ring.03.R,,,finger_ring_r_c,,,89,,,,,,,y,,,fingers,指,Fingers,,,,,,,, +91,little1_R, 右小指1, 小指1.R,f_pinky.01.R,j_ko_a_r,,finger_pinky_r_a,,,90,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +92,little2_R, 右小指2, 小指2.R,f_pinky.02.R,j_ko_b_r,,finger_pinky_r_b,,,91,,,,,,,y,,,fingers,指,Fingers,body,,,,,,, +93,little3_R, 右小指3, 小指3.R,f_pinky.03.R,,,finger_pinky_r_c,,,92,,,,,,,y,,,fingers,指,Fingers,,,,,,,, +94,leg_L_D, 左足D, 足D.L,,,,leg_L_D,y,y,93,1,y,,,,,y,,,D,足,Legs,,,,,,,,Y +95,knee_L_D, 左ひざD, ひざD.L,,,,knee_L_D,y,y,94,1,y,,,,,y,,,D,足,Legs,,,,,,,,Y +96,knee_2_L_D, 左ひざ2D, ひざ2D.L,,,,j_asi_c_l_D,,y,95,1,y,,,,,y,,,D,足,Legs,,,,,,,, +97,ankle_L_D, 左足首D, 足首D.L,,,,ankle_L_D,y,y,96,1,y,,,,,y,,,D,足,Legs,,,,,,,,Y +98,toe_L_EX, 左足先EX,足先EX.L,,,,toe_L_EX,y,y,97,1,,,,,,y,,,D,足,Legs,,,,,,,,Y +99,leg_R_D, 右足D, 足D.R,,,,leg_R_D,y,y,98,1,y,,,,,y,,,D,足,Legs,,,,,,,,Y +100,knee_R_D, 右ひざD, ひざD.R,,,,knee_R_D,y,y,99,1,y,,,,,y,,,D,足,Legs,,,,,,,,Y +101,knee_2_R_D,右ひざ2D, ひざ2D.R,,,,j_asi_c_r_D,,y,100,1,y,,,,,y,,,D,足,Legs,,,,,,,, +102,ankle_R_D, 右足首D, 足首D.R,,,,ankle_R_D,y,y,101,1,y,,,,,y,,,D,足,Legs,,,,,,,,Y +103,toe_R_EX, 右足先EX,足先EX.R,,,,toe_R_EX,y,y,102,1,,,,,,y,,,D,足,Legs,,,,,,,,Y +104,eye_L, 左目, 目.L,eye.L,j_f_eye_l,,eye_L,,,103,2,,,y,,,y,,,face,頭,Head,eye,,,,,,, +105,eye_R, 右目, 目.R,eye.R,j_f_eye_r,,eye_R,,,104,2,,,y,,,y,,,face,頭,Head,eye,,,,,,, +106,eyes,両目,両目,,,,eyes,,y,105,,y,,y,,,y,,,face,頭,Head,,,,,,,, +107,hat_bunny_ears_L,,,,j_ex_met_a,,hat_bunny_ears_L,,,106,,,,,,,,,y,head,頭,Head,,,,,,,, +108,hat_bunny_ears_R,,,,j_ex_met_b,,hat_bunny_ears_R,,,107,,,,,,,,,y,head,頭,Head,,,,,,,, +109,head_eyelid_upper_L,,,,j_f_umab_l,,eyelid_upper_L,,y,108,,,,,,,,,,face,頭,Head,eyelid,,,,,,, +110,head_eyelid_upper_R,,,,j_f_umab_r,,eyelid_upper_R,,y,109,,,,,,,,,,face,頭,Head,eyelid,,,,,,, +111,head_eyelid_lower_L,,,,j_f_dmab_l,,eyelid_lower_L,,y,110,,,,,,,,,,face,頭,Head,eyelid,,,,,,, +112,head_eyelid_lower_R,,,,j_f_dmab_r,,eyelid_lower_R,,y,111,,,,,,,,,,face,頭,Head,eyelid,,,,,,, +113,head_eyebrow_1_L,,,,j_f_mayu_l,,eyebrow_mid_L,,y,112,,,,,,,,,,face,頭,Head,eyebrow,,,,,,, +114,head_eyebrow_1_R,,,,j_f_mayu_r,,eyebrow_mid_R,,y,113,,,,,,,,,,face,頭,Head,eyebrow,,,,,,, +115,head_eyebrow_2_L,,,,j_f_miken_l,,eyebrow_front_L,,y,114,,,,,,,,,,face,頭,Head,eyebrow,,,,,,, +116,head_eyebrow_2_R,,,,j_f_miken_r,,eyebrow_front_R,,y,115,,,,,,,,,,face,頭,Head,eyebrow,,,,,,, +117,head_nose_upper,,,,j_f_memoto,,upper_nose,,y,116,,,,,,,y,,,face,頭,Head,nose,,,,,,, +118,head_jaw,,,,j_ago,,head jaw,,y,117,,,,,,,,,,face,頭,Head,mouth,,,,,,, +119,hroth_jaw_upper,,,,j_f_uago,,hroth_jaw_upper,,y,118,,,,,,,,,,face,頭,Head,mouth,,,,,,, +120,nostrils,,,,j_f_hana,,nostrils,,y,119,,,,,,,y,,,face,頭,Head,nose,,,,,,, +121,head_cheek_1_L,,,,j_f_hoho_l,,cheek_L,,y,120,,,,,,,,,,face,頭,Head,mouth,,,,,,, +122,hroth_whisker_l,,,,j_f_hige_l,,hroth_whisker_l,,y,121,,,,,,,,,,face,頭,Head,nose,,,,,,, +123,head_cheek_2_L,,,,j_f_hoho_r,,cheek_R,,y,122,,,,,,,,,,face,頭,Head,mouth,,,,,,, +124,hroth_whisker_r,,,,j_f_hige_r,,hroth_whisker_r,,y,123,,,,,,,,,,face,頭,Head,nose,,,,,,, +125,head_mouth_L,,,,j_f_lip_l,,lip_side_L,,y,124,,,,,,,,,,face,頭,Head,mouth,,,,,,, +126,hroth_lip_side_l,,,,n_f_lip_l,,hroth_lip_side_l,,y,125,,,,,,,,,,face,頭,Head,mouth,,,,,,, +127,head_mouth_R,,,,j_f_lip_r,,lip_side_R,,y,126,,,,,,,,,,face,頭,Head,mouth,,,,,,, +128,hroth_lip_side_r,,,,n_f_lip_r,,hroth_lip_side_r,,y,127,,,,,,,,,,face,頭,Head,mouth,,,,,,, +129,head_lip_upper_A,,,,j_f_ulip_a,,lip_upper_A,,y,128,,,,,,,,,,face,頭,Head,mouth,,,,,,, +130,head_lip_upper_B,,,,j_f_ulip_b,,lip_upper_B,,y,129,,,,,,,,,,face,頭,Head,mouth,,,,,,, +131,hroth_lip_upper,,,,j_f_ulip,,hroth_lip_upper,,y,130,,,,,,,,,,face,頭,Head,mouth,,,,,,, +132,hroth_lip_upper_l,,,,n_f_ulip_l,,hroth_lip_upper_l,,y,131,,,,,,,,,,face,頭,Head,mouth,,,,,,, +133,hroth_lip_upper_r,,,,n_f_ulip_r,,hroth_lip_upper_r,,y,132,,,,,,,,,,face,頭,Head,mouth,,,,,,, +134,head_lip_lower_A,,,,j_f_dlip_a,,lip_lower_A,,y,133,,,,,,,,,,face,頭,Head,mouth,,,,,,, +135,head_lip_lower_B,,,,j_f_dlip_b,,lip_lower_B,,y,134,,,,,,,,,,face,頭,Head,mouth,,,,,,, +136,hroth_lip_lower,,,,j_f_dlip,,hroth_lip_lower,,y,135,,,,,,,,,,face,頭,Head,mouth,,,,,,, +137,L ear,左耳, 耳.L,,j_mimi_l,,earring_anchor_L,,,136,,,,,,,y,,,head,頭,Head,ear,,,,,,, +138,earring_1_L,,,,n_ear_a_l,,earring_1_L,,,137,,,,,,,y,y,,head,頭,Head,,,,,,,, +139,earring_2_L,,,,n_ear_b_l,,earring_2_L,,,138,,,,,,,,y,,head,頭,Head,,,,,,,, +140,R ear,右耳, 耳.R,,j_mimi_r,,ear_R,,,139,,,,,,,y,,,head,頭,Head,ear,,,,,,, +141,n_ear_a_r,,,,n_ear_a_r,,earring_1_R,,,140,,,,,,,y,y,,head,頭,Head,,,,,,,, +142,n_ear_b_r,,,,n_ear_b_r,,earring_2_R,,,141,,,,,,,,y,,head,頭,Head,,,,,,,, +143,viera_ear_1_L_a,,,,j_zera_a_l,,viera_ear_1_L_a,,,142,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +144,viera_ear_1_L_b,,,,j_zera_b_l,,viera_ear_1_L_b,,,143,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +145,viera_ear_1_R_a,,,,j_zera_a_r,,viera_ear_1_R_a,,,144,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +146,viera_ear_1_R_b,,,,j_zera_b_r,,viera_ear_1_R_b,,,145,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +147,viera_ear_2_L_a,,,,j_zerb_a_l,,viera_ear_2_L_a,,,146,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +148,viera_ear_2_L_b,,,,j_zerb_b_l,,viera_ear_2_L_b,,,147,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +149,viera_ear_2_R_a,,,,j_zerb_a_r,,viera_ear_2_R_a,,,148,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +150,viera_ear_2_R_b,,,,j_zerb_b_r,,viera_ear_2_R_b,,,149,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +151,viera_ear_3_L_a,,,,j_zerc_a_l,,viera_ear_3_L_a,,,150,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +152,viera_ear_3_L_b,,,,j_zerc_b_l,,viera_ear_3_L_b,,,151,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +153,viera_ear_3_R_a,,,,j_zerc_a_r,,viera_ear_3_R_a,,,152,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +154,viera_ear_3_R_b,,,,j_zerc_b_r,,viera_ear_3_R_b,,,153,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +155,viera_ear_4_L_a,,,,j_zerd_a_l,,viera_ear_4_L_a,,,154,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +156,viera_ear_4_L_b,,,,j_zerd_b_l,,viera_ear_4_L_b,,,155,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +157,viera_ear_4_R_a,,,,j_zerd_a_r,,viera_ear_4_R_a,,,156,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +158,viera_ear_4_R_b,,,,j_zerd_b_r,,viera_ear_4_R_b,,,157,,,,,,,y,,y,head,頭,Head,ear,,,,,,, +159,hair_back_a,,,,j_kami_a,,hair_back_a,,,158,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +160,hair_back_b,,,,j_kami_b,,hair_back_b,,,159,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +161,hair_front_L,,,,j_kami_f_l,,hair_front_L,,,160,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +162,hair_front_R,,,,j_kami_f_r,,hair_front_R,,,161,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +163,,,,,j_ex_h0005_ke_b,,hair,,,162,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +164,,,,,j_ex_h0005_ke_f,,hair,,,163,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +165,,,,,j_ex_h0106_ke_f_a,,hair,,,164,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +166,,,,,j_ex_h0106_ke_f_b,,hair,,,165,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +167,,,,,j_ex_h0002_ke_b,,hair,,,166,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +168,,,,,j_ex_h0002_ke_f,,hair,,,167,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +169,,,,,j_ex_h0004_ke_f,,hair,,,168,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +170,,,,,j_ex_h0004_ke_l,,hair,,,169,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +171,,,,,j_ex_h0004_ke_r,,hair,,,170,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +172,,,,,j_ex_h0005_ke_f,,hair,,,171,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +173,,,,,j_ex_h0005_ke_l,,hair,,,172,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +174,,,,,j_ex_h0005_ke_r,,hair,,,173,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +175,,,,,j_ex_h0101_ke_f,,hair,,,174,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +176,,,,,j_ex_h0101_ke_l,,hair,,,175,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +177,,,,,j_ex_h0101_ke_r,,hair,,,176,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +178,hair_side_L,,,,j_ex_h0106_ke_l,,hair_side_L,,,177,,,,,,,y,y,y,hair,髪,Hair,,,,,,,, +179,tail_a,,,,n_sippo_a,,tail_a,,,178,,,,,,,y,,y,tail,その他,Other,,,,,,,, +180,tail_b,,,,n_sippo_b,,tail_b,,,179,,,,,,,y,,y,tail,その他,Other,,,,,,,, +181,tail_c,,,,n_sippo_c,,tail_c,,,180,,,,,,,y,,y,tail,その他,Other,,,,,,,, +182,tail_d,,,,n_sippo_d,,tail_d,,,181,,,,,,,y,,y,tail,その他,Other,,,,,,,, +183,tail_e,,,,n_sippo_e,,tail_e,,,182,,,,,,,y,,y,tail,その他,Other,,,,,,,, +184,armor_cape_L,,,,j_buki_sebo_l,,armor_cape_L,,,183,,,,,,,y,y,y,armor,その他,Other,,,,,,,, +185,armor_waist_1_l,,,,j_buki_kosi_l,,armor_waist_1_l,,,184,,,,,,,,y,,armor,その他,Other,,,,,,,, +186,armor_waist_2_l,,,,j_buki2_kosi_l,,armor_waist_2_l,,,185,,,,,,,,y,,armor,その他,Other,,,,,,,, +187,armor_waist_1_r,,,,j_buki_kosi_r,,armor_waist_1_r,,,186,,,,,,,,y,,armor,その他,Other,,,,,,,, +188,armor_waist_2_r,,,,j_buki2_kosi_r,,armor_waist_2_r,,,187,,,,,,,,y,,armor,その他,Other,,,,,,,, +189,armor_shouldpad_l,,,,n_kataarmor_l,,armor_shouldpad_l,,,188,,,,,,,,y,,armor,その他,Other,,,,,,,, +190,armor_elbowpads_l,,,,n_hijisoubi_l,,armor_elbowpads_l,,,189,,,,,,,y,y,,armor,その他,Other,,,,,,,, +191,armor_forearm_L,,,,n_buki_tate_l,,armor_forearm_L,,,190,,,,,,,,y,,armor,その他,Other,,,,,,,, +192,armor_cape_R,,,,j_buki_sebo_r,,armor_cape_R,,,191,,,,,,,y,y,y,armor,その他,Other,,,,,,,, +193,armor_shouldpad_R,,,,n_kataarmor_r,,armor_shouldpad_R,,,192,,,,,,,,y,,armor,その他,Other,,,,,,,, +194,armor_elbowpads_r,,,,n_hijisoubi_r,,armor_elbowpads_r,,,193,,,,,,,y,y,,armor,その他,Other,,,,,,,, +195,armor_forearm_R,,,,n_buki_tate_r,,armor_forearm_R,,,194,,,,,,,,y,,armor,その他,Other,,,,,,,, +196,armor_kneepad_r,,,,n_hizasoubi_r,,armor_kneepad_r,,,195,,,,,,,y,y,,armor,その他,Other,,,,,,,, +197,armor_kneepad_L,,,,n_hizasoubi_l,,armor_kneepad_L,,,196,,,,,,,y,y,,armor,その他,Other,,,,,,,, +198,skirt_fr_L_a,,,,j_sk_f_a_l,Skirt_0_1,skirt_fr_L_a,,,197,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +199,skirt_fr_L_b,,,,j_sk_f_b_l,Skirt_1_1,skirt_fr_L_b,,,198,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +200,skirt_fr_L_c,,,,j_sk_f_c_l,Skirt_2_1,skirt_fr_L_c,,,199,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +201,skirt_fr_R_a,,,,j_sk_f_a_r,Skirt_0_0,skirt_fr_R_a,,,200,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +202,skirt_fr_R_b,,,,j_sk_f_b_r,Skirt_1_0,skirt_fr_R_b,,,201,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +203,skirt_fr_R_c,,,,j_sk_f_c_r,Skirt_2_0,skirt_fr_R_c,,,202,,y,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +204,skirt_s_L_a,,,,j_sk_s_a_l,Skirt_0_2,skirt_s_L_a,,,203,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +205,skirt_s_L_b,,,,j_sk_s_b_l,Skirt_1_2,skirt_s_L_b,,,204,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +206,skirt_s_L_c,,,,j_sk_s_c_l,Skirt_2_2,skirt_s_L_c,,,205,,y,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +207,skirt_s_R_a,,,,j_sk_s_a_r,Skirt_0_5,skirt_s_R_a,,,206,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +208,skirt_s_R_b,,,,j_sk_s_b_r,Skirt_1_5,skirt_s_R_b,,,207,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +209,skirt_s_R_c,,,,j_sk_s_c_r,Skirt_2_5,skirt_s_R_c,,,208,,y,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +210,skirt_b_L_a,,,,j_sk_b_a_l,Skirt_0_3,skirt_b_L_a,,,209,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +211,skirt_b_L_b,,,,j_sk_b_b_l,Skirt_1_3,skirt_b_L_b,,,210,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +212,skirt_b_L_c,,,,j_sk_b_c_l,Skirt_2_3,skirt_b_L_c,,,211,,y,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +213,skirt_b_R_a,,,,j_sk_b_a_r,Skirt_0_4,skirt_b_R_a,,,212,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +214,skirt_b_R_b,,,,j_sk_b_b_r,Skirt_1_4,skirt_b_R_b,,,213,,,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +215,skirt_b_R_c,,,,j_sk_b_c_r,Skirt_2_4,skirt_b_R_c,,,214,,y,,,,,y,y,y,skirt,スカート,Skirt,skirt,,,,,,, +216,n_throw,,,,n_throw,,n_throw,,,215,,,,,,y,y,y,,other,センター,Other,,,,,,,, diff --git a/ffxiv_mmd_tools_helper/import_ffxiv_charafile.py b/ffxiv_mmd_tools_helper/import_ffxiv_charafile.py index 1a1742e..c0f5399 100644 --- a/ffxiv_mmd_tools_helper/import_ffxiv_charafile.py +++ b/ffxiv_mmd_tools_helper/import_ffxiv_charafile.py @@ -739,10 +739,6 @@ def main(context,filepath,apply_charafile_to_selected=None): - - - - from bpy_extras.io_utils import ImportHelper @@ -763,13 +759,9 @@ class FFXIV_CharaFileBrowserImportOperator(bpy.types.Operator, ImportHelper): @classmethod def poll(cls, context): - #root = model.findRoot(context.active_object) - armature = model.findArmature(context.active_object) - - if armature: - return True - #if context.active_object: - #return context.active_object.type == 'ARMATURE' + + if context.active_object: + return context.active_object.type == 'ARMATURE' def execute(self, context): diff --git a/ffxiv_mmd_tools_helper/import_ffxiv_model.py b/ffxiv_mmd_tools_helper/import_ffxiv_model.py index c5e9645..133788e 100644 --- a/ffxiv_mmd_tools_helper/import_ffxiv_model.py +++ b/ffxiv_mmd_tools_helper/import_ffxiv_model.py @@ -179,35 +179,6 @@ def import_ffxiv_model(context,file_path): - textools_folder = None - - addon_prefs = bpy.context.preferences.addons[__package__].preferences - textools_saved_folder = addon_prefs.textools_saved_folder - - # Check if textools_saved_folder is not None - if context.scene.textools_saved_folder: - if os.path.exists(os.path.abspath(context.scene.textools_saved_folder)): - textools_folder = os.path.abspath(context.scene.textools_saved_folder) - - elif textools_saved_folder: - if os.path.exists(os.path.abspath(textools_saved_folder)): - textools_folder = os.path.abspath(textools_saved_folder) - - print(f"textools folder: {textools_folder}") - - #loop through the mesh_list and search for the target files - for i in mesh_list: - material_folder = find_TexTools_material_texture_folder(textools_folder,mesh_list[i][0],mesh_list[i][1],i) - #print(f"{i}: {mesh_list[i][0]}, {mesh_list[i][1]}:{material_folder}") - - #if material folder is found, update mesh_list with the details - if material_folder: - immediate_folder_name = material_folder.split(os.path.sep)[-1] - mesh_list[i] = (mesh_list[i][0],mesh_list[i][1],immediate_folder_name,material_folder) - else: - mesh_list[i] = (mesh_list[i][0],mesh_list[i][1],'','') - - #print(f"{i}: {mesh_list[i][0]}, {mesh_list[i][1]},{mesh_list[i][2]}") #loop through the armature and if there's any meshes that match the mesh_list, update custom properties and name if x.type =='ARMATURE': @@ -250,83 +221,6 @@ def add_custom_property(obj,prop_name,prop_value): -def find_TexTools_material_texture_folder(root_folder_path,ModelType,MaterialType,original_material_name): - - #root_folder_path = r'C:\Users\wikid\OneDrive\Documents\TexTools\Saved' - #ModelType = 'Body' - #original_material_name = 'mt_c0501e9152_top_a' - #target_filename = 'mt_c0501e9152_top_a.dat' - target_filename = original_material_name+'.dat' - target_folder_path = None - ModelType_subfolder = None - - textools_subfolder_gear_dict = { - "Wrists":"Wrists", - "Earrings":"Earring", - "Neck":"Neck", - "RingL":"Rings", - "RingR":"Rings", - "Legs":"Legs", - "Head":"Head", - "Feet":"Feet", - "Hands":"Hands", - "Body":"Body", - } - - prop_textools_subfolder_char_dict ={ - "Body":"Character\Body", - "Face":"Character\Face", - "Hair":"Character\Hair", - "Tail":"Character\Tail", - "Ears":"Character\Ear", - "EquipmentDecal":"Character\Equipment Decals", - "FacePaint":"Character\Face Paint", - } - - #if MaterialType in ['b','f','h','t','z'] - #then point to the Chracter folder - - #if MaterialType in ['e','a'] - #then point to the equipment folder - - - if root_folder_path and os.path.exists(root_folder_path): - if ModelType in textools_subfolder_gear_dict and MaterialType in ['e','a']: - ModelType_subfolder = textools_subfolder_gear_dict[ModelType] - - elif ModelType in prop_textools_subfolder_char_dict and MaterialType in ['b','f','h','t','z']: - ModelType_subfolder = prop_textools_subfolder_char_dict[ModelType] - - else: - ModelType_subfolder = "" # Set it to an empty string if not found - - def find_target_file(folder_path, target_filename): - for root, dirs, files in os.walk(folder_path): - if target_filename in files: - return os.path.abspath(root) - return None - - - # Ensure ModelType_subfolder is a string before using it in os.path.join - if not isinstance(ModelType_subfolder, str): - ModelType_subfolder = str(ModelType_subfolder) - - #print(f"({root_folder_path}, {ModelType_subfolder})") - subfolder_path = os.path.join(root_folder_path, ModelType_subfolder) - - #print(subfolder_path) - if os.path.exists(subfolder_path): - target_folder_path = find_target_file(subfolder_path, target_filename) - - - #if target_folder_path: - # print("Target Folder:", target_folder_path) - #else: - # print(f"Filename {target_filename} not found in folder {subfolder_path}.") - - return target_folder_path - - @@ -510,43 +404,3 @@ def execute(self, context): return {'FINISHED'} - -@register_wrap -class SelectTexToolsSavedFolder(bpy.types.Operator,ImportHelper): - """User can select the folder for materials""" - bl_idname = "ffxiv_mmd.select_textools_saved_folder" - bl_label = "Accept" - bl_options = {'REGISTER', 'UNDO'} - - # Filter folders only - filename_ext = "" - filter_folder = True - filter_file = False - filter_glob: bpy.props.StringProperty(default="", options={'HIDDEN'}) - - bpy.types.Scene.textools_saved_folder = bpy.props.StringProperty( - name="TexTools 'Saved' Folder" - , description="Folder where FFXIV TexTools stores it's texture files" - , default='' - , maxlen=0, update=None, get=None, set=None) - - def invoke(self, context, event): - - self.filepath = context.scene.textools_saved_folder - - context.window_manager.fileselect_add(self) - return {'RUNNING_MODAL'} - - - def execute(self, context): - context.scene.textools_saved_folder = bpy.path.abspath(self.filepath) - - #addon_prefs_textools_folder = context.preferences.addons['ffxiv_mmd_tools_helper'].preferences.textools_saved_folder - #print(addon_prefs_textools_folder) - - # Use the default folder from the addon preferences - #default_folder = addon_prefs_textools_folder - - - return {'FINISHED'} - \ No newline at end of file diff --git a/ffxiv_mmd_tools_helper/panels.py b/ffxiv_mmd_tools_helper/panels.py index 78cf85a..efd0923 100644 --- a/ffxiv_mmd_tools_helper/panels.py +++ b/ffxiv_mmd_tools_helper/panels.py @@ -38,12 +38,6 @@ def draw(self, context): #row.operator_context = 'INVOKE_DEFAULT' row.operator('mmd_tools.convert_to_mmd_model', text='Initialize MMD Struture', icon='ARMATURE_DATA') - row = layout.row() - row.label(text="TexTools 'Saved' Folder:") - row = layout.row(align=True) - row.prop(context.scene,"textools_saved_folder", text = "") - row.operator("ffxiv_mmd.select_textools_saved_folder", text='', icon='FILE_FOLDER') - #row.operator("ffxiv_mmd.textools_saved_folder", text="Select TexTools 'Saved' Folder") row = layout.row() row.label(text="Anamnesis .chara File:") diff --git a/ffxiv_mmd_tools_helper/panels_retargeting_addon.py b/ffxiv_mmd_tools_helper/panels_retargeting_addon.py new file mode 100644 index 0000000..a0c8b3b --- /dev/null +++ b/ffxiv_mmd_tools_helper/panels_retargeting_addon.py @@ -0,0 +1,128 @@ +import bpy +from . import register_wrap +from . import model +from . import bone_retargeting_addon + + + +@register_wrap +class ART_BoneMapping_MTH(bpy.types.Panel): + bl_idname = "OBJECT_PT_ART_BoneMapping_MTH" + bl_label = "FFXIV MMD - Add Bone Mapping" + bl_space_type = "VIEW_3D" + bl_region_type = "TOOLS" if bpy.app.version < (2,80,0) else "UI" + bl_category = "Retargeting" + bl_options = {'DEFAULT_CLOSED'} + bl_order = 2 + + def draw(self, context): + active_obj = context.active_object + + layout = self.layout + + if bone_retargeting_addon.is_addon_installed() == False: + row = layout.row() + row.label(text = 'Animation Regargeting v2.1.0 or higher required') + else: + if bone_retargeting_addon.is_source_and_target_mapped(active_obj) == False: + row = layout.row() + row.label(text = 'Select source & target armature') + else: + row = layout.row() + row.operator("ffxiv_mmd.art_add_bone_mapping", text="CLEAR THE MAPPING LIST").bone_group='clear_mapping' + """ + row = layout.row() + row.label(text = 'Generic TDA MMD Model') + row = layout.row() + grid = row.grid_flow(columns=4,align=True) + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Body").bone_group='body' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Eyes").bone_group='eye' + + row = layout.row() + row.label(text = 'Kaito MMD Model') + row = layout.row() + grid = row.grid_flow(columns=5,align=True) + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Body").bone_group='body' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Eyes").bone_group='eye' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Skirt").bone_group='skirt' + + row = layout.row() + row.label(text = 'FFXIV (converted) MMD Model') + row = layout.row() + grid = row.grid_flow(columns=3,align=True) + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="ALL!").bone_group='all_verbatim' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Body").bone_group='body' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Breasts").bone_group='breast' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Mouth").bone_group='mouth' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Eyes").bone_group='eye' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Eyelids").bone_group='eyelid' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Eyebrows").bone_group='eyebrow' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Skirt").bone_group='skirt' + """ + row = layout.row() + row.label(text = 'Pick body part for mapping') + row = layout.row() + row.label(text = 'Should work on MMD(Kaito w/Skirt),FFXIV(converted),FFXIV') + row = layout.row() + grid = row.grid_flow(columns=3,align=True) + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="ALL!").bone_group='all_verbatim' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Body").bone_group='body' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Breasts").bone_group='breast' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Mouth").bone_group='mouth' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Eyes").bone_group='eye' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Eyelids").bone_group='eyelid' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Eyebrows").bone_group='eyebrow' + grid.operator("ffxiv_mmd.art_add_bone_mapping", text="Skirt").bone_group='skirt' + + + + + +@register_wrap +class ART_RestPosition_MTH(bpy.types.Panel): + bl_idname = "OBJECT_PT_ART_BoneMapping__MTH" + bl_label = "FFXIV MMD - Rest Position Adjustments" + bl_space_type = "VIEW_3D" + bl_region_type = "TOOLS" if bpy.app.version < (2,80,0) else "UI" + bl_category = "Retargeting" + bl_options = {'DEFAULT_CLOSED'} + bl_order = 3 + + def draw(self, context): + active_obj = context.active_object + + layout = self.layout + + if bone_retargeting_addon.is_addon_installed() == False: + row = layout.row() + row.label(text = 'Animation Regargeting v2.1.0 or higher required') + else: + if bone_retargeting_addon.is_source_and_target_mapped(active_obj) == False: + row = layout.row() + row.label(text = 'Select source & target armature') + else: + layout = self.layout + row = layout.row() + row.label(text = 'Reset Armature Pose (location & rotation)') + row = layout.row() + grid = row.grid_flow(columns=2,align=True) + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Target Armature").bone_group='clear_mapping_target' + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Source Armature").bone_group='clear_mapping_source' + + + row = layout.row() + row.label(text = 'Apply Rotation To Target') + row = layout.row() + grid = row.grid_flow(columns=4,align=True) + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Upper Arms").bone_group='upperarm' + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Forearms").bone_group='forearm' + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Wrists").bone_group='wrist' + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Hands").bone_group='hand' + row = layout.row() + grid = row.grid_flow(columns=4,align=True) + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Upper Legs").bone_group='upperleg' + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Lower Legs").bone_group='lowerleg' + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Feet").bone_group='feet' + grid.operator("ffxiv_mmd.art_apply_bone_rotation_to_target", text="Toes").bone_group='toe' + row = layout.row() + row.prop(context.scene,"art_reset_rot_if_no_match",text='Reset Rotation On Target Bone if Source Bone Not Found')