SubstanceDesigner – WSnormalMap & PositionMap

SubstanceDesignerのMask Generatorsには入力に基づいたマップとパラメータで各種マスクを生成することができます。
こう書くと分かりにくいのですが、適切な汚しをつけるためのマスク、要するに部分を抽出することが出来る。ということです。

 

SubstanceDesignerを使うに当たって、最も重要な基本概念は、テクスチャをモデリングして作る。
というような感覚になるかと思います。
なので、ハイトマップを作ることが最も重要で、始まりでもあります。
ハイトマップ自体は、ZBrushでいうところのDisplacementMapなので、そう考えるとより分かりやすいのかと思います。

 

ちょっと話がずれましたが、今回はZBrushのプラグイン、TerreinToolsから出力した情報を元に、
SubstanceDesigerのMask Generatorsのものを使えないか、とやっている時に発見したものを備忘録で書いておきます。

 

まずは分かりやすいように一軸、SubstanceDesignerでは画像なので、グレースケールという意味になりますが、
一軸の情報入力が必要なノード、「GroundDirt」を例にとってみます。
この場合、必要とされるノードは基本一つで、グレースケールのポジションマップを要求されます。
その場合は出力したハイトマップを入力すれば済みます。
2017_03_29_6077
こんな感じです。

 

しかし、カラーのポジションマップやワールドスペースのノーマルマップを要求される場合はどうしたら良いのだろうか、
ということで、今回やってみました。
個人的にマスク生成でよく使うノードは「Mask Builder」です。
最もパラメータが多く、色々なマスクを生成することが可能なのですが、入力を要するマップも多いです。
「AO」「Curvature」「WSnormal」「Position」(カラー)が必要となります。
特定のパラメータを使わなければ、それに関するマップを入力しなくても使えますが、
全てのパラメータを使いたい場合は、マップが必要になります。

 

で、調べてみてわかったのですが、プレーンである場合、ハイトマップさえあれば、
全てのマップを生成することが出来る、ということがわかりました。
ポジションマップは、
Redチャンネルに「Rotation」「90°」のグラデーション
Greenチャンネルにハイトマップ
Blueチャンネルに「Rotation」「180°」のグラデーション
アルファは白のベタ

WSノーマルマップは、タンジェントのノーマルを分解し、
RedチャンネルにRedチャンネル
GreenチャンネルにBlueチャンネル
Blueチャンネルに元のGreenチャンネルを反転したものを入力
アルファは白のベタ

にすれば、生成できるようです。
2017_03_28_6073
こんな感じです。

 
で、それを一つのノードとして作り、Mask Builderで使ってみると、
2017_03_29_6074
こんな感じになります。

 

SplatMapとHeightMapを入力すればカラーとラフネスを生成するノードもできそうだなぁ。
2017_03_29_6082

ZBrush – TerrainTools – SplatMap

2017_03_28_6071
ちょっと忘れないうちに備忘録です。
Zbrushのプラグイン、TerrainToolsですが、Zbrush上でマスクを作成可能です。
Cavity、SlopeなどはSubstanceDesignerでも作る事が出来るからいらないかなぁ、などと思っていたのですが、
ちょっと違うようでした。

 

作成したマップはそのままグレースケールでいつも通りにエクスポート可能ですが、SplatMapという名前の付いた
画像で出力可能です。
この画像は各チャンネルに生成したグレースケールを入れて出力できるもので、ただの便利機能かと思っていたのですが、
ちょっと違うようでした。
なぜだか、どういった原理なのかよくわからないのですが、グレースケールで出力したものとは結果が異なります。
それはそれでまずいように思うのですが、グレースケールの方が情報量が多く出せるだろう。と、しばらくそれでやっていたのですが、
どうにも情報を膨らませることができずに、SubstanceDesignerでノイズを追加して情報を増やしておりました。

 

そんな時にチュートリアルを見つけ、見てみるとSplatMapでの出力があったので、見ながらやってみると、
いい具合に情報が増えたものが出力されました、、釈然としないのですが、今のところはまぁ、増えたから良いだろう。という感じです。

 
1.まずは、デフォルトの値で「SlopeMap」を生成
2.「WetMap」を「Duration」「437」、「Rain」「191」に変更して生成
3.「AntMap」を「Droplets」「2398」、に変更して「FitAntMap」で生成
3.「CavityMap」を生成

できたマップを
A 「SlopeMap」
B 「WetMap」
G 「AntMap」
R 「PASMap」※Cavity生成時に生成される
を入れて出力。

 

