ZBrush – VoronoiNoise

そういえば、随分前にボロノイ図の事を書こうとしていたのですが、すっかり忘れておりました。
復習も含めて記事にしておきます。
まずは、こちらのZBrushのノイズをアップしておきます。
LightBoxにあるデフォルトの「DynaMesh128」などのプロジェクトを開きます。
2017_04_20_6139
それに対して上記のノイズを解凍してサーフェイスノイズとして適用します。
2017_04_20_6140
ライトボックスからだと、ファイルをダブルクリックで適用できます。
この状態だと、プレビューで、スフィアの形状にマップとして貼られているように見えます。
これを、「Tool」>「Surface」>「Apply to Mesh」を実行することで、形状に適用でき、
DCCツールでのディスプレイスメントマップを適用した状態になります。
2017_04_20_6141
このノイズ、ZBrushのR7だかR6だか忘れましたが、そのくらいの時期に追加された機能だと思うのですが、
ノイズを2つ掛け合わせる機能を使っております。
デフォルトのノイズと、プラグインのノイズの「Voronoi」です。
個人的には絶妙な加減で調整できたと思うのですが、値を変更することで、様々な形状ができますが、
基本的には岩のベースを作ることを目的としております。
新たな機能を使う理由は、ZBrushのサーフェイスノイズはDCCツールのディスプレイスメントと違い、
二度がけはできません。不可能なのではなく、ZBrushの性質上、トポロジーに依存するところがあるので、
二度目以降はメッシュが崩れてしまいます。なので、この新機能の実装がとても助かりました。

 

Mayaなどでもディスプレイスメントマップを3DTextureとして適用し、リアルタイムでパラメータを設定して
形を作ることはできますが、メッシュの量が増えてしまうと実用的ではなくなります。
ZBrushですと、始めの段階をもっと細かくしておけば、より細密に生成することが可能です。

 

わざわざ岩をスキャニングしなくても、ベースメッシュとして使用に耐えられるモデルを作成することが可能です。
ただ、ベースメッシュがリアリティに寄与する部分は余り大きくありません。
やはり、テクスチャが重要な要素となります。
正しいノーマル、ディライティング処理が施されたカラー、細密なラフネスとオクルージョン。
それらが揃っていれば、ベースメッシュはもっと簡単なものでも十分視覚に耐えられると思います。

 

うーん、結局ボロノイには言及しなかった。

MODO TD SDK – Flip UV Tangent

TD SDKというラッパーがMODO901くらいから入りました。
全然触ってません。
Pymelのように便利だそうですが、色々と不備があるようで、触っておりませんでした。

 

そんな中、随分前に遭遇した問題に、改めて遭遇し、手早く解決できないか、
とTD SDKのお世話になりました。

 

随分と前からずっとそうなのですが、何故かMODOはUVの接線方向を揃えてくれません。
自分も詳しくわからないので、そういう表現で正しいのか知りませんが、MODOでUVラップを実行したモデルを
MayaのUVシェードで見ると、青と赤が入り交じった状態になります。
ゲームデータとしてはよろしくない場合が多いです。
ゲーム開発も視野にいれるのであれば、すぐにでも直してほしいのですが、全然直してくれません、、
Webで調べてみると、同じ問題に遭遇している人はたくさんいるようで、最終的にはMODOにはそれが出来ない。
ということで、諦めているようです。

 

過去の自分がどのような解決をしたのか、思い出せませんが、Mayaで見つけた、それを検出するスクリプトと、
TD SDKでのUV取得の方法を混ぜて、簡易版を作りました。

