Blender 2.9 の使い方 (16) ジオメトリーノード

前 (グリースペンシル) www.mztn.org 次 (ジオメトリーノード2)


Blender 2.9 のジオメトリノードの使い方

Blender 3.0用に書き換えた記事は こちら です。

Blender 2.92 で追加されたジオメトリノードの解説です。 まず、多くのオブジェクトが散乱したようなシーンを作成する方法です。 後半は、Blender 2.93 で追加された機能を使った例です。

blender28_16.jpg

この記事に関しては、すべて日本語化しないで英語表示のままにしています。 ノードの名称は英語のまま覚えたほうが混乱しなくていいと思います。

ばらまく

まず、1辺が16mの平面と1辺が0.5mの立方体を準備します。

geo_node0_01.png

この平面オブジェクトのモディファイアにジオメトリーノードを設定します。 プロパティのモディファイアタブ(スパナのマーク)で、「Add Modifier」 をクリックして、「Geometry Nodes」を選択します。

geo_node0_02.png

「Editor Type」のアイコンをクリックして、「Geometry Node Editor」を選択します。

geo_node0_04.png

入力となる「Group Input」ノードと、出力の「Group Output」ノードが表示されます。 このままでは何も変化しません。

geo_node0_03.png

メニューから 「Add / Point / Point Distribute」をクリックします。 「Point Distribute」ノードは、バラマキの中心となる機能となり、オブジェクトの表面に、Objectで指定した別のオブジェクトをランダムに配置します。

geo_node0_05.png

「Point Distribute」ノードを「Group Input」と「Group Output」の間に接続すると、平面が消えて、多くの点が表示されます。 「Density Max」の値を大きくすると点の数が増えます。

geo_node0_06.png

メニューから 「Add / Point / Point Instance」を選択して「Point Instance」ノードを「Group Output」の前に接続します。「Point Instance」のObjectの項目に Cube を設定します。 また平面を複製してもう1つ追加して、元の平面の範囲がわかるようにしています。 「Point Instance」のObjectで指定した立方体が追加した平面上にばらまかれています。

geo_node0_07.png

オブジェクトモードでベジェカーブを追加して、プロパティのBevelのDepthの値を修正してチューブ状にします。 サイズとローテーションを調整して、原点から上に伸びたような形状とします。 メニューの「Object / Apply / Rotation&Scale」を実行して角度を0、スケールを1に設定します。

geo_node0_08.png

「Point Instance」のObjectの項目に BezierCurve を指定すると、平面上に多くの曲線が出現します。

geo_node0_09.png

これらの BezierCurve のサイズをランダムに変更するために、「Point Distribute」と「Point Instance」ノードの間に「Attribute Randomize」ノードを追加します。 「Attribute Randomize」ノードの項目を Float、 Attribute項目に scale を設定して、Min と Max に適当に値を入れると、個々のオブジェクトがバラバラのサイズになるのが確認できます。

geo_node0_10.png

次に「Attribute Randomize」ノードを Vector 型で 「rotation」にして、各軸ごとの回転範囲を設定すると個々のオブジェクトの角度を変化させることができます。

geo_node0_11.png

「Attribute Randomize」ノードをもう一つ追加して、角度とスケールの両方を乱数で変化させると、バラバラ感がさらに強くなります。

geo_node0_12.png

「Point Distribute」と「Point Instance」間のノードを複製して、「Join Geometry」ノードで結合します。 上の「Point Instance」に立方体(Cube)、下の「Point Instance」にベジェカーブを設定します。石ころと変な生物っぽくなってきました。

geo_node0_13.png

ノード構成を拡大して表示しました。scale も Vector 型にして、各軸のサイズを変えています。

geo_node0_13a.png

マテリアルで着色し、 Eevee で表示すると、石と草っぽい感じになりました。 平面2つと1つの立方体、1つのベジェカーブで出来ているとは思えませんね。

geo_node0_13b.png

同じノードをもう1列追加して、オブジェクトではなく別のコレクションに入れたキノコをシーンに追加する例です。「Point Distribution」から「Point Instance」を複製して「Join Geometry」でまとめて「Group Output」に接続しています。

geo_node0_14node.png

草の間にキノコが生えたようなシーンの出来上がりです。シーン上に約2000のオブジェクトが存在していますが、元は3つなので軽快に動作します。

geo_node0_14.png

