Maya Script Pymel スキニングウェイトの四捨五入

from pymel.core import *
import maya.mel

def RoundWeight():

	oSel = selected()[0]
	gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' );
	oVcount = polyEvaluate( oSel, v=True )

	oCls = maya.mel.eval( 'findRelatedSkinCluster ' + oSel + ' ;' )
	setAttr( oCls + ".normalizeWeights", 0 )
	oVtx = ls( oSel + ".vtx[*]", fl=True )
	progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Rounding...', maxValue=oVcount )
	for v in range( len( oVtx ) ) :
		oW2 = []
		w2 = 1.0
		oWei = skinPercent( oCls, oVtx[v], ib=0 ,query=True, value=True )
		oJnt = skinPercent( oCls, oVtx[v], query=True, transform=None )
		while 0.0 in oWei: oWei.remove(0.0)
		for i,w in enumerate( oWei ) :
			w = float( '%.2f' %w )
			if i != (len(oWei) -1) :
				w2 -= w
				if w2 < 0:
					w = w + w2
			else :
				w = w2
			oW2.append( float( '%.2f' %w ) )
		oLst = zip( oJnt, oW2 )
		skinPercent( oCls, oVtx[v], nrm = False , pruneWeights=0.009, transformValue=( oLst ) )
		progressBar( gMainProgressBar, edit=True, step=1 )
	setAttr( oCls + ".normalizeWeights", 1 )
	progressBar( gMainProgressBar, edit=True, endProgress=True )

Pymelで書いて見ました。といっても、殆どその効用はありません。
ただ、それとは別に今回はきちんと動くようにしました。

 

元々melで書かれていたものを改めてみると、理解できなかった分岐が理解できるようになっていました。
その分岐があるから、一つの頂点のウェイトを合計して1になるのですね。勉強になりました。誠にありがとうございます。
進歩していないように思えても、少しは進歩しているようです。まだまだ先は程遠いいですが、、
もっとスマートな書き方があるかと思いますが、現状ではこのくらいしか出来ません。
使いやすいようにカスタマイズしてください。そしてできれば教えて下さい。

 

このスクリプトはオブジェクトを選択し、実行するとスムーススキニングの値を小数点以下二位までの桁で四捨五入してくれます。
float( ‘%.2f’ %w )の2を1に変更すれば多分小数点以下1位で四捨五入します。試しておりません。

 

いやー、しかし良かった。作ったものがきちんと動くと気持ちの良いものです。
ただ、殆ど人様が作ったものを参考にしているので、有難い限りです。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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