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

分享:蒙皮坏面模型的修复方法以及脚本方案

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

  • 有时候也出现在模型格式转换的时候

null

null

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



1,手动修复

主要用到2个工具:Snapshot / SkinWrap
1,对坏面模型执行Snapshot操作


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

null


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

null

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


null

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,与此类似问题

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


作者:TAZORN

著作权归作者所有




【相关阅读】:


【上传发布插件】: