Maya Script Python – コンポーネントの取得

今度はAPI2.0ではなく、Mayaコマンドで手っ取り早くメッシュのコンポーネントを取得できないか。
ということをやっておりました。
サイトでメモされている方もいらっしゃるようで、参考に作りました。

import maya.cmds as cmds

def get_ploy_comp(flag = "vtx"):
	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
	
	sel = cmds.ls(sl=1)
	kw = {x:{y:1} for x,y in zip(flags,kwArgs)}
	smKW = dict(zip(flags,sm))
	
	comp = cmds.filterExpand(cmds.polyListComponentConversion(sel,**kw[flag]),sm=smKW[flag],ex=1)
	if comp:
		node = list(set([x.split(".",1)[0] for x in comp]))
	
	return node,comp

コンポーネントを取得する関数です。
使い方はこんなかんじでいかがでしょうか?

node,cmp = get_ploy_comp("face")

print node,cmp

if cmp:
	cmds.select(cmp,r=1)
	cmds.selectType(smp=0,sme=0,smf=1,smu=0,pv=0,pe=0,pf=1,puv=0)
	cmds.hilite(node)
	cmds.selectMode(co=1)

選択されているものがコンポーネントでない場合、メッシュに含まれるすべてのコンポーネントが対象となり、
何も選択しないで実行すれば、Noneが返ってきます。
機能としては便利。

 

さて、コードの中身ですが、最初はシンプルに作っていたのです。

def get_ploy_comp_symple(flag = "vtx"):
	node = None
	
	flags = ["vtx","edge","face","uv","vtxFace"]
	if flag not in flags:
		return -1
	
	sel = cmds.ls(sl=1)
	
	if flag == "vtx":
		comp = cmds.filterExpand(cmds.polyListComponentConversion(sel,tv=1),sm=31,ex=1)
	elif flag == "edge":
		comp = cmds.filterExpand(cmds.polyListComponentConversion(sel,te=1),sm=32,ex=1)
	elif flag == "face":
		comp = cmds.filterExpand(cmds.polyListComponentConversion(sel,tf=1),sm=34,ex=1)
	elif flag == "uv":
		comp = cmds.filterExpand(cmds.polyListComponentConversion(sel,tuv=1),sm=35,ex=1)
	elif flag == "vtxFace":
		comp = cmds.filterExpand(cmds.polyListComponentConversion(sel,tvf=1),sm=70,ex=1)
	
	if comp:
		node = list(set([x.split(".",1)[0] for x in comp]))
	
	return node,comp

素直な感じで、条件分岐でコマンドを実行しております。
もっと工夫できないかなぁ、と最初のコードになりました。
コマンドに渡すのには、キーワード引数の形でなく、辞書を渡す事も出来るんですねぇ。
色々やってたら楽しくなってきて、最終的にこうなりました。
読みにくい。

 

素直に書いたほうが何をしているのか良くわかるので、メンテナンスもしやすい。

 

で、更なる活用例。

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

node,cmp = get_ploy_comp("vtx")
vec1 = pm.dt.Vector(cmds.pointPosition(cmp[0],w=1))
vec2 = pm.dt.Vector(cmds.pointPosition(cmp[1],w=1))

print vec1.distanceTo(vec2)

vec1 = om2.MFloatPoint(cmds.pointPosition(cmp[0],w=1))
vec2 = om2.MFloatPoint(cmds.pointPosition(cmp[1],w=1))

print vec1.distanceTo(vec2)

node,cmp = get_ploy_comp("uv")
uv1 = pm.dt.Vector(cmds.polyEditUV(cmp[0],q=1))
uv2 = pm.dt.Vector(cmds.polyEditUV(cmp[1],q=1))

print uv1.distanceTo(uv2)

一つのエッジを選択して実行すると、エッジを構成する2つの頂点の距離が表示されます。
pymelのVentorクラスとAPI2.0のMFloatPointを使ってみました。
最後にUVの距離も出してみました。

 

それはそうと、SubstanceDesignerでノーマルの回転を以前書きましたが、
その画像を散らして、タイリングテクスチャが作ることができないかなぁ、とずっと考えていたのですが、
FX-Mapの中でPixelProcessorを使わないとできないよなぁ、、と諦めておりました。

 

それがなんと、出来ています、、
ノーマルの回転をチュートリアルで公開している方が、やはり公開されております。
どうやら回転の値をグレースケールに変換してFX-Mapで回転した値をPixelProcessorに渡しているようです。
ちゃんと見ていないし、まだ試していないので不確かですが、確かにその方法ならできそうだ。
面白い事考えるなぁ、、
夏にはSubstanceのシェアーサイトが立ち上がるようで、楽しみです。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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