3dsmax 蒙皮替换骨架

需求

本文描述部分来源于 TAZORN,最后附上Python实现

  • 保留蒙皮信息,将骨骼替换成新的骨架
  • 模型M上的Skin目前指定的是骨架A,在蒙皮信息不变的情况 下更换成骨架B

在这里插入图片描述
替换的操作需要用到 SkinUtilities 工具


手动进行骨骼替换的方法

  1. Snapshot原有模型,添加新的Skin以及指定新的骨架,
  2. 从原蒙皮模型上 导出Skin信息(通过SkinUtilities工具导出)
  3. 选择 新的蒙皮模型 以及Skin信息,进行骨架匹配和转换

步骤1,将原有模型Snapshot一份,添加Skin,赋予新的骨架
在这里插入图片描述


步骤2,导出原有模型的蒙皮信息

选择原始的蒙皮模型,导出蒙皮信息

需要用到SkinUtilities (默认在Utilties的More… 里面)
在这里插入图片描述
点ExtractSkinDataToMesh,会导出一个前缀 为 SkinData_ 的模型,里面记录着蒙皮信息
在这里插入图片描述


步骤3,通过SkinUtilities转换蒙皮信息

  • 将新旧蒙皮模型对齐

  • 选择新的蒙皮模型 , 再选择前缀为 SkinData_ 的模型,执行 ImportSkinDataFromMesh
    在这里插入图片描述

  • 会出现一个对话框,用于匹配 原蒙皮的骨骼 对应 新蒙皮的骨骼,设置好对应的骨骼
    在这里插入图片描述

  • 使用 MatchByFace 匹配
    在这里插入图片描述

  • 点OK完成蒙皮信息转换


  • 之后就可以删除 原蒙皮模型,前缀SkinData_的模型,以及原骨架
  • 剩下的新的蒙皮模型,新的骨架
    在这里插入图片描述

Maxscript方案

整个操作实现并不难

1,Snapshot原始模型,添加 Skin修改器,添加新的一套骨架

2,通过SkinUtilities 来导出原始模型蒙皮数据,然后与通过骨骼对应将蒙皮信息转换到新模型上

3,最后删除旧模型以及临时数据

蒙皮转换的入手点是 skinUtils 这个接口

showinterface skinUtils

会用到的函数其实就是导出 和导入,和手动操作中的一样

可以看到 导入函数带有一个 ImportSkinDataNoDialog,不显示窗口的调用

所以整个实现过程 稍有麻烦的地方在于骨骼名称的 匹配上,但是在工具中有一个自动匹配的功能

就是说如果两套骨架中的 骨骼名称相同,可以自动进行匹配,免去手动指定的麻烦

在这里插入图片描述

Python 实现

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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
3ds Max是一款功能强大的三维建模和动画软件,对于人物建模和动画而言,蒙皮是一个非常重要的步骤。而蒙皮权重调整插件是为了帮助用户更方便地进行蒙皮权重的调整而开发的一个工具。 蒙皮是将3D模型和骨骼进行关联的过程,通过设置每个顶点对骨骼的影响程度来实现模型的动态效果。蒙皮权重调整插件的作用就是为用户提供一个友好的界面,以便更直观地调整每个顶点对骨骼的影响权重。 使用蒙皮权重调整插件可以简化手动调整权重的复杂过程。插件通常提供了包括画笔、选区和数值输入等工具,用户可以根据自己的需求选择合适的方式来调整权重。比如,如果用户想要调整某个顶点对某个骨骼的影响程度,可以通过在相关区域上使用画笔工具来增加或减少权重值。插件还会提供颜色图,帮助用户直观地了解每个顶点的权重分布情况。 蒙皮权重调整插件还可以与其他功能结合使用。比如,用户可以使用插件提供的自动权重调整功能,将自动计算出来的权重进行微调。插件还支持将权重从一个模型复制到另一个模型,或者从一个骨骼复制到另一个骨骼,以便在不同模型或骨骼之间重用权重信息。 总之,蒙皮权重调整插件是为了方便用户在3ds Max中进行人物建模和动画制作而开发的实用工具。它能够简化复杂的蒙皮权重调整过程,提高用户的工作效率,并且可以与其他功能结合使用,满足用户特定的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值