見出し画像

Geometry Nodeで木を作る_法線転写_Blender3.6

本記事はこちらの動画で使用している台本兼資料となります。


stylized foliage
モデリングとしての考え方はLightning Boy Studioさんのチュートリアルを基にしています。基本的にはこれをBlenderのGeometry Nodesだけで出来ないか、と言う内容になります。
ですから、どう形状を整えるかと言うのはこちらの動画を見てみて下さい。
個人的に、法線コピーのために別オブジェクトを用意するのが嫌なので、元のオブジェクトの法線を使えるようにノードを組んでいきます。

基本的な設計

  1. 最小単位になるblobを作成

  2. 入力ジオメトリの面にblobをランダム配置する

  3. 法線をコピーする

  4. インスタンスの位置やカラーの調整

  5. 大体完成ですが平面に圧縮してみましょう

早速順番にノードを組んでいきましょう。かなり短いノードで出来ますので良ければ見ていってください!

1.最小単位になるバブルを作成

適当な木の葉の概形形状を出しておきます。この段階でもっと凝った形状にしても良いでしょうが、まずはこれで行かせてもらいます。

木の形状としてちょっとどうか?広葉樹だとするともう少し横に広がった枝ぶりの方が自然?

これに細かいパーティクルを生やしますので、先ず最小単位になる葉っぱの塊、 blobを作成します。

ICO球の頂点に更に球を配置します。
広葉樹を想定していますので丸っこいblobですが葉っぱの形状によっていろいろ工夫できるでしょう。

2.入力ジオメトリの面にバブルをランダム配置する

そしたらこのblobを元のオブジェクトに生やします。

  • 「面にポイント配置」で元のオブジェクトにランダムポイント生成

  • blobの量は密度で調整します

  • ポイントに先ほど作ったblobを配置

  • blobそのままだと大きすぎるのと、木の葉にランダム感を出すためにインスタンスのスケールにランダムを入れて調整します。

スケールを良い感じに調整します。密度はとりあえず適当に

3.法線をコピーする

ここからが大事な所ですが、この時点で普通にマテリアルを当ててみるとこんな事になっています。(↓画像)

これはとても木の葉には見えません。Ugly!

本来はfoliage(木の葉全体)も小さな形状の集まりですが、特にイラストでは一つ一つ葉の形を描けば良いという訳では無いですね。細かい形態は残しつつ適度に塗りつぶした様な風合いにしたい所です。

名前付き属性格納で概形オブジェクトのノーマルを格納しましょう。
その後マテリアル設定でシェーダーノードを指定してください。(シェーダーノードの中身は後から出てきます)

ベクトル、インスタンスで格納していますので、手前で配置している‘‘インスタンス毎”に、そのインスタンスが配置された点のノーマル、のベクトルデータを格納したことになります。
分かりやすいように元の法線からどう変化していくか、ノーマルをカラーとしてプロットした物を見てみましょう。
(ベクトルで格納と言っていますが、(X,Y,X)と(R,G,B)で扱いが同じ、カラーで保存しているのと同じことですね)

左が元々の法線、概形オブジェクト(中)の法線をインスタンス毎にコピーする(右)

一粒一粒のインスタンスがそれ自体の立体感(ノーマル)を失って塗りつぶされた様に見えます。
これだけで割と良い見た目になっています。格納したベクトルをシェーダー内で使用する方法は下にありますのでご確認ください。

ノーマルが複雑に重なり合うので面白い質感になります。
シェーダーのノーマルに格納したベクトルをつなぐだけです。

4.インスタンスの位置やカラーの調整

ここは簡単な調整となります。少し形が整い過ぎているように思いますのでインスタンスの位置に少しばらつきを入れてみましょう。インスタンスを生やす際に、「インスタンスのZ軸」を「元オブジェクトの法線方向」に合わせていますから、インスタンス移動でZ軸にランダム値を入れるだけです。

形がいい感じに崩れます

葉っぱの色にもう少しランダム感が欲しいですね。先ほどと同じように名前付き属性格納を追加しますが今度は単純に0~1のランダム値を入れるだけです。これはつまりインスタンス毎に黒~白のカラーを与えているのです。

少しまだら模様になって質感が増しましたか?
ベースカラーに黒白のカラー情報をつないであげましょう。

5.大体完成

ジオメトリーノードで作っているので元のオブジェクトの変形にもついて来ます!

6.おまけ、疑似的に平面に圧縮、軽量化

もう完成にしても良いのですが、平面に圧縮すると言うニーズもあるようです。ついでに同時に軽量化も検討して見ましょう。

すでにノーマルをカラーとして格納しているので圧縮してもディティール感は失われません。
さらに1方向から見た時だけ成り立てば良いなら、裏側や側面にはパーティクルは必要ないですね?

スケールは単純に

ここではY軸方向に圧縮するとして、圧縮方向と元法線の内積を取り、これを密度につなぎます。内積の結果はY軸前方が1、側面が0(裏側も0ですわね)となりますから、これを密度につなげば無駄な部分のデータを軽量化できます。

内積の値をプロット
結果こうなります。圧縮前の法線を保持しています。

Y軸ではなく、カメラ方向から常に圧縮、みたいなことも出来そうですがあまりやる意味を見出せないので割愛します。

終わり。 Thanks.

ここまで読んで下さってありがとうございます(^_-)-☆ 最後に全ノードを添付します。最初からこれだけあれば他は要らない? まぁそう言わず。

何とか全部入るかな。
English ver.

もっと枝を細かく生やして制御したり、葉っぱも手書テクスチャを使うような方法も考えられますがその辺りは今後必要になった時にまたやってみたいと思います。

後あれですね、今回はオブジェクトから直接パーティクル生やしているのでノーマルもそのまま使っていますが、元のオブジェクトと関係キレてしまっているような場合、例えばボリューム化してからパーティクル散らすような場合ですが、これでも最近接表面サンプリングとかでノーマルを取ることができます。

針葉樹林の形状なんかかも挑戦してみたい所ですよね。
針葉樹の場合はどっちかと言うと枝ぶりによる形状なので今回みたいに葉っぱで良い感じにごまかす感じにはならなそうですが。。。
その他ご感想、こんな形状が作れないか、と言うのがありましたらコメントしてみて下さい。出来るかは分かりませんが検討して見たいと思います。
ではでは。


この記事が気に入ったらサポートをしてみませんか?