Maya Script – 上向きのフェースを選択する

地形などのデータを作るときは、そのフェースが地面に適しているかを判定する必要があります。
ゲームデータの話です。
以前、そういったスクリプトを書いたのですが、ベクトルでの指定で、角度ではなかったので、角度指定が出来るように変更しました。

 

ただ、問題が、、
以前書いた時に汎用となる関数、の名前が「get_ploy_comp」でした、、
「l」と「o」が反対です。
よりによって、汎用的に使える関数でスペルミスをするとはなぁ、、と気づいて愕然としました。

 

なので、今回はちゃっかり直して、公開します。
以前のものは、直しません。

import pymel.core as pm
import maya.cmds as cmds
import maya.api.OpenMaya as om2

def get_poly_comp(flag = "vtx",*args):
	node = None
	
	flags = ["vtx","edge","face","uv","vtxFace"]
	sm = [31,32,34,35,70]
	kwArgs = ["tv","te","tf","tuv","tvf"]
	
	if flag not in flags:
		return -1
	
	kw = {x:{y:1} for x,y in zip(flags,kwArgs)}
	smKW = dict(zip(flags,sm))
	
	comp = cmds.filterExpand(cmds.polyListComponentConversion(*args,**kw[flag]),sm=smKW[flag],ex=1,fp=1)
	if comp:
		node = list(set([x.split(".",1)[0] for x in comp]))
	
	return node,comp

def select_yup_face_om2(val = 45.0):
	sel = cmds.ls(sl=1)
	node,comp = get_poly_comp("face",*sel)
	
	if not comp:
		return
	
	
	yUp = set()
	axis = om2.MVector(0,1,0)

	selList = om2.MGlobal.getActiveSelectionList()

	if not selList:
		return

	selObj = []
	for x in range(selList.length()):
		mDag = selList.getDagPath(x)
		
		if mDag.hasFn(om2.MFn.kMesh):
			selObj.append(om2.MFnMesh(mDag))

	if selObj:
		for s in selObj:
			for i in range(s.numPolygons):
				xyz = s.getPolygonNormal(i)
				if pm.datatypes.degrees(xyz.angle(axis)) < val:
					yUp.add("{0:}.f[{1:}]".format(s.fullPathName(),i))
		if yUp:
			comp = list(set(comp) & yUp)
			cmds.selectMode(co=1)
			cmds.selectType(smp=0,sme=0,smf=1,smu=0,pv=0,pe=0,pf=1,puv=0)
			cmds.select(comp,r=1)
		else:
			pm.confirmDialog(t=u"Select Yup",m=u"yUpのフェースは見つかりませんでした",b="OK",db="OK",ds="OK")
			return
	else:
		pm.confirmDialog(t=u"Select Yup",m=u"ポリゴンフェース、もしくはポリゴンフェースを持ったノード\nを選択してから実行して下さい",b="OK",db="OK",ds="OK")
		return

select_yup_face_om2(55.0)

関数「select_yup_face_om2()」に任意の引数を入れて実行してください。
今回は「55.0」垂直から55度傾いたフェースまでは許容するよ。という感じです。
実行すると、
2016_08_04_113
こんな感じで、地面として許容されるフェースが選択できるので、意図したようになるよう調整することができます。

 

で、作っていて思ったのですが、選択だと、頂点を動かす、などの調整を行い、再びスクリプトを実行して確認する必要がある。
瞬時にできて、便利だ。と思っていたのですが、そもそもそれをリアルタイムで判定して色を変えれば良いじゃないの。
と、シェーダを作ることを思い立ちました。
そのほうが圧倒的に早いですよねぇ、、ばかみたいな事をしておりました。
まぁ、せっかく作ったんだし。これはこれでいいか。と、公開です。
pymelのdatatypesを使って変換しているだけなので、大した事はしてないんですけどね。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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