Maya Script Python スキニングウェイト情報のコピペ

import maya.cmds as cmds

oJnt2 = []
oSel = cmds.ls( sl= 1, o= 1 )[0]
oSkt = cmds.listHistory( oSel )
oCls = cmds.ls( oSkt, type= "skinCluster" )[0]
oVtx = cmds.filterExpand( sm= 31 )[0]
oJnt = cmds.skinPercent( oCls, oVtx, query= 1, ib= 0, transform= None )
for oJ in oJnt :
	if oJ.find("|") != -1 :
		oJ = oJ.rsplit("|",1)[1]
	oJnt2.append( oJ )
oWei = cmds.skinPercent( oCls, oVtx, query= 1, ib= 0, value= 1 )
oDic = dict( zip( oJnt2, oWei ) )
print "{0:-^60}".format( "CopyWeight" )
for k, v in oDic.items() :
	print "{0:_<30}{1:_>30}".format( k, v )
print "\n\n"
import maya.cmds as cmds

print "{0:-^60}".format( "PasteWeight" )
for k, v in oDic.items() :
	print "{0:_<30}{1:_>30}".format( k, v )
print "\n"
oSel2 = cmds.ls( sl= 1, o= 1, fl= 1 )
oVtx2 = cmds.filterExpand( sm= 31 )
for s in oSel2 :
	oSkt2 = cmds.listHistory( s )
	oCls2 = cmds.ls( oSkt2, type= "skinCluster" )[0]
	for v in oVtx2 :
		if v.split( "." )[0] == "".join( s.split( "Shape" ) ) :
			print "{0}".format( v )
			cmds.skinPercent( oCls2, v, nrm= 0 , transformValue= ( oDic.items() ) )
print "\n\n"

上のコードがコピーで下のコードがペーストです。
2011か2012からか、標準機能でコピペは出来ます。
しかし、複数のターゲットにペースト出来なかったり(確か?記憶が定かではありません)、別オブジェクトにペースト出来なかったり(これは確かです、かな?)しました。
なので、人様が作ったスクリプトに頼っておりましたが、それも改造しなければ使えなかった様に思います。
なので、作りました。

 
頂点を選択し上のスクリプトを実行します。複数の頂点が選ばれていてもひとつの頂点の情報しか読み取りません。
そして、複数のオブジェクトや頂点を選択し、下のスクリプトを実行します。スクリプトエディタにリザルトが表示されるようになっているので、その部分を消しても使うことはできます。

 

惜しいことに、Pythonの場合グローバルの関数というものが無いため、関数化には至りませんでした。
Pickle化して、StringIOでメモリに格納。という手段も考えたのですが、StringIOで詰まりました。

今回からmayamelをインポートしなくても使えるようなスキンクラスタの取得の仕方に変更しました。
後は意味なさそうですが、同じ骨構造のシーンを読んで、jointの名前に親のジョイント名が付属されてしまう場合でも正しく動作するようにしました。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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