できたものをSubstanceDesignerで分解して使用すれば色々とマスクを作ることが出来る。
後はもっと狙ったような地形が出来るように、TerrainToolsのパラメータを理解しないとなぁ。

SubstanceDesigner – GrungeMap

2017_03_26_6068
随分と前の話ではあるのですが、Substance ShareでGrungeCollection1というのが公開されておりました。
マスクを作る際にベースの汚しに便利に使えるマップ集、という感じだと思います。
ただ、8bitの画像なので、ハイトマップとして使用するにはちょっと物足りず、そのままノーマルに変換すると
ジャギジャギとした汚いノーマルが出来上がります。

 

そんなときは、基本ブラーを掛けて情報量を膨らませるのですが、一口にブラーといっても色々と種類があります。
凹凸として使用する情報がほしい時、よく使用されるのがSlopeBlurかと思います。
そんなSlopeBlurを重ねがけして、いい具合に手早く情報を増やしてくれる、というノードがこちら

幾つかのsbsを公開されている方で、良く参考にさせてもらっています。
そのマテリアルで使用されているノードに、HBNoisePolisherというものがあります。
これはSlopeBlurを重ねがけして、情報量を増やしてくれます。
その結果が、上図のものになります。
因みに上のものはIRayで、同じものをOpenGLで表示するとこうなります。
2017_03_26_6069
HBNoisePolisherでハイトマップを作成し、そこからAO、ノーマルを作成し、ノーマルから曲率を生成し、
それを元にラフネスを作りました。後、ラフネスにはスロープ具合から抽出した情報を加味しました。
カラーはニュートラルグレーよりも少し明るいグレー単色です。

 

コレクションというだけあって、35枚あります。
その一つ一つを試すのは結構骨が折れます。
なので、一つのノードで切り替えるノードを作ってみました。ピクセルプロセッサーを使って作ったのは良いのですが、
肝心のsbsを無くしました、、おかしいなぁsbsarと同じディレクトリに入れておいたのになぁ、、
まぁ、用は足りるので良いです。
簡単に作成できるノードではあるのですが、35個分なので、面倒くさいです。
こんな時やはり、GUIのノードベースよりもテキストベースの方がfor文一回で済むから楽だなぁ。などと思ってしまいます。

 

で、環境を整え、色々と比べてみましたが、割りと偏ってはいるのかなぁ、という印象です。
まぁ、使うとしても混ぜ合わせて使うので、問題はないのですが、やはり手持ちのライブラリの量、というのは重要になってきますねぇ。

Substance Designer – ディライティング

うーん、以前ディライティングの事を記事にしたような気もしますが、また書きます。
えーと、こんなものがありました。

 

移動したページの真ん中よりも少し下に、「Click here to download it」という文字があり、「here」がリンクになっています。
そのリンクをクリックするとsbsファイルとsbsarファイルがzipに入ったものがダウンロードできます。
カラーマップと、AOマップをノードに指すと、いい具合にAOを除去してくれます。
落影がきつく入っている場合は無理ですが、大抵の場合はなんとかなりそうです。
SubstanceDesignerも5.6になり、優秀なAO作成ノードが加わり、ハイトマップがあれば、きれいなAOを作成してくれます。
もし、カラーマップしかない場合は、B2Mなんかでハイトを作り、それを元にAOを作るといい具合になります。

 

というか、このノード、SubstanceShareに入れるべきなのでは無いでしょうか、、
もっと早くに知りたかった、、

 
それはそうと、ちょっと実験。
2017_03_08_6051
少ない手数で岩肌を作れないか、という事で作ってみました。
元はSubstanceShareにあるGrungeMapで、カラー情報として、適当な画像から色情報をもらってます。
よくあるのが、ハイトの情報を元にカラーをグラディエントで乗せる、という手法がありますが、どうも個人的に好きになれません。
大理石ならまだしも、そう中々高さに沿って年輪のように色は変わらないですよねぇ。
なので、ノーマルマップを分解した情報を元に色を乗せてみました。

ZBrush – Terrain Tools

TerrainToolsというZBrushのプラグインを買いました。
gumroadではいつも無料のものばかりをダウンロードするのですが、今回は2.5ドルの有料ツールを買ってみました。

 

WorldMachineを使わずに、侵食がきれいにできるか、疑問だったのですが、中々です。
しかも速い、、
そして、各種マップも出力でき、それらをSubstanceDesignerで合成すると
2017_03_15_6064
こんな感じです。

 

これがたった3百円程度のプラグインで生成できるって、凄いですぇ、、
因みにZBrushでは、
2017_03_15_6066
こんな感じに生成され、SubstanceDesignerで見るのとほぼ同じようにできます。
あぁ、2年前にあれば、だいぶ助かったのに、、

 

