ビボロク。どこかで誰かのためになるWebのTIPS・ノウハウ。備忘録として残しておきます
   
           

【ジオメトリノードの選択を使いこなす】任意の面・辺・点にオブジェクト出し分ける方法(メッシュ編)

  • 投稿日/更新日
  1. home
  2. blender

追記:2024/10/17「マテリアルを条件に配置する」を追記

シーンにあるメッシュオブジェクト上に、ジオメトリノードでなんらかのオブジェクトを生やしたりするとき、「上を向いた面だけにオブジェクトを置きたい」「辺が縦のものだけに柱のオブジェクトを置きたい」「ランダムに生成したい」なんてことがあると思います。そこで、ジオメトリノードでどのような制御が必要かを整理してみました。カーブ編は別の記事でまとめています。

基本

基本となるオブジェクトとしてこのような凸凹のものを用意しました。法線(ノーマル)はすべて外側を向いています。辺の長さは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番)という意味になるんですね。ジオメトリノードは面そのものを指定は難しいので、代用として使えるテクニックです。

今回はメッシュオブジェクトの出し分けをまとめてみました。

                   

備忘録として残しておきます。