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

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

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

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