そんなかんなで、驚いていたら、
こんなものを見つけましたが、
何なのでしょうか?
リンク元を忘れましたが、Unityで動いていたような気もするのですが気のせいでしょうか。

 

それはそうと、今後テクスチャはフォトスキャンが主流になるだろうなぁ、などと思っていたのですが、
SubstanceDesigerではScanProcessingというカテゴリが追加され、一つの素材を4から8方向の照明で取った写真を元に、
各種情報を再現させる、という方向性を提示し、どちらも一長一短の手法のように思います。
特にフォトスキャンの場合は、取ってきた素材が、現像した後に使い物にならないことがわかるとゲンナリしますし、
Substanceの手法の場合は、特殊な自作装置でも作らない限りは、スキャンするのが難しそうです。
そんなことを思っていると、こんなものがありました。
Nvidiaが作ったようですが、Unity上でフォトスキャン、という感じでしょうか?
ノートパソコンを持ち歩いて、その場で現像出来るようなので、これは中々良さそうです。

 
と、思ったら、さらにこんなのもあります。
トラッキングツールのようですが、下の方におまけのような形で、メッシュの出力、各種マップの出力が出来る。というようなことが書いてあります。
ああ、これが最強ですね、、
以前シーグラフで、撮影した動画を元に、陰影を抜いたアルベドとメッシュ形状を生成する。というようなものがありましたが、あのテクノロジーなのでしょうか?

 

いやー、進化がはやいですねぇ。
進化と言えば、MayaのUV編集、とてつもなくパワーアップしていて、ビックリでした、、うーんMODOより便利かも、、

Substance Designer – Bevel node

おう、、今年まだ更新してなかったのですね、、すっかり疎かになっております。

 

Substance Designer、6がリリースされ、HDRStuidoが不要になってしまいそうですねぇ。
なんとも凄いです。

 

今回はそこまででは無いのですが、Bevelノードを使ったノーマルの作成において、ジャギーが酷くて使い物にならないのを何とかする。
というのを紹介します。

 

まずは普通にBevelしたもの。
2017_02_27_6041
ちょっと引きでわかりにくいですが、
2017_02_27_6042
拡大するとこんな感じです。
画像自体は1kでつくっております。まぁ、とてもじゃないけど使い物にはなりません。
調べてみると、同じように困っている人がいるようで、解決策をフォーラムで書かれておりました。
一応言っておきますが、それを見つける以前に同じ方法を発見しました。まぁ、どうでもいいのですが、、

 

簡単にいってしまうと、大きく作って、縮小する。です。
なので、今回の場合はSVGを使っているので、拡縮は自在にできますから、
大本のSVGのノードの解像度設定を2段階ほど上げておくといい感じです。
もちろん上げれば上げるほどにきれいにはなりますが、重くなります。
で、その結果。
2017_02_27_6044
こんな感じになります。まだ少しジャギが残っていますが、まぁ、許容範囲ではないでしょうか。
Bevelの後にブレンドノードをつなげておりますが、個人的には解像度を合わせる方法として、最も楽でスマートではないかと思っております。
上の方の接続に刺せば、アウトプットのサイズに変更してくれます。
なので、変更するのは大本のSVGの解像度だけになります。

 

因みにフォトショップでやれば、そもそもそんなことは起きないのではないか、と思いやってみると、
2017_02_27_6043
シゼルソフトでほぼ同じようになります。
デフォルトの「滑らかに」では丸まりすぎだと思います。
ああ、書いていて思い出しましたが、手っ取り早くよりきれいにするには、Bevelノードの「Smoothing」の値を増やしてやると滑らかになります。
やりすぎると丸まりすぎます。

 

ついでに、輪郭が欲しいときは「Edge Detect」ノードが役立ちます。
2017_02_27_6046
こんな感じに輪郭線を抽出して加工できます。
ただ、際の部分が丸くなってしまいます。
鋭角を保ちたい場合は、こちらのノードが役に立ちます。
2017_02_27_6047
ただこの場合、Bevelに一度繋いで、Histogram Maskでエッジを抽出した後に再びBevelで加工。という手順が必要になります。

 

だいぶ前にこの手法を編み出し、記事に書こうと思っていたのですが、忘れており。
最近同じ処理が必要になったときに、どうやってきれいなノーマルを作ったのか、すっかり忘れて焦りました。
段々と物忘れが多くなってくるようです、、

Maya Script Python – メッシュの法線方向にカーブを配置

えーと、、何を調べていたのか忘れましたが、
確かpymelのバウンディングボックスクラスで、実用例を検索していたような気もしますが、
とにかく、何かを探していて、面白いコードだったので、それを参考に書いたものです。

 

ポリゴンメッシュを選択し、実行すると、そのメッシュに含まれる各フェイスに、そのフェイスの法線方向に
向いたカーブを生成する。と言うものです。
フェイスの法線を表示したような感じで、カーブが生成されます。

 

ミソはフェイスの中心の求め方とマトリックスの使用でしょうか。
もとのコードでは、バウンディングボックスを求めて、その中心位置をカーブの位置にしておりましたが、変更しました。
pymelだとオブジェクト指向で扱えるので、やはり楽ですねぇ。

import pymel.core as pm



def poly_center_curve_pymel():
	sel = pm.ls(sl=1)
	sel = pm.ls(pm.filterExpand(pm.polyListComponentConversion(sel,tf=1),sm=34,ex=1))
	
	if not sel:
		return
	
	up = pm.datatypes.Vector([0.0, 1.0, 0.0])
	
	for s in sel:
		pos = s.getPoints(space="world")
		
		aim = s.getNormal()
		
		center = pos[0].center(*pos[1:])

		tangent = (aim ^ up).normal()
		up = (tangent ^ aim).normal()

		mat = pm.datatypes.Matrix([	aim.x, aim.y, aim.z, 0,
									up.x, up.y, up.z, 0,
									tangent.x, tangent.y, tangent.z, 0,
									center.x,  center.y,  center.z,  1])
		curve = pm.curve(p=([0, 0, 0], [5, 0, 0]), degree=1)
		pm.xform(curve, absolute=True, matrix=mat)

poly_center_curve_pymel()

そして、Mayaコマンド版ですが、こちらは相変わらず、自作の関数を通すことを前提に作りました。

import maya.cmds as cmds

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

まずは上記の関数を実行し、

from itertools import chain
import maya.cmds as cmds
import pymel.core as pm

def poly_center_curve_cmds():
	sel = cmds.ls(sl=1)
	node,comp = get_poly_comp("face",sel)
	
	if not node:
		return
	
	up = pm.datatypes.Vector([0.0, 1.0, 0.0])
	
	for c in comp:
		vtxs = cmds.filterExpand(cmds.polyListComponentConversion(c,tv=1),sm=31,ex=1,fp=1)
		pos = [pm.datatypes.Point(cmds.pointPosition(x,w=1)) for x in vtxs]
		
		aim = pm.datatypes.Vector([float(x) for x in cmds.polyInfo(c,fn=1)[0].split()[-3:]])
		
		center = pos[0].center(*pos[1:])
		
		tangent = (aim ^ up).normal()
		up = (tangent ^ aim).normal()

		mat = pm.datatypes.Matrix([	aim.x, aim.y, aim.z, 0,
									up.x, up.y, up.z, 0,
									tangent.x, tangent.y, tangent.z, 0,
									center.x,  center.y,  center.z,  1])
		curve = cmds.curve(p=([0, 0, 0], [5, 0, 0]), degree=1)
		cmds.xform(curve, absolute=True, matrix=list(chain.from_iterable(mat)))

poly_center_curve_cmds()

コード自体の量はpymelと比較しても大差ありません。
ただ、Mayaコマンド版のxformが、pymelのマトリックス表記に対応していないので、リストを平坦化する必要があります。
なので、itertoolsを使い平坦化を行いました。

 
実用目的で作ったものではないのですが、pymelの各種クラスの使い方とリストの平坦化など、
色々とメモしておきたいコードでした。

AOマップ

2016_10_16_6015
AOマップって、微妙じゃないですか?
SubstanceDesignerに標準で入っている、HightmapからAOを作成するノードだと、情報が飛びすぎていて、正直使い物にはならないかと思います。
で、自作で作ったノードで表現したのが上図のものです。
ちょっとフォトスキャンっぽい感じが出たかと思います。

 

わかりやすく、どこかで拾った(恐らくSubstanceShare)岩肌のマテリアルでテストです。
2016_10_16_6016
まずはSDデフォルトのノードです。
暗いところが黒すぎるし、明るいところが白すぎる、、まぁ、パラメータをいじってはいないのですが、
いじったところで、そう劇的に変わるものでもありません。
2016_10_16_6017
これが今回作ったノードのデフォルト値です。
パラメータをいじると、
2016_10_16_6018
これはちょっと濃すぎますが、自在に情報量を変化させることができます。

 

