Maya Script API2.0 – アトリビュートの値をセット

久しぶりにMayaの投稿です。

 

その前に、ijiVFXさんからPythonでのゼロ埋めはstringモジュールのzfill関数で一発でできることを教えていただきました。
ijiVFXさん、ありがとうございました。

 

さて、今回のスクリプトを作るきっかけとなったのは、頂点カラーの表示非表示をトグル制御するスクリプトを作ったことがきっかけでした。
Mayaコマンドで作ってみたのですが、膨大な量のジオメトリがあるシーンで、とてつもなく遅かった。
メッシュのアトリビュートをsetAttrで更新しているのがいけないのだろうか。と、API2.0で作ってみました。
今記事を書いていてふと思ったのですが、そもそもMayaってそんな事をしなくても頂点カラーの表示トグルは出来るのでしょうか?
すみません、知りません。

 

ともかく、シーン中のポリゴンメッシュノードを拾い集め、アトリビュートを変更させるスクリプトです。
ついでに、パースビューの描画も、それに合わせてライトのオンオフやテクスチャのオンオフもトグルします。
はじめに見つけたジオメトリのアトリビュートを参考に、それ以外のものを揃える方式です。
使いやすいように、書き換えてください。

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

def set_display_color_om2():
	args = [x for x in cmds.ls(s=1,l=1) if cmds.nodeType(x) == "mesh"]
	colorCh = ["Ambient+Diffuse","None"]
	
	selList = om2.MSelectionList()
	[selList.add(x) for x in args]
	
	flag = not cmds.getAttr("{0:}.displayColors".format(args[0]))
	
	for x in range(selList.length()):
		mDg = selList.getDependNode(x)
		if mDg.hasFn(om2.MFn.kMesh):
			dagPath = selList.getDagPath(x)
			node = dagPath.node()
			fn = om2.MFnDependencyNode(mDg)
			#print fn.name()
			attrDC = fn.attribute("displayColors")
			pDC = om2.MPlug(node,attrDC)
			#print pDC.asInt()
			pDC.setInt(flag)
			
			attrDCC = fn.attribute("displayColorChannel")
			pDCC = om2.MPlug(node,attrDCC)
			#print pDCC.asString()
			pDCC.setString(colorCh[flag])
			#print "==="
	panel = [x for x in cmds.getPanel(type="modelPanel") if x=="modelPanel4"]
	if not panel:
		return
	if flag:
		cmds.modelEditor(panel,e=1,dl="none",da="smoothShaded",dtx=0)
	else:
		cmds.modelEditor(panel,e=1,dl="default",da="smoothShaded",dtx=1)

set_display_color_om2()

で喜び勇んで使ってみたのですが、変わらない、、
どうやら時間がかかっていたのは、Viewport2.0の更新が原因だったようです。
なので、Mayaコマンドと比較しても体感できるレベルではなかった。
より多くのジオメトリが存在するのであれば、別かも知れないが、どうやらあまり意味は無かったようです。
でも、API2.0の勉強になった。

 

ただ、見ての通り、ノードの取得はMayaコマンドを使っております。
それが原因だろうか、とそこもAPI2.0で書き換えて見たのですが、やはり変わらなかった。
それについては次回書きます。

 

で、さらに自分のコードに突っ込むならば、Mayaコマンドですでにメッシュノードに限定させる処理をしておきながら、
API2.0でも条件分岐を付けている。意味が無い。

 

でもようやくAPI2.0でアトリビュートを変更させる方法が分かった。
これでメッシュノードから、スキンクラスタを辿る方法が分かれば高速ウェイトエディタが完成する。
うーん、、あまり必要性を感じないなぁ、、アトリビュートを辿ってゆけばスキンクラスタに辿り付けそうだし、
そもそもそんなに負荷の掛かるウェイト作業なら、ペイントだけで済ませてしまうだろう。
まぁ、備忘録的に。

コメント/トラックバック (2件)

  1. おさか のコメント:

    いつも参考にさせて頂いております。
    view port 上の vertex color 表示のトグル自体は、オブジェクトを選択して Color > Toggle Display Colors Attribute で出来ますので試してみてください。

  2. 研究員 A のコメント:

    おさか様

    コメントありがとうございます。
    気が付くのが遅くなってしまい、申し訳ございません。

    なるほど、そうなのですね、、知りませんでした。
    ありがとうございます。
    今度使わせていただきます。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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