需求:

先将多个物体加蒙皮刷权重,再将多个物体附加成一个

方法:

使用脚本

原地址:https://polycount.com/discussion/162400/attaching-separate-meshes-and-retain-skinning-data-help-3dsmax-but-open-to-other-software

将代码复制保存为.ms文件,然后拖到3dmax中。

(rollout SkinCombineTool "Skin Combiner"(button btnCombineSkin "Combine Skin" align:#center width:120button btnDetachSkin "Detach Skin" align:#center width:120--button combineSkinHelp "?" align:#centerlocal createms--STORING FUNCTIONS WILL MAKE THEM FASTER IN LOOPSlocal p_getNumFaces = polyop.getNumFaceslocal p_getElementsUsingFace = polyop.getElementsUsingFacelocal p_getVertsUsingFace = polyop.getVertsUsingFacelocal p_deleteFaces = polyop.deleteFaceslocal m_cloneNodes = maxOps.cloneNodeslocal GetVertexWeightCount = skinOps.GetVertexWeightCountlocal GetVertexWeight = skinOps.GetVertexWeightlocal GetVertexWeightBoneID = skinOps.GetVertexWeightBoneIDlocal GetNumberVertices = skinOps.GetNumberVerticeslocal ReplaceVertexWeights = skinOps.ReplaceVertexWeightslocal SelectVertices = skinOps.SelectVerticeslocal BakeSelectedVerts = skinOps.bakeSelectedVertslocal RemoveZeroWeights = skinOps.RemoveZeroWeightslocal isWeightToolOpen = skinOps.isWeightToolOpenlocal closeWeightTool = skinOps.closeWeightToollocal GetBoneName =skinOps.GetBoneNamelocal GetNumberBones = skinOps.GetNumberBoneslocal addbone = skinOps.addbonelocal invalidate = skinOps.invalidate--GETS ALL THE ELEMENTS IN AN OBJECT, RETURNS AN ARRAY of BITARRAYS--GETS THE INVERSE ELEMENTS, TO MAKE IT EASIER TO DELETE THE REST OF THE ELEMENTSfn getAllElements obj =(local faceArray,liveArray,elementList,faceCountelementList = #()faceCount = p_getNumFaces objfaceArray = #{1..faceCount}liveArray = #{1..faceCount}while not liveArray.isEmpty do(currentArray = liveArray as arraynewElement = p_getElementsUsingFace obj (currentArray[currentArray.count])append elementList (faceArray-newElement)liveArray = liveArray - newElement--format "LiveArray: %\n\tnewElement: %\n" liveArray newElement)elementList)fn detachElementsWithSkin obj =(elementsArray = getAllElements obj--BAKE AND REMOVE ZERO WEIGHTS ON THE SKINobjSkin = obj.skinmodPanel.setCurrentObject objSkinSelectVertices objSkin (GetNumberVertices objSkin)bakeSelectedVerts objSkinobjSkin.clearZeroLimit = 0.0RemoveZeroWeights objSkin--CREATE A BIT ARRAY TO INVERT FOR THE VERTICESfaceCount = p_getNumFaces objfaceArray = #{1..faceCount}--STORE THE VERTEX WEIGHTSvertWeightsArray = #()for ele in elementsArray do(verts = p_getVertsUsingFace obj (faceArray - ele)vertsEle = #()for v in verts do(weights = #()_bones = #()wc = GetVertexWeightCount objSkin vfor b = 1 to wc do(append weights (GetVertexWeight objSkin v b)append _bones (GetVertexWeightBoneID objSkin v b))--format "Bones: %\nWeigths: %\n" _bones weightsappend vertsEle #(_bones,weights))append vertWeightsArray vertsEle)--format "%\n" vertWeightsArray--CLONE AND FIX THE SKIN WEIGHTSfor i = 1 to elementsArray.count do(--DUPE THE OBJECTm_cloneNodes obj newNodes:&newObjsp_deleteFaces newObjs[1] elementsArray[i]newObjSkin = newObjs[1].skinmodPanel.setCurrentObject newObjSkin--LOAD THE VERTEX WEIGHTSvCount = (GetNumberVertices newObjSkin)--print vCountfor v = 1 to vCount do(ReplaceVertexWeights newObjSkin v vertWeightsArray[i][v][1] vertWeightsArray[i][v][2]--format "Skin: %\nV: %\nWeights: %\nBones: %\n" newObjSkin v vertWeightsArray[i][v][1] vertWeightsArray[i][v][2]))delete obj)fn combineSkin = (clearlistener()max modify mode--INIT SOME VARIABLESlocal proceed = truelocal selObjs = getCurrentSelection()local selCount = selObjs.count--BONENAMEARRAYlocal NameArray = #()--ERROR CHECKif selection.count <= 1 do proceed = falsefor obj in selObjs while proceed == true do(if not isProperty obj #skin do(proceed = false))if proceed do(--SAVE WEIGHTScreatems = "" as stringstreamlocal totalVerts = 0for obj in selObjs do(modPanel.setCurrentObject obj.skinif InstanceMgr.CanMakeModifiersUnique obj obj.skin do(InstanceMgr.MakeModifiersUnique obj obj.skin #individualinvalidate obj.skin)local sk = obj.skinmodPanel.setCurrentObject sklocal bCount = GetNumberBones skfor b = 1 to bCount do(appendifUnique NameArray (GetBoneName sk b 1))sort NameArrayskinCount = GetNumberVertices sksk.clearZeroLimit = 0.0RemoveZeroWeights skfor v = 1 to skinCount do(weights = #()_bones = #()weightCount = GetVertexWeightCount sk vfor b = 1 to weightCount do(weight = GetVertexWeight sk v b_boneID = GetVertexWeightBoneID sk v b_bone = GetBoneName sk _boneID 1--_bone = "$'" + _bone + "'"    if weight != 0 do(append weights weightappend _bones _bone))--ADDING TOTAL VERTS MODIFIES THE VERTEX NUMBERS AS WE SAVEformat "%\n%\n%\n" (v+totalVerts) weights _bones to:createms)totalVerts += skinCount)--COMBINE OBJECTS, VERT ORDER SHOULD CORESPOND TO SELECTION ORDERconvertTo selObjs Editable_Polylocal newObj = selObjs[1]select newObjfor obj in selObjs where obj != newObj do(newObj.EditablePoly.attach obj newObj)--ADD A NEW SKIN MODlocal newSkin = Skin()addmodifier newObj newSkinnewSkin.filter_cross_sections = offnewSkin.filter_vertices = onnewSkin.showNoEnvelopes = onnewSkin.wt_showGlobal = onnewSkin.wt_activeVertexSet = 1newSkin.wt_showAffectedBones = onfor i = 1 to NameArray.count do(addbone newSkin (getNodeByName NameArray[i]) 1)completeredraw()--GO TO THE BEGINING OF THE STREAM STREAM, AND COLLECT THE BONESseek createms 0--LOAD THE WEIGHTSwhile not eof createms do(boneIDarray = #()a = execute(readline createms)b = execute(readline createms)c = execute(readline createms)local bCount = c.countfor i = 1 to bCount do(local BoneID = findItem NameArray c[i]if BoneID != 0 do(append boneIDarray BoneID))ReplaceVertexWeights newSkin a boneIDarray b)--ns = newScript()--format "%\n" (createms as string) to:ns))on combineSkinHelp pressed do messagebox  "Select several skinned meshes and this tool will combine them into one object and skin modifier." Title:"Help"on btnCombineSkin pressed do(--windows.sendmessage (windows.getmaxhwnd()) 0x000B 0 1--t = timeStamp()try(combineSkin())catch(format "\%n" (getcurrentexception()))--format "%\n" (t-timeStamp())--windows.sendmessage (windows.getmaxhwnd()) 0x000B 1 1)on btnDetachSkin pressed do(escapeEnable = trueclearListener()holdMaxFile()processObjs = getCurrentSelection()windows.sendmessage (windows.getmaxhwnd()) 0x000B 0 1--ts = timeStamp()for obj in processObjs do with redraw off(try(detachElementsWithSkin obj)catch(format "Object: % failed to process. Could be frozen or hidden.\n" obj.name))--format "%\n" (timeStamp()-ts)clearselection()windows.sendmessage (windows.getmaxhwnd()) 0x000B 1 1))createDialog SkinCombineTool
)

3dMax先蒙皮刷权重,再附加合并相关推荐

  1. MAX24——3Dmax中出现蒙皮封套权重失效解决办法

    今天做动作偶然间遇到了一个问题.上午做的腰部蒙皮,权重可以用笔刷也可以用权重工具调整,但是下午刷完四肢后,腰部权重乱了,并且点击权重工具无法重新增减权重数据.如下图 重启电脑跟max都无法解决. 最后 ...

  2. maya刷权重时有个叉_为什么maya刷权重 笔刷是打叉

    为什么maya刷权重 笔刷是打叉 没有权重的物体使用权重笔刷就是个"叉",很显然,你可能不小心把这块地方的权重删除了,也很可能是因为你清除了这部分的历史导致的 Maya蒙皮以后刷权 ...

  3. Maya角色绑定、蒙皮、权重技巧

    首先选择模型.骨骼的根节点,通过菜单Skin > Bind Skin □ 进行绑定(Maya2019好像只有Smooth bind,没有Rigid bind?),成功绑定之后骨骼会有颜色标识 这 ...

  4. maya刷权重时有个叉_maya刷权重

    建议刷骨骼权重时先将paint operation绘画操作方式改成替代的方式Replace,然后将Value改为0,将每节骨骼都刷成黑色,也就是都不控制(以免权重控制其他地方一些没注意到的地方).然后 ...

  5. Blender图解教程:刷权重技巧大全

    Blender 2.8+ 文章目录 技巧1:平面着色 技巧2:利用遮罩避免误操作 技巧3:切换到编辑模式下选择顶点 技巧4:通过动画关键帧快速切换角色姿态 技巧5:快速选择骨骼的方法 技巧6:自动规格 ...

  6. maya刷权重时有个叉_Maya权重如何刷取

    Autodesk Maya是美国Autodesk公司出品的世界顶级的三维动画软件,应用对象是专业的影视广告,角色动画,电影特技等.相信大伙都知道的,Maya软件里刷权重是个特别实用的环节,能让动画里物 ...

  7. maya刷权重时有个叉_Maya怎么刷权重 修改权重方法详解

    Autodesk Maya是美国Autodesk公司出品的世界顶级的三维动画软件,应用对象是专业的影视广告,角色动画,电影特技等.相信大伙都知道的,Maya软件里刷权重是个特别实用的环节,能让动画里物 ...

  8. maya刷权重时有个叉_maya怎么为蘑菇刷权重?

    每次家里的小朋友在看动画片时,总会好奇的问道,这个人物是真的有吗?他们是怎么做的?为什么他们跑的那么快.跳的那么高.今天小薰要通过使用Maya为蘑菇刷权重来讲解,他们是怎么做的其中一个重要的小环节.在 ...

  9. maya刷权重时有个叉_MAYA如何刷权重,求详细过程,当然,教程也可,

    摘要: Maya刷人体权重有什么技巧啊?一点小经验.嘿.1,常用编辑器.window菜单下第一个命令.之后把选项卡选到柔性绑定那个栏.再框选你要查看的点,这个栏里就会显示出这些点受骨骼影响... Ma ...

最新文章

  1. 爬取了 48048 条评论数据,解读 9.3 分的《毒液》是否值得一看?
  2. linux后台运行命令,nohup
  3. 【极品手机推荐】安卓3G运存16G内存,相机1300+500,三星高画质显示J7109|J7108
  4. Wordpress不同页面显示不同小工具
  5. 答读者问:学历不高,要如何破局?
  6. 减一天 日期函数_excel日期函数:如何计算项目的开始和完成日期
  7. 雪城大学信息安全讲义 4.3~4.4
  8. pthread异步_异步管道的实现
  9. 关于idea链接oracle数据库出现IO 错误: Got minus one from a read call, connect lapse 1 ms., Authen
  10. Python函数的定义使用、return返回值、参数传递方式、结合字典列表循环的使用以及将函数存储在模块中
  11. htb:Starting Point
  12. Python AutoCAD 修改
  13. centos7 安装拼音输入法
  14. SD NAND Flash简介!
  15. 从信息泄露到权限后台
  16. 《卸甲笔记》-基础语法对比
  17. stable-baselines3学习之Logger
  18. 矩阵连乘——动态规划算法
  19. for_each 解读
  20. Rocket Pool 、InfStones 、Lido 三种质押服务浅析

热门文章

  1. Android屏幕点亮(常亮)及屏幕解锁和锁定
  2. baocms伪静态_最新BAOCMS 6.2本地O2O生活门户系统多城市完整版源码下载 贴吧圈子+缴费服务+政务活动+微信等...
  3. NumPy的实用函数整理之sliding_window_view
  4. 淘宝/天猫优惠券查询 API 返回值说明
  5. 阿里云服务器 通过JavaMail发送邮箱STMP问题( 25端口被禁用 使用SSL协议465端口
  6. 大数据框架-默认的端口号
  7. Ceva xm4 DSP开发心得(转)
  8. android setdata方法,Android intent.setData方法
  9. MakeCode图形化编程语言学习笔记:micro:bit编程练习题[图]
  10. php--------获取当前时间、时间戳