MayaScript Pythonでスキニングウェイトの四捨五入

RoundWeight

import maya.cmds as cmds
import maya.mel

def RoundWeight():
	oSel = cmds.ls( selection=True )
	oShp = oSel[0]

	gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' );
	oVcount = cmds.polyEvaluate( oShp, v=True )

	oSkt = "findRelatedSkinCluster " + oShp + ";"
	oCls = maya.mel.eval( oSkt )
	cmds.setAttr( oCls + ".normalizeWeights", 0 )
	oVtx = cmds.ls( oShp + ".vtx[*]", fl=True )
	cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Rounding...', maxValue=oVcount )

	for v in range( len( oVtx ) ) :
		oW2 = []
		oWei = cmds.skinPercent( oCls, oVtx[v], ib=0 ,query=True, value=True )
		oJnt = cmds.skinPercent( oCls, oVtx[v], ib=0 ,query=True, transform=None )
		for w in oWei :
			oW2.append( float( '%.3f' %w ) )
		oLst = zip( oJnt, oW2 )
		cmds.skinPercent( oCls, oVtx[v], nrm=False, pruneWeights=0.009, transformValue=( oLst ) )
		cmds.progressBar( gMainProgressBar, edit=True, step=1 )
	cmds.setAttr( oCls + ".normalizeWeights", 1 )
	cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )

紆余曲折、色々とやって見ましたが、最終的にこんな感じになりました。
これでいいのか分かりません。幾つかのモデルでテストして見ましたが、一応できているようです。
ただ、完璧にできないモデルもあるようなので、ご注意ください。
毎度のことですが、権利も責任も放棄します。勝手に改良してください。

 

このスクリプトで、実際にウェイトを丸めている部分は22行目です。
たったそれだけです。
fpformat、Decimal、roundと色々なものを試して見ましたが、結局ただの置き換えで済ませました。
今回分かったことは、四捨五入の時に、小数点以下二桁までの値が欲しい時は、三桁の値まで丸める必要がある。
ということでした。
このスクリプトで丸めても、スクリプトを使ってウェイトの値を取得すると、細かい値を取得できます。
恐らくどんなスクリプトを使っても出てきてしまうかと思います。
コンポーネントエディタで値を取得すると、15桁までしか表示されないので、それ以下の値が表示されないだけのようです。
思えばライトウェーブは0%から100%の整数でウェイトの設定をしておりました。
確かに細かい値は入力できませんが、ゲームではそのくらいで十分です。ゲームCGに対するライトウェーブの優位性を身をもって理解しました。

 

melでウェイトの丸めツールを公開している方もいらっしゃいますが、Maya2011ではskinPercentのフラグが追加され、
聞いた話ではウェイトのノーマライズも頂点単位からオブジェクト単位に変更されたようで、そのままでは使用できません。それらに手を加えると使用できるようになります。

 

因みにこのスクリプトの使用方法は、スクリプトをC:\Users\ ( USER ) \Documents\maya\scripts\に入れて
Mayaのスクリプトエディタを開き、入力タブを「Python」に変更し、

import RoundWeight
RoundWeight.RoundWeight()

と入力し、そのコマンドを全選択し、中ボタンドラッグでシェルフに登録するとアクセスできるようになります。
使用時は、オブジェクトを選択し、シェルフに登録した物をクリックしてください。

 

ついでに、このスクリプトでの丸めの計算の前に、幾つか計算を足すと更に精度が上がることが確認できました。
しかし、そこまでの精度を求めても仕方が無いし、その計算は自分が考えたものではないので付けるのをやめました。あしからず。

 

ところで、久しぶりにZBrushを触りました。
久しぶりだったので、感が鈍っていました。ツールの使い方は問題ないのですが、
形の作りが甘すぎる。やっていないので当たり前ですが、ちょっとショックです。
スクリプトばかりやっていないで、またZBrushを勉強し直そう。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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