Maya Script Pymel – マテリアルのパラメータをコピー

うーん、最近更新するとなると、スクリプトばかりになってしまっている、、

 

リアルタイムCGばかりやっているので、Mayaのマテリアルに付いては殆ど理解しておりません。
リアルタイムの場合は、Mayaで設定されているアトリビュートではなく、独自のアトリビュートなどを追加したものが使用されることが殆どです。
それ程度の知識ですが、マテリアルのアトリビュートの値を他のマテリアルに移したい。という必要性に駆られ、作りました。
というか、そもそもMayaにはそれ程度のツールもないのかな?
そういえば、そんな発想はなかった。MODOであれば、マテリアルを右クリックすれば済む話だが、Mayaにも同じような機能があるのだろうか?

 

探すよりも作ったほうが早い。ということで作りました。

import pymel.core as pm

def attr_copy():
	sel = pm.ls(os=1,mat=1)

	if not sel or len(sel) == 1:
		return

	srcMat,dstMat = sel[0],sel[1:]
	srcAttr = {}

	for x in srcMat.listAttr():
		attr = x.rsplit(".",1)[-1]
		try:
			if x.isMulti():
				for i in range(x.numElements()):
					attrN = "{0:}[{1:}]".format(attr,i)
					val = srcMat.attr(attrN).get()
					srcAttr[attrN] = val
			else:
				val = srcMat.attr(attr).get()
				srcAttr[attr] = val
		except:pass

	if not srcAttr:
		return

	for dm in dstMat:
		for x in dm.listAttr():
			attr = x.rsplit(".",1)[-1]
			if "reflectedColor" in attr:
				continue
			if x.isMulti():
				for i in range(x.numElements()):
					attrN = "{0:}[{1:}]".format(attr,i)
					if attrN in srcAttr.keys():
						try:
							dm.attr(attrN).set(srcAttr[attrN])
						except:pass
			else:
				if attr in srcAttr.keys():
					try:
						dm.attr(attr).set(srcAttr[attr])
					except:pass

attr_copy()

複数のマテリアルを選択し、実行すると、始めに選択されたマテリアルのアトリビュート値をそれ以降に選択されたマテリアルのアトリビュート値に転送します。
マテリアルの種類が違くても、同じアトリビュート名であれば転送できます。

 

気に入らないのが、29行目と30行目です。
何ですか「reflectedColor」というのは、その二行を削除しても動くには動くんですが、エラーが出ます。
何か分からないし、使わないからいいや、ということでパスです。

 

今回のツールで勉強になったのは、attr()メソッドでした。
今までアトリビュートの値を文字列として取得した場合、それを使うにはMayaコマンドに送って実行していました。
pm.setAttr(val)
の様な形です。
この場合、変数の型を指定する必要があり、面倒です。折角Pythonなんだからそんなものは動的にやってくれ、と不満を抱いておりました。
attr()メソッドを使えば、変数を入れて使うことができるようです。

 

Pythonのeval()関数も試してみたのですが、
eval(“mat.{0:}.set({1:})”.format(attr,val))
の様な形でしょうか、
eval()関数を使うと、グローバルの変数として使われるようで、関数内で使うことができませんでした。
詳しく調べていないので、良く分かりません。
ただ、eval()関数は、速度が遅いので、できれば使わない方がいい。という情報があったので、さほど調べませんでした。

 

ああ、Pymel便利だ。
こんなに簡単に作ることができることを喜ぶべきだろうか。そんな機能もデフォルトでないことを嘆くべきだろうか。
そもそも機能を探していないので、良く分かりません。
なんじゃそりゃ。

3D-coat v4.1 beta6A – 「レイヤーセットの追加」

3Dcoatのベータ版が少し前に更新されました。
ツールの更新よりも、ウクライナの国内情勢のほうが気になるところです。

 

今回の更新でついにフォトショップでいうところのレイヤーセットが使えます。
待ってました。
PSDで吐き出して、フォトショップに読み込むこともできます。
ただ、レイヤーセットマスクがフォトショップと仕様が違うのが難点です。
でもこれで大分楽になる。SubstancePainterは非力なマシンではちょっときつい。
3DcoatもPBRに対応してくれないかな?

 

しかし、相変わらずベータ版で大きな変更があります。
凄いツールだなぁ。

 

そういえばMODO801にはOpenSubdivは結局つかなかった、、Maya2015は確かあったかと思います。
meshfusionもクリースに対応してくれると助かるんだけどなぁ、、

 

Mayaでの頂点カラーエディタ、絶対値の編集であれば、リアルタイムでも問題なく動作するが、相対値での編集はそうは行かない。
で、MODOで頂点カラーを編集してみたら、数十万ポリゴンでも全く処理落ちすることなく、編集できる。
で、Maya2012ではどうやらバグで、リアルタイムの変更がうまく行かない時がある。
そんなこんなで、結局テンションダダ下がり、で開発中止です。
現行のバージョンでも気軽に使う分には問題ないからいいや。という感じになりました。

 
MODOのPythonAPIを調べてツールを作ってみようか、などと思ってもドキュメントが殆ど無く、始める気も起きない、、

 

細かいツールをコツコツと作っております。

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

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

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