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というブログツールの仕業なのか、コードを表示するプラグインの仕業なのか分かりませんが、
投稿した記事を再度編集する時に、コード部分の表示がおかしくなります。すみません、気が付きませんでした。
しかも、元のコードがどこにあるのかわからないので、修正もできない。
基本的に小さいコードは取っておかないので、多分無いです。

 

ファイルに保存し、圧縮して貼り付ければ良いのですが、面倒くさいので大きなコードでない限りは嫌です。
もっともそんなに大したものがあるわけではないので、大した問題ではないだろう。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です