Skip to content

20240521_notes

Takanobu INAFUKU edited this page May 28, 2024 · 5 revisions

第6回 Blender / Geometry Nodes 応用 2

サンプルファイル

https://github.com/h4us/maebashi-it-architectual-informatics-I/releases/download/20240521/demo_20240521.blend

今回のサンプルファイルのは例ごとにシーンを分けてあり、静的なメッシュとして書き出しているものはありません。

各シーンにそれぞれノードツリーを作成したサンプルがあります。

  • Object Info
  • Raycast Selection
  • Complex Select manipulation

Object Info

fig1

Object Info ノードを使ってノードツリーを作成しているオブジェクト以外のオブジェクトのジオメトリデータをノードツリー内で扱うサンプルです。

アプローチ・解説

fig2

Object Info ノードで、同一シーン内にある別のオブジェクトである Monkey プリミティブを、Mesh to Points / Mesh to Curve ノードによる変換と再メッシュ化を行ってワイヤフレームのような構造を作成しています。

Object Info ノードの次段にある Merge by Distance ノードは、頂点間の距離に応じて分割数を減らして(頂点をまとめて)います。

Object Info ノードで参照するオブジェクトの頂点数が極端に多い場合など、処理が重くなったりBlenderがフリーズすることがあるので、必要に応じて値を調整できるようにしてあります。

Raycast Selection

fig3

変形操作対象とするジオメトリデータの選択方法に、「レイキャスト」呼ばれる、3DCGにおける光の当たり方をもとにした手法を採用しているサンプルです。

アプローチ・解説

fig4

ノードツリー内でベースとなるオブジェクトとして、 Grid プリミティブで格子状の平面を生成します。

Object Info ノードで外部オブジェクト(このサンプルでは同一シーン内の Monkey プリミティブ)を参照し、 Raycast ノードで Grid から上方向(z = 1)に光線を飛ばし、ヒットした場所までの距離をそのまま Instance on Points + Curve Line (この組み合わせにより、グリッドの格子の各点からz軸方向に線が立ち上がっている状態)のz軸のスケールとすることで、レイキャストのターゲットとした Monley プリミティブを支える柱のような形状を生成しています。

Complex Select Manipulation

fig5

本サンプルでは、 Normal ノードによって参照しているオブジェクトの各面がどの方向を向いているかを選別し、ある特定の方向を向いている面の周囲を決められたルールに従って平滑化することで、最終的に台地のような平たい箇所を変形によって追加する例です。

アプローチ・解説

fig6

このシーンでは、 Object Info ノードによってシーン内の別オブジェクト(Monkey プリミティブ。参照元はシーン内では非表示にしています)を参照し、Subdivision Surface ノードで分割数を調整したのち、 Separate Geometry ノードと Normal ノード + Compare ノードによる比較で上方向を向いている面のみのジオメトリデータを抜き出しています。

次段では Delete Geometry ノードによって抜き出したジオメトリデータからノイズを取り除いてグループ分けする作業

  • Mesh IslandAccumulate Field では、抜き出したジオメトリデータのうち、連続した面がある閾値よりも少ないもの(頂点・辺などが隣接しておらず、少ない面の数で孤立してしまっているグループ)を選別し
  • さらにそこから、Face Neighbors ノードで同一グループだが頂点1つのみ(面として隣接してるものが0)でつながっている面も削除

を行っています。

この抜き出したジオメトリデータをもとにして、最終的に参照元のジオメトリデータを変形するために Set Position ノードに入力する値を算出します。

ノードツリーの下部にある、Position / Mesh IslandAccumulate Field ノードの組み合わせと Divide (Vector Math) ノードによって、抜き出したジオメトリデータのグループごとのz軸の平均値を出します。

Geometry Proximity / Sample Nearest / Sample Index ノードと Mix ノードで元のジオメトリデータから滑らかにつなげつつ、各グループを(各グループごとの)前述の個所で算出したz軸の平均値を適用して、押しつぶすような変形を行います。

次回講義のための下準備

https://www.geospatial.jp/ckan/dataset/plateau-10201-maebashi-shi-2023

のCity GML(v3) というデータを各自ダウンロードしておいてください。(*ファイルサイズが結構大きいです)