V-Ray for MODO

aa_vray05a
V-Ray for MODOを導入しました。
ずっとテストをしていたのですが、まだマニュアルが完備されていないので、半ば手探りです。
床のノイズが消えない、、

 

シーンは以前購入した「modo 実践チュートリアルビデオ インテリア編」です。
頑張ったのですが、随分元と比べると眠い画像です。
始めのうちはマテリアルはMODOで使用されているものを使っていたのですが、最終的にはV-Ray用のものに変更しました。
Denoiserというノイズ除去の機能を使用してみました。因みにそれを使わないとこんな感じです。
aa_vray05b

 
MODOのV-Rayは他のと比べると随分と遅いようで家の環境では19分もかかりました。
CPUはi7-3770です。
確かに使っていて早い印象は受けませんでした。
Denoiserはレンダリング時間が少し追加されます。
色々と数値をいじっては見たのですが、これ以上ノイズを取るには至りませんでした。
50分以上かかる方法でもやってみたのですが、比較しても差はほぼなかったです。まだまだです。

 

そういえば、久しぶりにMODOの記事でした。ボロノイの事やMayaのスクリプトでの備忘録が溜まっているのですが、無精で記事にし損ねております。

Python – カラーの値変換 float to RGB – RGB to float

Maya関係ないし、ただの備忘録です。
たまーに使うのですが、たまーにしか使わないので、忘れてしまう。

f = 0.5
i = 128
print int(f*256) if f <= 1.0 else 255
print i/255.0
#Result
128
0.501960784314

超初等数学ですね、、

Substance Designer – ボロノイ図1 形状を加味したひび割れ

2016_08_05_114
なんだか連日の投稿が続きます。
随分と前から地道に進めていたのですが、中々突破口を見いだせずに悶々としておりました。
SubstanceDesignerとWorldMachineは実は同じ用途のツールで、どちらもノードを組み合わせて画像を生成します。
大きな違いを上げるとしたら、方や線形方程式で、もう一方が非線形方程式(多分完全ではない)ということがあげられるかと思います。

 

その辺の話は置いといて、SubstanceDesignerでマテリアルを作成するときの弱点は形状に準じた効果を入れづらい。
ということがあるかと思います。その辺りが線形、非線形に関わってくると思うのですが、
どうもSubstanceDesignerとしては、その弱点をSubstancePainterで補おうとしているように感じます。
ただ、どうもPainterは重くて、個人的には気が引けます。やはりテクスチャペイントには3Dcoatの方が未だやりやすいと感じてしまいます。

 

前置きが長くなりました。
ともかく今回は形状(ここではハイトやノーマル)によってマテリアルのダメージ具合を変更することに成功したように思います。
高いところがひびが多く、細かい状態で、低いところがその逆です。
できてますよね?
しかもなぜだか知りませんが、端の方では放射状にひびが広がっている。偶然の副産物です。
今回の形状がそういった偶然が重なるものなのかも知れません。
今後他の形状も試してみて、うまく行けば公開します。

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を使って変換しているだけなので、大した事はしてないんですけどね。

Maya Script – 選択しているフェースが所属するマテリアルのフェースを選択

タイトル長いです。
図で説明すると、
2016_08_03_111
キューブの上下にそれぞれ違うマテリアルをアサインしております。
そのうちの一つのフェースを選択し、スクリプトを実行すると、そのジオメトリに設定されている同じマテリアルのフェースを選択して欲しい。
という欲求から作りました。
実行すると、
2016_08_03_112
こんな感じになるのが理想です。

 

マテリアル境界で頂点カラーによるブレンドをしたいと思い、作りました。
なので、フェースを選択して、ホットキーに割り当てたコマンドを実行するだけで、マテリアルに含まれるフェースを選択できるのが理想です。
それを、境界エッジに変更すれば、目的は果たせます。

 

とにかく早く欲しかったので、手っ取り早いpymelで作ってみました。

import pymel.core as pm

def material_face_select_pymel():
	sel = pm.ls(sl=1,l=1,fl=1)
	if not sel and type(sel[0]) != pm.nt.MeshFace:
		return
	selShape = pm.ls(sl=1,o=1)
	sg = selShape[0].inputs(type=pm.nt.ShadingEngine)
	if not sg:
		return
	msg = []
	for x in sg:
		if pm.sets(x,im=sel[0]):
			msg.append(x)
	pm.select(msg[0],r=1)

material_face_select_pymel()

とりあえず、急場はしのげましたが、これだと同じマテリアルを使用している他のノードのコンポーネントまで選択されてしまう。
という問題が発生します。
ただ、Mayaのバージョンは忘れましたが、選択範囲が勝手に保存されるので、一度オブジェクト選択モードに移行して、再び目的のジオメトリを
選択し、フェース選択に切り替えれば、問題ありません。

 

問題はないのですが、悔しいので時間が少し空いた時にMayaコマンドで作りなおすついでに、その辺りも解消しようと作りなおしました。

import maya.cmds as cmds

def material_face_select():
	sel = cmds.ls(sl=1,l=1,fl=1)
	mat = cmds.ls(mat=1)
	if not sel or not mat:
		return
	selType = sel[0].rsplit(".")
	if not selType:
		return
	if selType[-1][0] != "f" :
		return
	selShape = cmds.ls(sl=1,o=1)
	sg = []
	for m in mat:
		s = cmds.listConnections(m,s=1,type="shadingEngine")
		if s:
			sg.append(s[-1])
	if not sg:
		return
	nSel = []
	for s in sg:
		sFace = cmds.ls(cmds.sets(s,q=1),fl=1,l=1)
		if sel[0] in sFace:
			for f in sFace:
				if selType[0] == f.rsplit(".")[0]:
					nSel.append(f)
	if nSel:
		cmds.select(nSel,r=1)

material_face_select()

forループが二重になってる、、
うーん、これも余り時間がなかったので、色々と突っ込みどころはありますが、とりあえず目的は達成できております。
で、じゃあそれをさらにpymelでやったらどうなのだろう。と、改造しました。
そんなことする暇あるなら、コードをきちんとしろよ。と、突っ込みたくなるところではあるのですが、、

import pymel.core as pm

def material_face_select_pymel2():
	sel = pm.ls(sl=1,l=1,fl=1)
	if not sel and type(sel[0]) != pm.nt.MeshFace:
		return
	selType = sel[0].name().rsplit(".")
	selShape = pm.ls(sl=1,o=1)
	sg = selShape[0].inputs(type=pm.nt.ShadingEngine)
	if not sg:
		return
	nSel = []
	for x in sg:
		sFace = pm.ls(x.members(),fl=1,l=1)
		if sel[0] in sFace:
			for f in sFace:
				if selType[0] == f.name().rsplit(".")[0]:
					nSel.append(f)
	if nSel:
		pm.select(nSel,r=1)

material_face_select_pymel2()

こんな感じでしょうか?どちらにせよ二重ですが、、
因みにこれは実行しないほうが良いです。
数万ポリゴンのシーンで実行すると、しばらく帰ってこなくなります。
Mayaコマンドであれば、少し待てば帰ってきます。やはりAPIで作るべきなんでしょうねぇ。

 

とりあえず、備忘録です。

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

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

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