内容は単純で、マスクを作る際に使用する、Lightノードと、フォトショップで言うところの、ドロップシャドウを組み合わせたのがベースになり、
入力したノーマルマップのBlueチャンネルを乗算したり、Curvatureをブレンドしたりします。
幾つかのマップで試して見ましたが、今のところ、見た感じがフォトスキャンで生成したAOマップっぽい感じが出ているかと思います。
添付しておきます。
Nor2AO

さて、話題は変わりますが、MODO10.2。
10.1は色々とバグだらけで、すぐに落ちたり、動作が妙に重かったりしましたが、今のところそのどちらも解消されているように思います。
最も嬉しいのは、スクリプトを実行したときの遅延がなくなっていることでした。当たり前のことなのですが、正直一番きつかったです、、
で、本日MODOとUnityのセミナーがありましたので、参加させていただきました。

 

10.2が昨日リリースされたことを受け、初めの方で10.2の新機能を説明していただきましたが、
説明されている方の声を聞いてびっくりしました、、MODO Japanのブログで動画解説されている方だったのですね。
いつもありがとうございます。

 

中々仕事でMODOを使える機会が減りましたが、久しぶりに旧知の人に会えたような感じで、良かったです。
是非ともこれからは安定したバージョンのリリースをお願いします。

V-Ray for MODO 2

vrayRenderEames01

結局V-Rayでレンダリングしておりました。
Unrealははやり、ライトマップが面倒なので、やめにしました。
ひたすらVrayMODOをいじり倒していたのですが、中々いい具合の設定が見つけられずに、しかもMODO10が落ちまくり、遅々として作業が進みませんでした。
なので、MODO8でやることにしたのですが、色味が違うのですねぇ、、
まぁ、設定したばかりだったので、大した苦労はなかったのですが、落ちなくなって快適に作業は進みました。

 

しかし、どうにもレンダリングするごとに勝手に画像サイズを変更されたり、
幾つかのジオメトリが表示されずにレンダリングされたりと、不可解な現象に悩まされました。
RTレンダリングと交互に行うと、解消されることがあるので、バグなのでしょう。早く直してください、、

 

サブスタンスではこんなものを作ってみました。
2016_10_07_6012
サブスタンス上で形状を作って、立体化させて、破壊を施す。というグラフです。
数学の知識があれば、入力した形状を三次元で変形させる仕組みが出来るのでしょうが、無いのでできません。

Architectural 建築モデリング 日本語版

ものすごい今更ながら、なのですが、「Architectural 建築モデリング」のチュートリアルをやってみました。

 

このチュートリアル、modo302の時に作られたようです。
因みに英語版だと、ただで見ることができます。

 

ここ数年、仕事上はMayaでしかモデリングが許されない環境で、渋々Mayaを使っております。
確かに2016では、それ以前と比べ大幅にポリゴンモデリングの機能が増え、格段にモデリングはしやすくなっているのですが、MODOに比べてしまうとやはりその差は大きいです。
久しぶりに、モデリングとは楽しいものである、ということを感じることができました。

 

ビデオは3本で、約30分2つと約40分が一つ。
恐らく操作に慣れていれば、ビデオを止めることなく、作業が出来るかもしれません。なので、再生時間が完成の時間になりうるかもしれません。
ただ、このビデオの問題は、単位がインチ、フィートであること、があげられると思います。入力が面倒くさい、、
そして、場所によっては、指示がいい加減で、このあたりのポリゴン、とか、この辺りまで移動、という表現が出てきてしまいます。
まぁ、仕方ないところでもあるとは思うのですが、、
でも、それがあってもこのチュートリアルは凄い。もっと早くに出会っていれば、と痛感させられます。
未だに色褪せない、数々のテクニックが紹介されております。
MODO10と比較すると、その部分はこうすればもっと手早く出来る、と思うところもありますが、なるほど、と勉強になる部分もありました。
やはり、Mayaにも作業平面と多彩なフォールオフは入れて欲しいなぁ、、

 

で、完成がこちら。
2016_09_18_127
モデリングのみです。
それをUE4に持って行ったのが、こちら
2016_09_18_128
持って行って、ライトマップを焼いただけです。

 

MODO10ではUVの機能も強化されており、「矩形」ツールで歪んだUVを矩形にしてくれる機能や、
変形ツールの「放射状」を「4」で実行することで、マップを強制的に四角形にすることができ、ライトマップの生成に大いに貢献出来るかと思います。
できれば、矩形ツールがもう少し柔軟になってくれるとありがたくはあるのですが。

 

まぁ、まとめてしまうと、久しぶりにMODOでモデリングして、羽を得たような感覚を覚えてしまい、とても楽しかった。ということでした。

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

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

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