100 lines
4.8 KiB
Markdown
100 lines
4.8 KiB
Markdown
# 插件
|
||
- 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
|
||
- https://www.youtube.com/watch?v=HitTDDCfhJg&t=1s
|
||
- https://www.bilibili.com/video/BV1ex4y1g7DX/?spm_id_from=333.337.search-card.all.click&vd_source=d47c0bb42f9c72fd7d74562185cee290
|
||
- (收费)Blender Retargeting Tools 1.2:https://blendermarket.com/products/blender-retargeting-tools-1
|
||
|
||
# 调用
|
||
使用Rokoko与BetterFbx插件。这里因为需要规避Rokoko插件名带有“-”的问题,所以还需要安装Importlib库
|
||
```python
|
||
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)
|
||
``` |