Maya Script Python – xシンメトリーのチェック
随分と更新が滞っておりました。
最近はめっきり3Dcoatでのペイントにハマっております。
知れば知るほど、素晴らしい。
出来ればレイヤー名の完全日本語対応と、レイヤーセットの対応をして貰いたいが、フォトショップのスクリプトで対応しよう。
で、本題です。
Mayaでモデルのシンメトリーをチェックする。というのを以前記事に書いたように思います。
MODOに持ってゆくほどでもなく、ある程度いい加減でもいいので手っ取り早く調べたい。
そんな需要があったので、作ってみました。
まずはpymel版
import pymel.core as pm import maya.cmds as cmds def sym_check(n = 3): oSel = pm.ls(sl=1) if not oSel: return if type(oSel[0]) != pm.nodetypes.Transform: return if oSel[0].getShape().type() != "mesh": return vtxs = oSel[0].verts pos = [(round(a,n),round(b,n),round(c,n)) for (a,b,c) in [x.getPosition() for x in vtxs]] pDic = dict(zip(pos,vtxs)) pm.select(cl=1) selVtx = [] [selVtx.append(v) for k,v in pDic.items() if not (-k[0],k[1],k[2]) in pDic] pm.select(selVtx) sym_check()
pymelなのに、Mayaコマンドをインポートしていますが、気になさらずに。
実行時に、
sym_check(2)
などと、整数の引数をつけることで、精度を調整出来ます。
やっていることは、選択されているメッシュノードの全ての頂点の位置と名前を辞書化しています。
位置をキーにするのがポイントです。
で、それらの頂点のうち、xの値だけが負の物を抽出し、適合しないものがあれば、それを選択する。
というだけのものです。
引数として設定する数字は、頂点位置の値を四捨五入するときに、小数点以下何桁で切るか、
という数字として使っています。デフォルトで「3」です。
そして、Mayaコマンド版
import pymel.core as pm import maya.cmds as cmds def sym_check(n = 3): oSel = pm.ls(sl=1) if not oSel: return if type(oSel[0]) != pm.nodetypes.Transform: return if oSel[0].getShape().type() != "mesh": return vtxs = cmds.ls(oSel[0].name()+".vtx[*]",fl=1) pos = [(round(a,n),round(b,n),round(c,n)) for (a,b,c) in [cmds.pointPosition(x,l=1) for x in vtxs]] pDic = dict(zip(pos,vtxs)) pm.select(cl=1) selVtx = [] [selVtx.append(v) for k,v in pDic.items() if not (-k[0],k[1],k[2]) in pDic] pm.select(selVtx) sym_check()
やはりこちらのほうが圧倒的に早い。
コンポーネントの操作や参照はMayaコマンドに任せるべきなのでしょう。
ノードの編集や参照はpymelが圧倒的に便利です。
コメントする
トラックバックする
トラックバック用URL: