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が圧倒的に便利です。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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