立方体(デフォルトCube)を1つだけ使って、「Transform」ノードで拡大縮小と位置の変更を行い、ベベルモディファイアでテーブルを作ってみました。同じものを多く使う場合にはジオメトリーノードは非常に便利です。 Blender 2.93 では「Join Geometry」で2つ以上のノードを一度にまとめることができて便利です。

GeoNode_Tutorial_02.png

形状の変形

Dynamic Outlines with Blender Geometry Nodes and Eevee というサイトで紹介されている2つの10分程度の動画は、Blender 2.93 のジオメトリーノードのアトリビュートのチュートリアルとして優れていると思います。 これらの動画はBlender 2.93で導入される「Attribute Proximity」という、2つのオブジェクトの距離を設定したアトリビュートに返すノードを使って、平面 (グリッド) の頂点を同心円状にリアルタイムに変化させるサンプルを解説しています。 グリッドから始まって、SVGファイルで作成されたロゴをカーブに変換して、ロゴの立体的なアウトラインを動的に生成するまでの解説です。 英語の動画なので、ノードの構成をゆっくり確認して理解するのは大変でした。

そこで、ロゴではなく立方体を使って簡略化した文章バージョンを作ってみました。 最初に完成品のスクリーンショットです。 立方体を移動させると、それに伴って立方体を中心として平面が波上に変化します。

GeoAttribute08node1_3d.png

最終的に完成するノード構成の全体像です。 ジオメトリーノードの中でも理解しにくいアトリビュートノードが大活躍しています。 順を追って見ていくことにします。

GeoAttribute08node1.png

立方体と平面上の頂点との距離を求める

オブジェクトモードで、メッシュのグリッド(100分割)と立方体を配置します。 グリッドは1辺が約3mに拡大して「Object/Apply/Scale」でスケールを1.0に設定しています。 立方体は1辺が1mのデフォルト Cube のままです。

オブジェクトモードでグリッドを選択した状態で、ジオメトリノードエディタを開きます。 立方体と平面上の頂点との距離を求めるため、「Object Info」、「Transform」、「Attribute Proximity」、「Attribute Color Ramp」ノードを追加して接続します。

  1. 「Group Input」と「Group Output」とは離した位置に、メニューの「Add / Input / Object Info」から 「Object Info」 ノードを追加します。
  2. 「Object Info」 ノードの「Object」項目で「Cube」を選択します。
  3. メニューの「Add / Geometry / Transform」から 「Transform」ノードを追加します。
  4. 「Object Info」と「Transform」の Geometry ソケット(緑の●)間を接続します。同様に LocationとTranslationソケット間、Rotationソケット間、Scale ソケット間の4本を接続します。
  5. メニューの「Add / Attribute / Attribute Proximity」から、「Attribute Proximity」ノードを追加して、「Group Input」と「Attribute Proximity」の Geometry ソケット間を接続します。
  6. 「Transform」の Geometry ソケットと「Attribute Proximity」のTargetソケットを接続します。
  7. 「Attribute Proximity」の Distance項目を「dist」というアトリビュート名とします。
  8. メニューの「Add / Attribute / Attribute Color Ramp」から「Attribute Color Ramp」ノードを追加して、Attribute項目を「dist」というアトリビュート名に設定、Result 項目を Col とします。
  9. プロパティの「Object Data Properties」タブの「Vertex Color」で [+] をクリックすると「Col」という名前が追加されます。 これで、「dist」が色に変換されて出力されます。

立方体の近くの平面の頂点カラーが黒く表示されて、距離が0に近いことを示しています。 立方体から離れるほど「dist」の値は大きくなりますが、「Col」の値は「Attribute Color Ramp」ノードで 0 から 1 の範囲に制限されます。

GeoAttribute03.png


立方体からの距離に応じた同心円を求める

「Attribute Proximity」の次に「Attribute Math」ノードを追加して、演算を「Multiply」に設定します。 A を Attribute、B を Float に設定して、A には「dist」、B には数値として 30 を設定します。 Result には「dist_30」として、「dist」を30倍した値を「dist_30」に代入します。新しい名前のアトリビュートは、新しいアトリビュートを指定した名前で作成されます。 各種のプログラミング言語の「変数」を使うのと似ています。

