20250513_notes - h4us/maebashi-it-architectual-informatics-I GitHub Wiki
第4回 パラメトリック・プロシージャルなモデリング 1 / Geometry Nodes の導入
前回からの補足
--
Geometry Nodes でモデリングをしてみる
サンプルファイル
サンプルファイル内には2つのシーン(「applied」 および 「pre-apply」)があります。
前者はGeometry Nodesノードツリーによって作成されたModifierを適用し、静的なメッシュデータとして書き出したオブジェクトが配置されてあります。
- 1_basic_op(applied シーンのオブジェクト名) <--> Basic ops(pre-apply シーンの Geomery Nodes ノードツリー名)
- 2_mesh2curve <--> m2c_c2m
- 3_instances <--> instances
がそれぞれ対応しています。
一方、pre-apply シーン内のオブジェクト(オブジェクト名にはそれぞれ _gm の接尾辞を付けてあります)は、applied シーン内のものとほぼ同じ形状のオブジェクトですが、Modifier適用前の、Geometry Nodesによってモデリングが可能な状態です。
1_basic_op / Basic ops
Blenderでの通常のモデリング(Layout - Modeling ワークスペースでの作業)を Geometry Nodes で真似てみます。
以前の講義内では...
- ビューポート内にプリミティブのメッシュ(Cube など)オブジェクトを配置
- オブジェクトを選択
- [ Tab ] キーでEdit Modeに切り替え
- Subdivide を実行して分割数を増やす
- いくつかの頂点を選択
- 移動やスケーリングなどの変形操作を行う
...といった手順でモデリングのデモを行いました。これに近い操作を Geometry Nodes によって再現してみます。
アプローチ・解説
- Subdivide Mesh ノード
- 分割操作・新しい面を生成する
- Scale Elements ノード
- 要素のスケーリング・面または辺をスケーリングする
- Set Position ノード
- 要素の移動
- Utilities / Math 系のノード
- 入力元のジオメトリデータから任意の頂点・辺・面などを選択する際の条件設定として使用。
- Scale Elements ノード、 Set Position ノードなどが持っている、 Selection 入力ソケットと組み合わせる。
初めに、Subdivide Mesh ノードで分割数を増やします。 次に、ある条件に基づいてジオメトリ内の特定の頂点のみを選択し、 Scale Elements ノードの Selection ソケットに入力した上で、スケーリングを行えるようにしてあります。
この選択条件の詳細は下記ようなものです。
- Position ノードを用いて、コンテクスト(ここでは ルート階層の Group Input のジオメトリ出力 = Cube プリミティブの各頂点が持つxyzの座標値に相当)の positionの値を読み出す。
- ユーザーが操作可能な入力値 [ z ] および [ width ] から比較するための範囲を決める。ここでは、[ z ] を中心に [ width ] の +-1/2 が範囲となるようにする。
- Position ノードから読み出された値のうちz軸を取り出し、Boolean演算よって上記で決めた範囲のうちに入っていればTrueを、そうでなければFalseを出力。
という処理を行っています。
2_mesh2curve / m2c_c2m
異なるコンポーネントから別のコンポーネントを生成し、モデリングに活用してみます。
この例では、Group Input には Cube プリミティブのジオメトリデータが入力されているので、それを一度 Curve (および Points )に変換し、処理を経て最終的に再度 Mesh として出力します。
アプローチ・解説
- Mesh → Points、Mesh → Curve、また、逆向きの処理。
- Mesh to Curve / Curve to Mesh ノード
- Mesh to Points / Points to Verticies ノード
はじめに、Subdivision Surface ノード(Subdivide Mesh ノードと似ていますが、分割アルゴリズムが異なるバージョンです。[ 参考 ])で面を分割し、分割されたメッシュデータから、Mesh to Curve と Mesh to Points ノードを使ってそれぞれ Curve と Points を生成しています。
これらは最終的な構造物の Curve → 柱、Points → 結節点の球体の部分のベースになっています。
その後、Curve は Curve to Mesh ノードで、Points は Intance on Points ノード(詳細は後述)を経由して再度 Mesh にし、Join Geometry ノードで両者を結合させています。
- 再変換の際、Curve to Mesh ノードに指定しているプロファイルの Curve Circle ノードと、Intance on Points ノードでインスタンスに指定している UV Sphere ノードの径を同じになるようにしています。
- Set Shade Smooth ノードは見た目の調整用です。
3_instances / instances
モデリングにおいて、同じ形状を繰り返し大量に使いたいケースはよくあります。
十数個程度であれば単にコピー&ペーストでも事足りる場合もありますが、数十~数千となると、作業的にも厳しいですし、場合によってはレンダリングのパフォーマンスが下がる事もあり得ます。
この例では、3Dコンピューターグラフィックスにおける、あるメッシュデータの複製を効率よくレンダリングするための技術である「インスタンシング」を用いて、繰り返しのある形状をモデリングしてみます。
アプローチ・解説
- 大量のジオメトリデータの複製を扱う - インスタンシング
- Intance on Points ノード
- Realize Instances ノード
この例では、Group Input の Geometry 出力ではなく、ノードツリー内でプリミティブのメッシュ(Ico Sphere)を作成し、ベースのメッシュとしてモデリングの起点にしています。
はじめに、Normal ノードと Capture Attribute ノードで、面の法線ベクトル(面の向きを表すベクトル)を記憶しておきます。
次に Intance on Points ノードで Points に変換します。この際、2_mesh2curve / m2c_c2mと異なり、プロパティを「Faces」に変更し、変換後の Point が変換前のメッシュの各面の中心にくるようにしています。
変換した Points をベースに、 Instance on Points ノードでインスタンシングを行います。インスタンスには Cone プリミティブメッシュを指定します。
インスタンス化された各 Cone プリミティブを、Rotate Instances で回転させます。先に記憶させておいた Normal の値を用いて、各 Cone プリミティブが、ベースのメッシュの各面に対して外側を向くように回転させます。
インスタンス化された各 Cone プリミティブを、Scale Instances でスケールさせます。Random Value ノードを用いて、xy方向とz方向を別々の範囲でランダムにスケールするようにします。
最後に Join Geometry ノードで、ベースのメッシュと結合させています。
- Normal ノードが2つありますが、 Switch ノードでの切り替えによって片方だけ使用されています。これは Field の評価が接続する場所(コンテキスト)によって異なることを確認するための例です。次回以降の講義内でも解説します。
- Realize Instances ノードは、単一のノードツリー内であれば、無くても基本的に同じ形態をモデリングできます。ただし、Modifierを適用して静的なメッシュデータとして書き出す際などには必要です。