import modo
flf = []
mesh = modo.Mesh('PulseRifle.lxl (4)')
uvm=mesh.geometry.vmaps['Texture2'][0]
uvValues = []
for p in mesh.geometry.polygons:
	nVerts = p.numVertices
	uvPos = []
	for eachVert in range(nVerts):
		uvPos.extend( p.getUV(eachVert,uvm) )
	uvAB = modo.Vector3( [ uvPos[2] - uvPos[0], uvPos[3] - uvPos[1],1 ] )
	uvBC = modo.Vector3( [ uvPos[4] - uvPos[2], uvPos[5] - uvPos[3],1 ] )
	cross = uvAB.cross( uvBC )
	vec = modo.Vector3([0, 0, 1])
	if modo.Vector3.dot(cross, vec) <= 0:
		flf.append( p )
if flf: 
	[ x.select() for x in flf ]

MODOのスクリプトエディタで実行してください。
抽象化は全くしていないので、メッシュの名前は3行目の「PulseRifle.lxl (4)」を書き換えて使います。
UVセットの名前は4行目、「Texture2」を書き換えて使います。
どちらも存在し、ポリゴンセレクトモードでスクリプトを実行すると、該当するフェースを選択します。
アイランドではないのです。ここは注意が必要です。

 

で、ポリゴンフェースなので、他のポリゴンにつながっている場合もあります。
確認のため、UVを動かしてみて、アイランドであることを確認します。
もし引っ張られるUVががあれば、アンドゥして、引っ張られるフェースの選択を解除します。
完全にアイランドだけの状態であることが確認できたら、アクションセンターで、センターをローカルに
して、スケールツール。
マイナススケールのチェックをオフにして「-100%」をU方向に実行すると、アイランドそれぞれの場所の中心で
UVがU方向に反転されます。
この状態でMayaに読み込むと、全てのUVが同じ青色で表示されます。
図がないとわかりにくいですねぇ。まぁ、備忘録なのでご容赦ください。

 

一応自分の試した限りではうまく動作しました。
ただ、全て人様のものをかいつまんだもので、内容は理解しておりません。場合によっては正しい場所を選択できないのかも知りません。
自己責任でお願いします。

ZBrush – TerrainTools – とりあえずの地形

とりあえずの地形の作成方法を書いておきます。
最も手っ取り早く、それなりものも、という感じのものです。
まずは「1024」のボタンでドキュメントサイズを1024に変更します。
2017_04_03_6128
どうも1024に最適化されているのか、自分が主にそれでやっているからなのか、1024での効果が最も良いように思います。
次にベースを作ります。
「Elevation」をデフォルト値のまま適用します。
2017_04_03_6129
ドキュメントいっぱいに凹凸を付けてくれますが、透明部分があります。
このままだとその部分に効果がかからなくなるので、一旦「Filters」の中の「Crest」をデフォルト値で適用します。
2017_04_03_6130
この状態で再び「Elevation」をデフォルト値で適用します。先程からデフォルト値をしつこく書いておりますが、
もちろん値を変更しても構いません。ただ、それでも十分である、ということです。
2017_04_03_6131
そして、「Slides」を適用します。これもデフォルト値で構いません。
2017_04_03_6132
そして最後にもう一度「Crest」を適用します。
2017_04_03_6133
この状態から侵食を始めてゆきます。
まずは「Hydraulic Erosion III」のプリセット「5」番から。
2017_04_03_6134
そして同じく「Hydraulic Erosion III」のプリセット「1」番。
2017_04_03_6135
そして「Hydraulic Erosion III」の「4」番。
2017_04_03_6136
最後に「Hydraulic Erosion III」のプリセット「6」番を適用します。
2017_04_03_6137
この状態で「Make 3D」を押すと、3Dに変換されます。
2017_04_03_6138
恐らく最終的には他のサイズにしたいときも1kで作成し、後から2k、4kに変換したほうが良いように思います。

 

途中「Terraces」で地層を作ったり「Defrazer」で一部膨らませたりするのもありだと思います。

ZBrush – TerrainTools – Erosion