赤枠で示された3つの「Attribute Math」ノードも同様に「cos = cos(dist_30)」、「cos = cos * 0.5」、「cos = cos + 0.5」の演算をしています。 結果として、「dist」を30倍して cos 関数を適用して、±1の結果を「0-1」の間の値に変換しています。 Geometry ソケットを接続していても、接続順にアトリビュート名の変数を使って演算をしているだけと解釈できます。

緑の枠では前と同じように、cos の値を頂点カラー(Col)に変換して表示しています。 結果として、立方体からの距離に応じてグリッドの頂点カラーが「0-1」の間の値で変化していることが確認できます。

GeoAttribute05.png


遠くの波の高さを低くする

上のノード構成の、「Attribute Color Ramp」と「Group Output」の間に、さらにノードを追加していきます。

赤枠で囲まれた「Attribute Math」と「Attribute Color Ramp」ノードは「dist_inv = 1 - dist」として、立方体の近くは 1 で、離れるほど小さくなる値に「dist_inv」アトリビュートを設定して、「Attribute Color Ramp」ノードで「dist_inv」を 0 から 1 の範囲に制限しています。

水色の枠内では2つの「Attribute Math」で 「cos = cos * dist_inv」、「cos = cos * 0.5」を計算することで、立方体から離れるほどcosの値が0に近づくようにした後、「Attribute Combine XYZ」で Z軸の値に cos を入れて、座標を表すベクトル(0, 0, cos) を「disp」に代入します。

緑の枠内では、「Attribute Vector Math」ノードを挿入して、組み込みアトリビュートの「position」に「disp」を加算して、実際にグリッドを構成する頂点座標に「disp」を加算することで、グリッドの形状を変化させています。

GeoAttribute06.png

最終型のノード構成を確認する

初めの方で出てきたノード構成の全体像を拡大して見ていきます。ノードの位置は見やすいように移動しています。

黄色の枠の「Group Input」と緑の枠内の立方体との距離を求めて、距離を30倍しています。 その前にジオメトリーモディファイアにパラメータとして「Reach」を追加して距離に乗算することで、ジオメトリーモディファイアの設定から波の間隔を変更できるようにしています。

GeoAttribute08node2.png

赤の枠内は、距離に cos 関数を適用して ±1の範囲の変化に変換して、「cos = cos * 0.5」で±0.5 の範囲の変化に変換しています。

GeoAttribute08node3.png

赤の枠内では、さらに cos の値を 0 から 1 の範囲にした上で、離れるほど小さくなる dist_inv を求めています。 黄色の枠の「Attribute Color Ramp」ノードで「dist_inv」を 0 から 1 の範囲に制限しています。

次に「cos = cos * dist_inv」で立方体から離れるほど波の高さが低くなるように計算しています。

さらにその後で「Group Input」の「Height」と乗算して、全体の波の高さをジオメトリーモディファイアのパラメータ「Height」で変更できるようにしています。

GeoAttribute08node4.png

最後に、黄色の枠内の「Attribute Combine XYZ」で 座標値 disp (0, 0, cos) を組み込みアトリビュートの「position」に加算してグリッドの形状を変化させています。

GeoAttribute08node5.png


スプレッドシートエディタでアトリビュートの値を確認する

スプレッドシートエディタを使うと、アトリビュートとは頂点毎に追加された何らかの属性を示す変数であることが確認できます。 アトリビュート名がアルファベット順に並んでいます。 3次元ベクトルの disp や 4次元(RGBA)となる色は、要素ごとに表示されます。

GeoAttribute08node1ss1.png

最終的に頂点座標の変化は、組み込み属性である「position」で確認できます。 頂点の法線ベクトルは上を向いたままなので、オブジェクトをスムースシェーディグに設定すると正しく表示されません。 将来修正されるかもしれませんが。

GeoAttribute08node1ss2.png

計算の過程で不要になった Attribute は Attribute Remove ノードで削除できます。右上のスプレッドシートで削除されて、列数が減ったことが確認できます。使い終わった変数は削除しておきましょうということですね。

GeoAttribute09.png

ジオメトリーノードエディタに、オブジェクトとコレクション、テクスチャをドラッグアンドドロップできるようになりました(2021-03-16)。

GeometryDragAndDrop.gif


まだ他にも多くの種類のノードが用意されています。 色々な使い方が発明されるのでしょうね。

ページ先頭へ


Blender 2.8 - 4.1 の使い方 [目次]

copyright (C) 2019-2024 Jun Mizutani