-
Notifications
You must be signed in to change notification settings - Fork 0
20240507_notes
サンプルファイル内には2つのシーン(「Scene」 および 「pre-apply」)があります。
前者はGeometry Nodesノードツリーによって作成されたModifierを適用し、静的なメッシュデータとして書き出したオブジェクトが配置されてあります。
- 1_basic_op(Secneシーンのオブジェクト名) <--> Basic ops(pre-applyシーンのGeomery Nodes ノードツリー名)
- 2_mesh2curve <--> m2c_c2m
- 3_instances <--> instances
がそれぞれ対応しています。
pre-applyシーン内のオブジェクトは、Sceneシーン内のものとほぼ同じ形状のオブジェクトですが、Modifier適用前の、Geometry Nodesによってモデリングが可能な状態です。

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 ノードで分割数を増やし、math ops グループノードで算出された値を選択条件として Scale Elements ノードの Selection ソケットに入力した上で、スケーリングを行えるようにしてあります。

この選択条件の詳細は math ops グループの下層にあり、そこでは、
- Position ノードを用いて、コンテクスト(ここでは ルート階層の Group Input のジオメトリ出力 = Cube プリミティブの各頂点が持つxyzの座標値に相当)の positionの値を読み出す。
- ユーザーが操作可能な入力値 [ z ] および [ width ] から比較するための範囲を決める。ここでは、[ z ] を中心に [ width ] の +-1/2 が範囲となるようにする。
- Position ノードから読み出された値のうちz軸を取り出し、Boolean演算よって上記で決めた範囲のうちに入っていればTrueを、そうでなければFalseを出力。
という処理を行っています。

異なるコンポーネントから別のコンポーネントを生成し、モデリングに活用してみます。
この例では、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 ノードは見た目の調整用です。

モデリングにおいて、同じ形状を繰り返し大量に使いたいケースはよくあります。
十数個程度であれば単にコピー&ペーストでも事足りる場合もありますが、数十~数千となると、作業的にも厳しいですし、場合によってはレンダリングのパフォーマンスが下がる事もあり得ます。
この例では、3Dコンピューターグラフィックスにおける、あるメッシュデータの複製を効率よくレンダリングするための技術である「インスタンシング」を用いて、繰り返しのある形状をモデリングしてみます。
- 大量のジオメトリデータの複製を扱う - インスタンシング
- Intance on Points ノード
- Rotate Insances ノード
- Scale Instances ノード
- 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 の評価が接続する場所(コンテキスト)によって異なることを確認するための例です。次回以降の講義内でも解説します。
- Rotate Instances および Scale Instances ノードでの処理は、今回の場合であれば Instance on Points ノードの Rotation および Scale ソケットにそれぞれ繋ぎ変えても同じ結果になります。
- Realize Instances ノードは、単一のノードツリー内であれば、無くても基本的に同じ形態をモデリングできます。ただし、Modifierを適用して静的なメッシュデータとして書き出す際などには必要です。