本文描述部分来源于 TAZORN,最后附上Python实现
步骤1,将原有模型Snapshot一份,添加Skin,赋予新的骨架
步骤2,导出原有模型的蒙皮信息
选择原始的蒙皮模型,导出蒙皮信息
需要用到SkinUtilities (默认在Utilties的More… 里面)
点ExtractSkinDataToMesh,会导出一个前缀 为 SkinData_ 的模型,里面记录着蒙皮信息
步骤3,通过SkinUtilities转换蒙皮信息
将新旧蒙皮模型对齐
点OK完成蒙皮信息转换
整个操作实现并不难
1,Snapshot原始模型,添加 Skin修改器,添加新的一套骨架
2,通过SkinUtilities 来导出原始模型蒙皮数据,然后与通过骨骼对应将蒙皮信息转换到新模型上
3,最后删除旧模型以及临时数据
蒙皮转换的入手点是 skinUtils 这个接口
showinterface skinUtils
会用到的函数其实就是导出 和导入,和手动操作中的一样
可以看到 导入函数带有一个 ImportSkinDataNoDialog,不显示窗口的调用
所以整个实现过程 稍有麻烦的地方在于骨骼名称的 匹配上,但是在工具中有一个自动匹配的功能
就是说如果两套骨架中的 骨骼名称相同,可以自动进行匹配,免去手动指定的麻烦
def copy_skin(object_node, prefix, suffix):
"""
Args:
object_node:
prefix:
suffix
Returns:
"""
skin_modifier = object_node.modifiers[rt.name('skin')]
rt.modPanel.setCurrentObject(skin_modifier)
if not skin_modifier:
print('Current Object has No Skin Modifier')
return
skinned_bone_count = rt.skinOps.GetNumberBones(skin_modifier)
bone_name_lst = [(i + 1, rt.skinOps.GetBoneName(skin_modifier, i + 1, 0))
for i in range(skinned_bone_count)]
# extract skin weight mesh
rt.skinUtils.ExtractSkinData(object_node)
skin_mesh_name = 'SkinData_' + object_node.name
skin_mesh_node = rt.getNodeByName(skin_mesh_name)
# remove all bone in current skin modifier
n = rt.skinOps.GetNumberBones(skin_modifier)
while n > 0:
rt.skinOps.SelectBone(skin_modifier, 1)
rt.skinOps.removeBone(skin_modifier, 1)
n = n - 1
# add custom bone and copy weight
custom_bone_lst = list()
for bone_index, bone_name in bone_name_lst:
custom_bone_name = prefix + bone_name + suffix
custom_bone_node = rt.getNodeByName(custom_bone_name)
custom_bone_lst.append(custom_bone_node)
custom_bone_node.name = bone_name
rt.skinOps.addBone(skin_modifier, custom_bone_node, bone_index)
rt.select(object_node)
rt.selectMore(skin_mesh_node)
rt.skinUtils.ImportSkinDataNoDialog(True, False, False, False, False,
1.0, 0)
# recover bone_name
for custom_bone_node in custom_bone_lst:
custom_bone_node.name = prefix + custom_bone_node.name + suffix
# remove skin data mesh
rt.delete(skin_mesh_node)