突然ですが、ZBrushのTerrainToolsのErosion(侵食)のプリセットについて、記事にします。
まぁ、備忘録です。
パラメータが沢山あるので、全部を試すのは大変なので、とりあえずプリセットに登録されている値を比較してみました。
まずは元になる地形をTerrainToolsで適当に作ります。
erosionBase
上図が元になる画像で、これにプリセットを適用してみます。
プリセットといっても、TerrainToolsには、
「Erosion」
「Hydraulic Erosion I」
「Hydraulic Erosion II」
「Hydraulic Erosion III」
と4種類もあります、、
使ってみた感じ、「Hydraulic Erosion III」がそれ以前のものの大抵を内包しているように見受けられます。
もちろんそうではないから残してはいるのでしょうが、今のところ使ってみてそのような印象を受けました。

 

まずはただの「Erosion」
erosion
さすがにパラメータも少なく、2つしかありません。ちょっとぬるい印象を受けます。
次に「Hydraulic Erosion I」ですが、ここからプリセットが追加されますので、プリセットの番号順に掲載します。
Ps1
erosion_I_1
Ps2
erosion_I_2
Ps3
erosion_I_3
Ps4
erosion_I_4

「Hydraulic Erosion II」
P1
erosion_II_1
P2
erosion_II_2
P3
erosion_II_3
P4
erosion_II_4

「Hydraulic Erosion III」
1
erosion_III_1
2
erosion_III_2
3
erosion_III_3
4
erosion_III_4
5
erosion_III_5
6
erosion_III_6

 

以上です。
始めのうちは色々と使っては見たのですが、最終的には「Hydraulic Erosion III」に落ち着きました。
5で、細かな凹凸を作成し、1で裾野の情報量を増やし、3か4で必要があれば深い谷を作り、6で川筋を作成する。
というのが、今のところ定番です。
2はちょっと侵食が強すぎ、砂っぽい地形の作成に特化した感じがします。

 

次はとりあえずのベースの作り方を書いておきます。

SubstanceDesigner – HeightBlend

2017_04_01_6086
そういえば、SubstanceDesigner5.6から「HeightBlend」というノードが加わりました。

 

カテゴリ分けが謎で、「Material Filter>Effects」にあります。
恐らく「SnowCover」や「WaterLevel」などを優先させた結果なのでしょう。
Blendingの方に無いので、たまに見失います。

 

やっていることは特に変わったことではなく、2つのHeightMapを混ぜ合わせてくれます。
Substanceでテクスチャを作っていると悩ましい問題の一つに、どのタイミングでノーマルにするべきか、
というものがあるかと思います。
以前フォトスキャンされたジオメトリを、ZBrushでカラーとDisplacementMapを出力し、
SubstanceDesignerでそれらの情報を元に、各種マップをシームレスにして生成する。というノードを作りました。
はじめはハイトの高さを見てブレンドすれば、簡単で尚且つ回転が出来るではないか、と作ったのですが、
16bitをなめておりました、、情報量が圧倒的に多く、そんな簡単にはできなかったので、
ノーマルを生成して、からブレンド、というようにしました。

 

今回はこんな感じに、「BnwSpot3」と自作の岩っぽいノードを組み合わせてみます。
2017_04_01_6084
2017_04_01_6085
で、ブレンドしてできたのが一番はじめの画像です。

 

もう少しわかりやすく、幾何学的なものを使います。
2017_04_01_6088
これがデフォルト値で、
2017_04_01_6090
こちらが値を変化させたもの。
埋まり具合が調整できます。
幾何学的、人工的なものはノーマルからハイトに戻すと残念な結果になってしまいます。
なので、こういったノードがあるととても助かります。

 

それと、関係ないのですがTerrainTools。
2017_04_01_6087
SDのマテリアル、岩と緑を使ってみました。
ちょっと暗いですが、実機に乗せる、となるとユニークで全データを持つのではなく、マスクとテクスチャで持つ必要があります。
なので、問題はどのようなマスクを作るか、にかかってきます。
ツールの使い方はまた今度、備忘録として書いておきます。

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より便利かも、、

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

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

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