Maya Script Python リスト内包表記でのウェイトの四捨五入 その2
前回に引き続き、リスト内包表記をテストしてみました。
コードを見なおしているうちに、ここはもっとまとめられるのではないか?
という事に気が付き、色々といじくり回してみました。
大分すっきりしました。相変わらず可読性は低いです。
import maya.cmds as cmds import maya.mel import math def round_weight_test(): oSel = cmds.ls( selection=True ) oShp = oSel[0] gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' ) oVcount = cmds.polyEvaluate( oSel, v=True ) oSkt = cmds.listHistory( oShp ) oCls = cmds.ls( oSkt, type= "skinCluster" )[0] oMxc = cmds.getAttr( oCls+".maxInfluences" ) oVtx = cmds.ls( oShp + ".vtx[*]", fl=True ) oRoundLen = 2 cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Rounding...', maxValue=oVcount ) [[cmds.progressBar(gMainProgressBar,e=1,s=1),cmds.skinPercent(oCls,v1,nrm=0,zri=1,tv=zip(*l1))] if sum(l1[1])==1.0 else [cmds.progressBar(gMainProgressBar,e=1,s=1),cmds.skinPercent(oCls,v1,nrm=0,zri=1,tv=zip(l1[0],[round(1.0-sum(l1[1][:-1]),oRoundLen) if i==len(l1[1])-1 else x for i,x in enumerate(l1[1])]))] for (v1,l1) in [[v,zip(*sorted(dict(zip(cmds.skinPercent(oCls,v,q=1,t= None),[round(w,oRoundLen) for w in cmds.skinPercent(oCls,v,q=1,v=1) if w>0.0])).items(),key=lambda x:x[1])[-oMxc:])] for v in oVtx]] cmds.progressBar( gMainProgressBar, edit=True, endProgress=True ) round_weight_test()
しかし、驚いたことに、前回の物よりも実行速度が遅くなる、、
分岐を減らしたからだろうか?短くすれば良い。というものでもないようです。
ああ、悔しい。
ウェイトエディタを更新しました。
前回のままだと、恐らく一つのシーンに同一名のオブジェクトがあるとうまく機能しないかと思います。
一応機能するようにしましたが、四捨五入はできるだけオブジェクト単位でしたほうが良いかと思います。
何でMayaはオブジェクトがシェイプノードとトランスフォームノードにわかれているのだろうか。
名前が取得しにくいです。
オブジェクトとしての移動値とそれ以外。という感じなのでしょうか。扱いにくいなぁ、、
もっとスマートな方法があるのだろうか。
コメントする
トラックバックする
トラックバック用URL: