Maya Script Python スキニングウェイトの四捨五入 その2
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( oSel, v=True ) oSkt = "findRelatedSkinCluster " + oShp + ";" oCls = maya.mel.eval( oSkt ) oMxc = cmds.getAttr( oCls+".maxInfluences" ) 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 ) ) : w2 = 0.0 oWei = cmds.skinPercent( oCls, oVtx[v], ib=0 ,query=True, value=True ) oJnt = cmds.skinPercent( oCls, oVtx[v], query=True, transform=None ) while 0.0 in oWei: oWei.remove(0.0) oDic = dict(zip(oJnt,oWei)) i = len(oDic) for j,w in sorted(oDic.items(), key=lambda x:x[1]) : if i > oMxc : w = 0.0 w = float( '%.2f' %w ) if i != 1 : w2 += w if w2 > 1.0: w = w2 - w else : w = 1.0 - w2 oDic[j] = float( '%.2f' %w ) i -= 1 cmds.skinPercent( oCls, oVtx[v], nrm = False , transformValue=( oDic.items() ) ) cmds.progressBar( gMainProgressBar, edit=True, step=1 ) cmds.setAttr( oCls + ".normalizeWeights", 1 ) cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
性懲りもなくまだやっております。
pymelの恩恵が殆ど無いため、Pythonに戻しました。
Pymelだと最初の読み込みに少し時間がかかるようです。一度読みこめば速度は変わらないのですが、
恩恵を預っているスクリプトでもないし、ということでPythonに書きなおしました。
しかし、相変わらず美しくないソースだ。全然Pythonらしくない。
本を買って勉強するべきか、迷っております。
一応新たな試みとして辞書を使って見ました。他の言語で言う連想配列というやつです。
そして、最も大きな試みとして行った修正があります。
melバージョンのスクリプトを使っていても思ったのですが、細かい値がどうも納得が行かない。
今回自分でそれを参考に作ってみて分かりました。
ウェイトの値の大きさに関係なく、頂点の順番で処理しているから細かいところで誤差が出るのだと思います。(憶測)
なので今回はジョイントのリストとその値のリストをディクショナリにまとめ、値を参照して小さい順にソートして処理をしております。(多分)
まだそれ程デバッグしたわけではないので、確信はありません。済みません。
もっと良い方法あるのかなぁ?
とりあえず今度の目標は、できるだけ処理を関数化して、内包表記を使って処理を早くしてみる事かと思っております。
いやぁー、そんな事している場合でもないなぁ、、
追記と修正2011/12/10
すみません、、まともにチェックしていませんでした。
以前のままだとインフルエンスの数を超えてしまう場合があります。
修正版ではインフルエンスの数を超えたものは小さいもの順に削除されるようになりました。
あと、チェックスクリプトも更新しておきます。こちらはもっとまともに動いていない、、
コメントする
トラックバックする
トラックバック用URL: