Maya Script Python スキニングウェイトのインポート、エクスポート 2
改造しました。
import maya.cmds as cmds import maya.mel def gkn_skin_weight_export(): oMeshs = cmds.filterExpand(sm=12) if oMeshs == None: return gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' ) oCount = len(oMeshs) if oCount == 1 :oCount = 2 cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Export...', maxValue=oCount ) for oMesh in oMeshs: oShapes = cmds.listHistory(oMesh) oShape = cmds.ls(oShapes,type="shape")[0] oCls = cmds.ls(oShapes,type="skinCluster") if oCls == []: cmds.progressBar( gMainProgressBar, edit=True, endProgress=True ) return oCls = oCls[0] oJoints = cmds.skinCluster(oCls,q=1,inf=1) oJoints = [ x.rsplit("|",1)[1] if x.find("|") != -1 else x for x in oJoints ] for oJoint in oJoints: if oJoints.count(oJoint) > 1: cmds.progressBar( gMainProgressBar, edit=True, endProgress=True ) cmds.error("Overlap["+oJoint+"]") oVtxs = cmds.ls(oMesh+".vtx[*]",fl=1) oFileName = cmds.workspace(q=1,fn=1)+r"/gksw" oFileName = r"//".join(oFileName.split("/",1)) cmds.sysFile(oFileName,md=1) oMesh = oMesh.rsplit("|",1)[1] if oMesh.find("|") != -1 else oMesh oFile = open(oFileName+"/"+oMesh+r".gkw", "w") cmds.progressBar( gMainProgressBar, edit=True, step=1 ) oJoints.append("\n") oJoints = ",".join(oJoints) oFile.writelines(oJoints) for oVtx in oVtxs: oWei = [ "{0:}".format(x) if x >= 0.0 else "0.0" for x in cmds.skinPercent(oCls,oVtx,q= 1,v= 1) ] oWei.append("\n") oWei = ",".join(oWei) oFile.writelines(oWei) oFile.close() cmds.progressBar( gMainProgressBar, edit=True, endProgress=True ) gkn_skin_weight_export()
エクスポートは殆ど変わっていません。重複するジョイントの判定が間違えていたので、正しました。
バグフィックスです。すみません。
import maya.cmds as cmds import maya.mel import glob def gkn_skin_weight_import(): oMeshs = cmds.filterExpand(sm=12) if oMeshs == None: return oCount = len(oMeshs) if oCount == 1 :oCount = 2 oFiles = glob.glob(cmds.workspace(q=1,fn=1)+r"/gksw/"+"*.gkw") if oFiles == []: return gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' ) cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Import...', maxValue=oCount ) oFiles = [x.split("\\")[1].split(".")[0] for x in oFiles] for oMesh in oMeshs: oMesh2 = oMesh.rsplit("|",1)[1] if oMesh.find("|") != -1 else oMesh if oMesh2 in oFiles: cmds.progressBar( gMainProgressBar, edit=True, step=1 ) oShapes = cmds.listHistory(oMesh) oShape = cmds.ls(oShapes,type="shape")[0] oCls = cmds.ls(oShapes,type="skinCluster") if oCls == []: cmds.progressBar( gMainProgressBar, edit=True, endProgress=True ) return oCls = oCls[0] cmds.setAttr(oCls+ ".normalizeWeights",0) cmds.setAttr(oCls+".envelope",0) oVtxs = cmds.ls(oMesh+".vtx[*]",fl=1) oFileName = cmds.workspace(q=1,fn=1)+r"/gksw" oFileName = r"//".join(oFileName.split("/",1)) oFile = open(oFileName+"/"+oMesh2+r".gkw", "r") oLines = oFile.readlines() oJoints = [x for x in oLines.pop(0).split()[0].split(",")if x!=""] oJnts = [ x.rsplit("|",1)[1] if x.find("|") != -1 else x for x in cmds.skinCluster(oCls,q=1,inf=1) ] for oJoint in oJoints: if oJoint not in oJnts: cmds.progressBar( gMainProgressBar, edit=True, endProgress=True ) cmds.error("Not Find["+oJoint+"]") if len(oVtxs) == len(oLines): cmds.skinPercent(oCls,oVtxs,tv= (zip(oJnts,[0.0]*len(oJnts)))) [cmds.skinPercent(oCls,oVtxs[i],zri= 1,r= 1,tv= d) for i,d in [[i,[[k,v] for k,v in dict(zip(oJoints,[float(x) for x in oLine.split(",")if x!="\n"])).items()if v!=0.0]] for i,oLine in enumerate(oLines)]] # for i,oLine in enumerate(oLines): # oDic = dict(zip(oJoints,[float(x) for x in oLine.split(",")if x!="\n"])) # oDic2 = {} # for k,v in oDic.items(): # if v != 0.0: # oDic2.update({k:v}) # cmds.skinPercent(oCls,oVtxs[i],zri= 1,r= 1,tv= (oDic2.items())) cmds.skinPercent(oCls,nrm=1) cmds.setAttr(oCls+".envelope",1) cmds.setAttr(oCls+ ".normalizeWeights",1) oFile.close() cmds.progressBar( gMainProgressBar, edit=True, endProgress=True ) gkn_skin_weight_import()
そして、インポート。
こちらが大きく変わりました。
インポートした「gkw」データに、重複するジョイント名が存在する場合、加算します。
要するに、ジョイントを削除したい時や、影響を無くしたい時、テキストエディタで「gkw」を編集してジョイント名を既存の別のジョイントに名前を変更すると、加算してくれます。
そして、少し高速化。
ゼロの値のウェイトを適用する時に、そのまま「transformValue」で設定するよりも、「zeroRemainingInfluences」フラグを使ったほうが
早いのではないか?
と思い、実験してみたところ、やはり早かった。
なので、その方法を採用しました。前回と同じで、コメントアウト部分がベタ書きです。
そういえば、さっき気が付きましたが、今まで記事に掲載したスクリプトで、一部記述がおかしくなっているものがありました。
使っているWordPressというブログツールの仕業なのか、コードを表示するプラグインの仕業なのか分かりませんが、
投稿した記事を再度編集する時に、コード部分の表示がおかしくなります。すみません、気が付きませんでした。
しかも、元のコードがどこにあるのかわからないので、修正もできない。
基本的に小さいコードは取っておかないので、多分無いです。
ファイルに保存し、圧縮して貼り付ければ良いのですが、面倒くさいので大きなコードでない限りは嫌です。
もっともそんなに大したものがあるわけではないので、大した問題ではないだろう。
コメントする
トラックバックする
トラックバック用URL: