4.8 KiB
4.8 KiB
插件
- Blender Animation Retargeting:https://github.com/Mwni/blender-animation-retargeting
- Rokoko Plugin:https://support.rokoko.com/hc/en-us/articles/12644862322321-Release-Notes-Blender-Plugin-1-4-1
- (收费)Blender Retargeting Tools 1.2:https://blendermarket.com/products/blender-retargeting-tools-1
调用
使用Rokoko与BetterFbx插件。这里因为需要规避Rokoko插件名带有“-”的问题,所以还需要安装Importlib库
import bpy
import os
import sys
import importlib
rokoko = importlib.import_module("rokoko-studio-live-blender-master")
from better_fbx import *
# 启动命令参数
'''
# blender --background test.blend --python mytest.py -- example args 123
cd /d D:/Program Files/Blender Foundation/Blender 3.3/
blender.exe --python C:/Users/BlueRose/Desktop/Retareting/Blender_AnimationRetarget.py -- C:/Users/BlueRose/Desktop/Retareting/Animations/MF_Run_Fwd.fbx C:/Users/BlueRose/Desktop/Retareting/Characters/SKM_Quinn.fbx C:/Users/BlueRose/Desktop/Retareting/Animations/ExportAnimation.fbx 0
# Blender后台启动并且执行Python
blender.exe --python C:/Users/BlueRose/Desktop/Retareting/Blender_AnimationRetarget.py --background --python-text -- C:/Users/BlueRose/Desktop/Retareting/Animations/MF_Run_Fwd.fbx C:/Users/BlueRose/Desktop/Retareting/Characters/SKM_Quinn.fbx C:/Users/BlueRose/Desktop/Retareting/Animations/ExportAnimation.fbx 0
# Python CMD 交互方式
blender.exe --python-console --background -- C:/Users/BlueRose/Desktop/Retareting/Animations/MF_Run_Fwd.fbx C:/Users/BlueRose/Desktop/Retareting/Characters/SKM_Quinn.fbx C:/Users/BlueRose/Desktop/Retareting/Animations/ExportAnimation.fbx 0
'''
# 读取输入路径
argv = sys.argv
argv = argv[argv.index("--") + 1:] # get all args after "--"
print(argv) # --> ['example', 'args', '123']
SourceAnimation = argv[0]
TargetSkeletalMesh = argv[1]
ExportAnimtion = argv[2]
bExportPreviewMesh = bool(int(argv[3]))
# SourceAnimation = "C:/Users/BlueRose/Desktop/Retareting/Animations/MM_Run_Fwd.fbx"
# TargetSkeletalMesh = "C:/Users/BlueRose/Desktop/Retareting/Characters/SKM_Quinn.fbx"
# ExportAnimtion = "C:/Users/BlueRose/Desktop/Retareting/Animations/ExportAnimation.fbx"
# bExportPreviewMesh = bool(int("0"))
# 清空场景
# bpy.ops.wm.read_factory_settings(use_empty=True)
bpy.ops.scene.new(type='EMPTY')
# for block in bpy.data.meshes:
# if block.users == 0:
# bpy.data.meshes.remove(block)
# for block in bpy.data.materials:
# if block.users == 0:
# bpy.data.materials.remove(block)
# for block in bpy.data.textures:
# if block.users == 0:
# bpy.data.textures.remove(block)
# for block in bpy.data.images:
# if block.users == 0:
# bpy.data.images.remove(block)
# 导入相关资产
bpy.ops.better_import.fbx(filepath=TargetSkeletalMesh,use_auto_bone_orientation=False,use_reset_mesh_origin=False,use_animation=False,use_detect_deform_bone=False,use_import_materials=False)
#bpy.ops.import_scene.fbx(filepath=TargetSkeletalMesh,use_anim=False)
TargetSeletctObjects = bpy.context.selected_objects
bpy.ops.object.select_all(action='DESELECT')
bpy.ops.better_import.fbx(filepath=SourceAnimation,use_auto_bone_orientation=False,use_reset_mesh_origin=False,use_animation=True,use_detect_deform_bone=False,use_import_materials=False)
#bpy.ops.import_scene.fbx(filepath=SourceAnimation,use_anim=True)
SourceSeletctObjects = bpy.context.selected_objects
# 使用插件重定向
for Object in SourceSeletctObjects:
if Object.type == "ARMATURE":
bpy.context.scene.rsl_retargeting_armature_source=Object
for Object in TargetSeletctObjects:
if Object.type == "ARMATURE":
bpy.context.scene.rsl_retargeting_armature_target=Object
# 构建Bone映射表 & 填充缺少的BoneName(假设使用相同的骨骼结构) & 移除root的映射
bpy.ops.rsl.build_bone_list()
for BoneItem in bpy.context.scene.rsl_retargeting_bone_list:
if BoneItem.bone_name_target == "":
BoneItem.bone_name_target = BoneItem.bone_name_source
continue
if BoneItem.bone_name_target == "root":
BoneItem.bone_name_target = ""
# 动画重定向
bpy.ops.rsl.retarget_animation()
# 输出
bpy.ops.object.select_all(action='DESELECT')
for Object in TargetSeletctObjects:
if bExportPreviewMesh or Object.type == "ARMATURE":
Object.select_set(True)
bpy.ops.better_export.fbx(filepath=ExportAnimtion,my_fbx_format="binary",use_selection=True,use_visible=True,use_only_root_empty_node=False)
# bpy.ops.export_scene.fbx(filepath=ExportAnimtion,use_selection=True,add_leaf_bones=False,object_types={"ARMATURE","MESH"},bake_anim_use_nla_strips=False,bake_anim_use_all_actions=False)