工具方案分享_修复破面蒙皮模型

  • 带有蒙皮信息的坏面模型修复方法,以及脚本方案

  • 最终要达到的效果:
    • 保持蒙皮信息,将模型缝合,包括UV

  • 破面模型 一般来至于 反编译的模型资源
    • 例如从一些游戏里解包出来的模型还原到FBX,在导入到3dsMax或Maya后出现坏面

  • 或者有时候也出现在模型转换的时候

1,手动修复

  • 主要用到2个工具:Snapshot / SkinWrap

  • 1,对坏面模型执行Snapshot操作

    • Snapshot其实就是将当前的模型复制了一份,不带Skin,在此可以自由的对模型进行修改
    • 在此阶段,对模型进行面的缝合,UV的缝合,重设模型法线,赋予光滑组

  • 2,在新的模型上使用SkinWrapper修改器,套用原始的Skin模型,将原有的蒙皮信息还原回来

  • 生成出新的Skin之后,将SkinWrap修改器删除

  • 3,删除旧的坏面模型

2,使用Maxscript 将以上步骤变成 一键工具

(
    -- 指定坏面的模型
    brokenMesh = $

    -- Snapshot当前模型
    newMesh =  snapshot brokenMesh

    -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    -- XFrom
    ResetXForm newMesh 

    -- 焊点操作,后面的0.0001是容差值
    meshop.weldVertsByThreshold newMesh #{1..(meshop.getNumVerts newMesh)} (0.0001)

    -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    -- 合并UV
    -- 有点小麻烦,需要开启UVEditor
    setCommandPanelTaskMode #modify  -- 设置到修改面板
    select newMesh                        

    -- 添加一个UV修改器
    addModifier newMesh (Unwrap_UVW())

    -- 开启UVEditor
    newMesh.modifiers[#Unwrap_UVW].edit()
    newMesh.modifiers[#Unwrap_UVW].setTVSubObjectMode 1

    -- 选择所有的UV
    max select all

    -- 更新UVEditor面板
    newMesh.modifiers[#Unwrap_UVW].updateMenuBar()

    -- 进行合并操作
    newMesh.modifiers[#Unwrap_UVW].setWeldThreshold (0.0001)
    newMesh.modifiers[#Unwrap_UVW].weldSelected()

    -- 退出UVEditor 
    deselect newMesh

    -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    -- 为模型重新设置光滑组

    -- EditNormal修改器
    local en = Edit_Normals()
    addModifier newMesh en
    en.Reset()

    -- Smooth修改器
    local sm = smooth autosmooth:true threshold:180
    addModifier newMesh sm

    -- 可选:塌陷以上修改器
    collapseStack newMesh 

    -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    -- 赋予SkinWrap修改器,将旧模型作为目标传入
    local sw = Skin_Wrap meshList:#(brokenMesh) engine:0 name:"SkinWrap"
    addModifier newMesh sw

    -- 转换成新的Skin修改器
    setCommandPanelTaskMode #modify 
    select newMesh
    sw.weightAllVerts = true
    sw.ConvertToSkin true

    -- 删除SkinWrap修改器
    deleteModifier newMesh sw

    -- 退出选择
    deselect newMesh

    -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    -- 删除掉原始模型
    delete brokenMesh

)


3,与此类似问题

  • 合并同一骨架下的多个蒙皮模型,以及分割一个蒙皮模型成为使用当前骨架的多个模型,做法都是一样的

发表评论

电子邮件地址不会被公开。 必填项已用*标注