【ジオメトリノードの選択を使いこなす】任意の面・辺・点にオブジェクト出し分ける方法(メッシュ編)
- 投稿日/更新日
追記:2024/10/17「マテリアルを条件に配置する」を追記
シーンにあるメッシュオブジェクト上に、ジオメトリノードでなんらかのオブジェクトを生やしたりするとき、「上を向いた面だけにオブジェクトを置きたい」「辺が縦のものだけに柱のオブジェクトを置きたい」「ランダムに生成したい」なんてことがあると思います。そこで、ジオメトリノードでどのような制御が必要かを整理してみました。カーブ編は別の記事でまとめています。
- 基本
- オブジェクトの辺・面・頂点どこに配置するか
- 法線の方向に向ける
- 任意の面だけに配置する(法線を使用)
- オブジェクトの角にだけ配置する
- 任意の辺だけに配置する
- インデックス番号で配置する
- 頂点グループで配置する
- ランダムに配置する
- ランダムに配置する2(面にランダム)
- マテリアルを条件に配置する
基本
基本となるオブジェクトとしてこのような凸凹のものを用意しました。法線(ノーマル)はすべて外側を向いています。辺の長さは1mで、一部制御はこの数値を利用します。
基本的なノードとしてポイントにインスタンス
を利用します。今回は適当に円柱
を配置することにしました。
メッシュの頂点がポイントとして扱われるので、頂点がある場所に円柱が配置されました。この円柱を面や辺に置くにはどういうノードを組むのか、円柱の方向をどう制御するのかを紹介していきます。
オブジェクトの辺・面・頂点どこに配置するか
面
面の中央に円柱を配置したい場合は、メッシュのポイント化ノード
を利用します。リストボックスから「面」を選ぶと、面の中央に円柱が配置されました。
辺
リストボックスから「辺」を選択すると、辺の中央に配置されます。
コーナー
リストボックスには「コーナー」という選択肢もあり、各面ごとの頂点を指定できます。通常は頂点が重なっているので円柱も重なっています。上記例ではランダムで回転を入れており、各頂点に複数の円柱が配置されていることがわかります。通常はあまり使わないかなと思います。
基本と同じなので省略しますが、「頂点」を選択すると頂点に配置されます。
法線の方向に向ける
ノーマル
・属性キャプチャ
・オイラーをベクトルに整列
の3つを使用します。
各円柱が面に対して垂直に設置されました。メッシュのポイント化
を行うとメッシュのノーマル情報が引き継がれないため、属性キャプチャ
を使用してノーマル情報を引っ張ってくる必要があります。オイラーをベクトルに整列
は場合によってXYZを変えてみる必要があります。
任意の面だけに配置する(法線を使用)
法線が上の向きだけにオブジェクトを配置したい、Y軸方向のものだけに配置したいといった場合は、比較ノード
を利用します。
たとえば、法線が上向きの面だけ配置したい場合、ベクトルとしてはZ軸が上、つまりベクトル(0,0,1)となります。比較ノード
でベクトル
の要素を比較し、同じ
のものだけを表示させます。
Z軸が下向きの面面だけを指定したい場合は(0,0,-1)ですね。同様に数値を変更することで、X軸方面だけ、Y軸方面だけといったことも可能です。
イプシロンについては正直よくわからないのですが、指定したノーマルの数値のゆらぎ、みたいなものだと解釈しています。同じジオメトリノードをUV球にあててみたのが上記図です。このUV球は完全に上方向を向いている面が無いため、イプシロン値0.1では何も表示されていません。そこでイプシロンの数値を変化させていくと、Z方向上向きに近い(1に近い)面から円柱が生えていくのが分かると思います。デフォルトの数値は0.1となっており、この数値を0にすると何も表示されなくなります。通常は0.1とか0.01とかで良さそうです。
オブジェクトの角にだけ配置する
頂点情報ノード
(Vertex Neighbors Node)を使用します。
頂点情報とは、その頂点にいくつの頂点が接続されているかになります。それはすなわち辺がいくつ接しているかと同意義にもなります。今回の場合、角は必ず接続する辺が3になっているので、比較ノードで3と同じものに配置させることで実現できました。
任意の辺だけに配置する
辺の制御を行う場合は辺の頂点ノード
(Edge Vertices Node)を利用します。このノードでは辺を構成する頂点の距離差がどれだけあるかがわかります。位置1と位置2にある頂点を減算
し、その差が一定以上ある場合は円柱を表示といった条件式になります。今回は辺の長さが1mのメッシュなので、差が1の場合は表示といった条件になるため、数式ノードのZ方向に1と入れています。絶対ノード
は、差がマイナス値になった場合も正の値に変換しているだけなので、場合によってはいらないかもしれません。
インデックス番号で配置する
配置したい頂点や面のインデックス番号で制御する場合は上記のようなノードを組みます。当然ながら、メッシュを加工するとインデックス番号が増えたり変わったりするので、使い所しては限定的な気もします。
インデックス番号をビューへ表示させるには、Blenderのプリファレンス画面からインターフェイス
>開発者用オプション
にチェックを入れ、メッシュを編集状態にしたときのビューポートオーバーレイ
からインデックス
にチェックを入れます。
頂点グループ(ウェイトペイント)で配置する
いちいちノードを組むのがめんどくさい、指定した頂点だけに配置したい場合は、頂点グループを使うと楽に配置できます。
やり方は簡単で、頂点グループに割り当てた後、名前付き属性ノード
で頂点グループの名前を指定し、選択につなぐだけです。
ウェイトペイントと面にポイントを配置
ノードを使えば、任意の場所にポイント群を置くこともできます。
ランダムに配置する
ポイントにインスタンス
の選択にランダム値
をつなぎます。あまり直感的ではないかもしれませんが、ドキュメントによるとこの選択は「各ポイントでインスタンスを作成するかどうか。true 値はポイントでインスタンスが生成されることを意味し、false 値はポイントがスキップされることを意味します」と書かれています。各ポイントで、True=1、False=0がランダムで設定され、Trueの場合は表示されるという仕組みなんですね。なのでランダム値
は整数で設定し、最小が0、最大が1を設定しておきます。
ランダムに配置する2(面にランダム)
面にポイント配置
を使うと、メッシュの面にランダムでポイントを生成することができます。密度やシードなどでお好みでオブジェクトを配置することができ、回転属性で向きの情報も引き継がれます。
この面にポイント配置
の結果にランダム値
をつなぐことで、ランダムに作られたポイントをさらにランダムで選択してオブジェクトの生成を行うことができるのもユニークな点です。
あたりまえですが、整数の1をつなぐと、すべてのポイントがTrueになるのですべてのポイントに生成されます。ちょっとしたスイッチングでも使えますね。
マテリアルを条件に配置する
上記図では1つのキューブにA(青)・B(黄)・C(赤)のマテリアルを当てています。このうちCのマテリアルを当てた面にのみ配置する方法です。
まずジオメトリノードのグループソケットで、入力ソケットを一つ作り、タイプを整数
にします。そうするとモディファイアにソケットの項目が追加されますので、右側の四角に+ボタンをおして、material_index
を選びます。この操作は慣れないと間違えやすいので、何度も試してみてください。
次にジオメトリノードを上記のように組みます。ソケットから引っ張ってくる条件ノードの下に「2」と入れています。これがマテリアルのINDEXが2の時にのみ表示させるという条件になります。マテリアルインデックスはこのブログでも何度も登場してますが、登録しているマテリアルの上から0番となるため、A(0番)・B(1番)・C(2番)という意味になるんですね。ジオメトリノードは面そのものを指定は難しいので、代用として使えるテクニックです。
今回はメッシュオブジェクトの出し分けをまとめてみました。
備忘録として残しておきます。