Maya Script Python リスト内包表記でのウェイトの四捨五入
ついに完成しました。多分。
ポリゴンのエラー表示のスクリプトを前回作りましたが、よくよく見てみるとエラーのリスト表示もリスト内包表記で書けそうなことに気が付きました。
早速実装してみると、それなりに体感で速くなったような気がしました。
なので、前回のスクリプトを更新しました。
それである程度リスト内包表記の経験値が溜まったようで、
四捨五入のスクリプトを見てみると、これも書けるんじゃないか?と思い、書き始めました。
まぁ、どうせ無理だろう。と思っていたのですが、やってゆくうちにひとつひとつ確実にハードルを越え、
できそうで、できない。という状態を続けておりました。
それがようやく出来ました。
しかし、
それほど速くはない、、
5千ポリゴンくらいのモデルで0.何秒かのスピードアップです。もっと早くなると思ったのに、、
更にコードを見直し、記述を少なくしてみたのですが大して変わりません。
因みにこちらです。
import maya.cmds as cmds import maya.mel import math def round_weight(): gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' ) oSel = cmds.ls( selection=True ) oShp = oSel[0] oSkt = cmds.listHistory( oShp ) oCls = cmds.ls( oSkt, type= "skinCluster" )[0] oMxc = cmds.getAttr( oCls+".maxInfluences" ) oVtx = cmds.ls( oShp + ".vtx[*]", fl=True ) oVcount = len(oVtx) oRoundLen = 2 cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Rounding...', maxValue=oVcount ) [[cmds.progressBar(gMainProgressBar,e=1,s=1),cmds.skinPercent(oCls,v3,nrm=0,zri=1,tv=zip(*l2))] if sum(l2[1])==1.0 else [cmds.progressBar(gMainProgressBar,e=1,s=1),cmds.skinPercent(oCls,v3,nrm=0,zri=1,tv=zip(l2[0],[round(1.0-sum(l2[1][:-1]),oRoundLen) if i==len(l1)-1 else x for i,x in enumerate(l2[1])]))] for v3,l2 in [[v2,zip(*l1[-oMxc:])] if len(l1)>oMxc else [v2,zip(*l1)] for v2,l1 in [[v1,sorted(dict(zip(oJnt,oWei)).items(),key=lambda x:x[1])] for (v1,oWei,oJnt) in [[v,[round(w,oRoundLen) for w in cmds.skinPercent(oCls,v,q=1,v=1) if w>0.0],cmds.skinPercent(oCls,v,q=1,t= None)] for v in oVtx]]]] cmds.progressBar( gMainProgressBar, edit=True, endProgress=True ) round_weight()
全く読みにくい。
開発していた時の物とは違い、プログレシブバーを付けたり、色々と改行を加えたりしたので、動作は保証しません。
一応大丈夫のようでした。もう面倒くさいので、しばらく見直したくない。本当に読みにくい。
ここまで可読性を損なっても、大して変わらないならやめたほうがよさそうです。
しかし、色々と勉強になりました。
コメントする
トラックバックする
トラックバック用URL: