Maya Script API2.0 – 選択範囲を頂点に変更

前回の記事でMayaコマンドを使い、コンポーネントのインデックスを取得する方法を書きましたが、
恐らく正しく動作しないかと思います。
インデックスを取得するために文字列を加工し、その後加工した文字列を整数に変換しないとインデックスとしては使えないかと思います。
なので、set集合を作る際にint()を使って整数にすれば、正しく使えるはずです。

 

じゃあ訂正しろよ、という話ですが、面倒なのでしません。
さらにはそんなややこしいやり方をする必要がないからです。

 

API2.0を使った、選択しているコンポーネントの取得の方法が分かりました。
セレクションリストの、getComponentメソッドを使うと、DAGノードとコンポーネントをMObjectとして取得することが出来ました。
取得したコンポーネントを、関数セットMFnSingleIndexedComponentに入れて、getElementsを使うとインデックスが取得できます。
それが正しいやり方かは知りませんがとにかく出来ました。

 

で、それを使って少し実用的な処理を作成。

import maya.api.OpenMaya as om2
import maya.cmds as cmds

def select_vertex_om2():

	selList = om2.MGlobal.getActiveSelectionList()

	if not selList:
		return

	selObj = {}
	for x in range(selList.length()):
		try:
			mDag,mCmp = selList.getComponent(x)
		except:continue

		if mDag.hasFn(om2.MFn.kMesh):

			selId = {}
			cmpType = None

			if mCmp.hasFn(om2.MFn.kMeshVertComponent):
				cmpType = "vtx"
			elif mCmp.hasFn(om2.MFn.kMeshEdgeComponent):
				cmpType = "edge"
			elif mCmp.hasFn(om2.MFn.kMeshPolygonComponent):
				cmpType = "face"

			if cmpType:
				selId[cmpType] = om2.MFnSingleIndexedComponent(mCmp)

			selObj[om2.MFnMesh(mDag)] = selId

	if selObj:
		cmds.select(cl=1)
		
		for k,v in selObj.items():
			if "vtx" in v:
				id = v["vtx"].getElements()
			elif "edge" in v:
				eid = v["edge"].getElements()
				eSet = []
				[eSet.extend(k.getEdgeVertices(x)) for x in eid]
				id = list(set(eSet))
			elif "face" in v:
				fid = v["face"].getElements()
				fSet = []
				[fSet.extend(k.getPolygonVertices(x)) for x in fid]
				id = list(set(fSet))
			else:
				id = range(k.numVertices)

			cmds.select(["{0:}.vtx[{1:}]".format(k.fullPathName(),x) for x in id],add=1)

select_vertex_om2()

選択されているものがメッシュでエッジやフェースが選択されていると、それらを含む頂点を選択します。
コンポーネントが選択されていないと、メッシュ全体が選択されます。

 
頂点に何かの作用をさせるスクリプトを作るときに便利です。
API2.0を使った頂点カラーエディタとかその気になれば、作ることができます。
ただ、いまさら頂点カラーかよ。とテンションは上がりません。

 

スキニングは、API1.0にある関数セットMFnSkinClusterの役割を果たす機能を見つけられません、、
恐らくより汎用的な感じで何かを使うのだろうが、まだ分からない。

 

うーん、本当はfusionmeshやSubstanceDesignerやSubstancePainterについての備忘録を書いておきたいのだが、
ついついAPI2.0をやってしまう。未開の地を探検しているようで面白い。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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