#SubstanceDesigner 上手くいく3Dモデルのノーマルマップベイク

Rebuild Factoryzの礒です。
今回はSubstance Designerの記事を書いていきます。
今回のお題は3Dモデルのノーマルマップベイクについてです。

ノーマルマップがうまくいかないときの対策法をひとつご紹介。


左がうまくいっていないノーマルマップベイクで、右がうまくいった状態です。

3Dモデルデータの準備

まず低解像度の3Dモデルデータを用意します。
UV展開もきちんとしておきます。
FBXで出力しておきましょう。

次に高解像度の3Dモデルデータを用意し、FBXで書き出します。

Substance Designerでリンク

Substance Designerを開き、新規Substanceを作成。
パッケージを右クリックしてLink > 3D Meshと選択します。

リンクしたら、Resourcesフォルダに3Dモデルデータが格納されているので、それを3D Viewにドラッグアンドドロップします。

ノーマルマップベイク

では、エクスプローラーの3Dモデルデータを右クリックしてBake model Informationを選択します。

高解像度の3Dモデルデータを読み込みます。

Add BakerでNormal Map from Meshを選択します。
そしてStart Renderを押します。

これでノーマルマップがベイクされました。
結果を見てみましょう。

エクスプローラーからできたノーマルマップをグラフ内にドラッグアンドドロップして、ノーマルのOutputにつなぎます。
次にグラフ内を右クリックしてView Outputs in 3D Viewを選択します。

どう見ても失敗です。
原因はノーマルマップの範囲設定にあると考えられます。

解決策

再度3DモデルデータのBakeを開き、黄色い枠でかこった数値をいじります。
先ほどはデフォルトの0.01でしたが、今回は0.1にします。

これでStart Renderを押しましょう。

今度はうまくいってる気がします!

グラフのほうに戻って確認してみましょう。

うまくいってます!

推測ですが、Distanceの量が小さいとノーマルの凸凹がうまく読み取れないようです。

まとめ

ノーマルマップのベイクがうまくいかないときは、Distanceを疑え!

ということでした。

終わり

では今回はこれで終わります。

#Houdini 18.5 建築:屋根の自動判定

Rebuild Factoryzの礒です。
今回は建築物モデリングのお話です。

以前の記事:https://houdinist.jp/2020/11/10/archi/で紹介したtopとwallとbottomの3つにプリミティブのアトリビュートを設定しました。

今回はそこから発展して、屋根の自動判定をしていきたいと思います。
階数が変わっても一番上にあるプリミティブが屋根だと判定できるようにします。


初期ジオメトリ

このジオメトリは以前の記事の発展版で、プリミティブのアトリビュートでtop,wall,bottomの3つが設定されています。

topが設定されていても、それが一番上かどうかはわかりませんね。
そこを判定するのが今回の記事の目的です。

topだけを抽出

Blastノードでtopアトリビュートを持っているプリミティブだけを残します。

高さのアトリビュート作成

VEXで

f@roof_attribute = @P.y;

と入力し、Y軸方向のポジション値を@roof_attributeに代入します。
つまり高さのアトリビュートを作って、各プリミティブがどれぐらいの高さなのかを認識できるようにします。

最大値をいったん計算

先ほど作成したroof_attributeという名前のアトリビュートをPointからDetailに変更します。
Promotion MethodをMaximumにしておきます。
これで最大値がDetailに入ります。

Pointのアトリビュートに戻す

アトリビュートをDetailからPointに戻します。
これで各Pointに高さの最大値が入ったアトリビュートを割り当てることができます。

最大値と同じプリミティブを探す

if(@P.y != @roof_attribute){
     removepoint(0, @ptnum);
 }

Y軸方向のポジション値がアトリビュートroof_attributeと異なる場合、その点を削除するコードを書きます。

残ったプリミティブのfacingというアトリビュートにroofと代入します。

これでroofというアトリビュートを持ったプリミティブを作成することができました。
今回使っている例ではroof以外のtopをbalconyに入れ替えてます。

階数が変わってもroofが自動生成されるようになっています。

まとめ

今回の記事では、最初アトリビュート@facingにはtop、wall、bottomの3つが設定されていましたが、そのうちtopだけを抽出してアトリビュートを変更しました。

topのプリミティブの高さの最大値を出して、それと同値じゃないポイントを削除し、残ったプリミティブのアトリビュートにroofを代入。

