|
import os |
|
from glob import glob |
|
|
|
import bpy |
|
from tqdm import tqdm |
|
|
|
from utils import HiddenPrints, get_all_armature_obj, get_all_mesh_obj, load_file, remove_all, select_objs, update |
|
|
|
|
|
def rename_mixamo_bone(armature_obj): |
|
"""Replace name like 'mixamorig10:xxx' to 'mixamorig:xxx, so that character can be correctly animated.'""" |
|
import re |
|
|
|
pattern = re.compile(r"mixamorig[0-9]+:") |
|
for bone in armature_obj.data.bones: |
|
bone.name = re.sub(pattern, "mixamorig:", bone.name) |
|
return armature_obj |
|
|
|
|
|
if __name__ == "__main__": |
|
input_dir = "character_rabit" |
|
output_dir = "character_rabit_refined" |
|
os.makedirs(output_dir, exist_ok=True) |
|
character_list = sorted(glob(os.path.join(input_dir, "*.fbx"))) |
|
|
|
for file in tqdm(character_list, dynamic_ncols=True): |
|
with HiddenPrints(): |
|
remove_all() |
|
obj_list = load_file(file) |
|
assert len(get_all_armature_obj(obj_list)) == 1, "Armature number is not 1" |
|
bpy.ops.wm.save_as_mainfile(filepath="test.blend") |
|
|
|
select_objs(get_all_mesh_obj(obj_list), deselect_first=True) |
|
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) |
|
|
|
update() |
|
select_objs(obj_list, deselect_first=True) |
|
bpy.ops.export_scene.fbx( |
|
filepath=os.path.join(output_dir, os.path.basename(file)), |
|
check_existing=False, |
|
use_selection=True, |
|
use_triangles=True, |
|
add_leaf_bones=False, |
|
bake_anim=False, |
|
|
|
|
|
) |
|
|