これによって今後roofだけに対して屋根を置くことができる。

まだ実験中なので、完成してはいませんが、屋根を生成する作業をちょこちょこっとやってます。

終わり

では今回はこれで終わります。

#SubstanceDesigner 3Dモデルのエッジに傷をつける

Rebuild Factoryzの礒です。
今回はHoudiniではなく、Substance Designerの話をしようと思います。

HoudiniとSubstance Designerはノードベースというところで似ているので、とっつきやすいテクスチャ作成ツールかなと思います。
ただ、3Dモデルを持ってきてそれに合ったテクスチャを作るにはちょっとコツがいりますね。

なかなかそういう情報も出回らないものですから、備忘録として書いていきたいと思います。


やりたいこと

3Dモデルを用意し、それをSubstance Designerにリンクさせてテクスチャを作成していきます。

はじめに

最初に新しいグラフを作っておきましょう。
この辺はSubstance Designerを使ったことがある方ならスムーズにいけるでしょう。

今回はシンプルにBase ColorとAmbient Occlusionの2つだけのOUTPUTにしておきます。

3D MeshをLink

エクスプローラーにあるパッケージを右クリックし、Link > 3D Meshと選択していきます。

Linkさせたい3Dデータ(fbxなど)を選択します。

エクスプローラーをみると、Resourceというフォルダが追加され、その中に読み込んだ3Dモデルがあります。
それを3D Viewにドラッグアンドドロップしましょう。

これで3Dモデルを見ながら作業ができますね。

テクスチャマップをBake

エクスプローラーの3Dデータを右クリックし、Bake model informationを選択します。

左下のBakers render listにあるAdd Bakerをクリックし、Ambient Occlusion Map from Meshと

Curvature Map from Meshを選択します。

Setup High Definition MeshesでUse low as high definitionにチェックを入れておきます。

画面下のほうにあるStart Renderをクリックし、MapをBakeしていきます。
完了したらCloseを押して閉じましょう。

グラフに配置

できた2つのMapはエクスプローラーに追加されています。
ドラッグアンドドロップでグラフ内に配置してみましょう。

Ambient OcclusionをOutputにつなげてみます。
特に変化ありません。

グラフ内を右クリックし、View Outputs In 3D Viewを選択します。

Base Colorにもつないで結果を見てみます。
3D Viewに反映されていることがわかります。

Edgeを汚すノードを追加

エッジに経年劣化に近い傷を付けようと思います。
そこでMetal Edge Wearを追加。

このノードのInputに注目。
Ambient OcclusionとCurvatureはBakeしたのでありますが、それ以外のPositionとWorld Space Normalというのがありませんね。
ということで再度Bakeしましょう。

Bake

1回目のBakeと同じように、エクスプローラーの3Dデータを右クリックしてBake model informationを選択します。

Add BakerでPositionとWorld Space Normalを追加します。
Ambient OcclusionとCurvatureはすでにあるのでチェックを外しておきます。

あとはStart Renderを押してBakeしてCloseで閉じましょう。

ノードのInputにつなげる

では早速作ったMapをドラッグアンドドロップでグラフに追加。
そして先ほど作ったMetal Edge WearノードのInputにそれぞれつないでいきます。

Outputにつないでみる

試しにBase Color Outputにつないでみましょう。
ご覧の通り3Dモデルのエッジ周辺に白い傷が追加されました。

あとは人ぞれぞれ活用の仕方は違うと思いますが、僕の場合はBlendを使って、Backgroundの色は白くして、Foregroundに赤さびのような色を入力します。
そしてOpacityに先ほど作ったMetal Edge Wearノードの出力をいれます。

まとめ

今回は適当に作った3Dモデルだったので解像度が低く、若干効果がわかりづらい部分もあったかもしれませんね。

3Dモデルを使ってSubstance Designerでテクスチャを作るという制作フローはあまりメジャーじゃないっぽくて、ググってもなかなか情報にたどり着くことができません。
Youtubeで探してもほぼないですからね。

検索結果の大半がSubstance Painterです。

僕はノードを組み合わせてモデリングしてテクスチャもノードでやりたい頑固な人間なので、Substance Designerでテクスチャを自由自在に作れるようになりたい…!

終わり

では今回はこれで終わります。