2022-08-06(更新)

【Geometry Nodes】フィールドって何?PositionやIndexの使い方【Blender】

PositionやIndexノードには入力がない。どこからどのデータを取ってくるのかを解説。

Article Image
使用ソフトウェアバージョン備考
Blender3.2

この記事の目的

Blenderのジオメトリノードを使う時に、ソケットの形状が「ひし形」になっているものはフィールドというデータが利用されている。

このフィールドの概念が少々難しくイマイチ理解できない人は多いと思う。

この記事ではそれをできるだけ分かりやすく解説したい。

ひし形のソケット

理解してしまえばさほど難しい概念ではない。

IndexやPositionを考える

フィールドの理解に行く前にIndexPositionのような赤いノードをみて疑問に思うことは無いだろうか。

そう、赤ノードには入力ソケットが無い(一部関係ない入力を持つものもある)

赤ノードには入力がない

Positionは座標を取得するノードで、Indexは頂点番号などを取ってくる。

どこのPositionなのか

例えば、あなたの隣りに座っている友人に「ちょい、場所おしえて~」と聞くとする。

おそらく「え、何の場所?」って聞き返されるだろう。

プログラムもこれは同じでPositionを取ろうと思ったら「何のPositionを取ってくるのか」を明示するのが普通である。

通常はこの情報を与えるのが入力ソケット(プログラムでいう引数)だ。

赤ノードに入力があったらわかりやすい

上はメッシュを1m横に移動するだけのノード例。

次の項でこの入力のないポジションがどうなっているのかを考える。

緑の入力を辿る

「何のPositionを取得するのか」という問いは実は意外にシンプル。

このひし形でつながっているノードの元を辿った時に緑のソケットがつながっているノードまで遡れば良い

緑のノードを発見

つまりPositionを呼び出してる親(そしてその親...その親...)を辿っていき、一番上が緑のソケットになっている時に「その緑の奴のPositionを取る」という仕組みだ。

この場合はSet PositionにつながっているUV SpherePositionを取ってきている。

2022/08/06:追記

例外に注意

Raycastのような一部ノードでは直近の緑ソケットは関係なく、さらに上につながっているノードからデータを取得するので注意する。

Raycastノードの外観と解説

上のケースでは(1)Target Geometryソケットに入っているNormalを取得しRay Directionに適用しているように見える。

しかし実際は(2)ソケット以降のノードからNormalを取得してくるという特性がある。

このようなケースは稀だが、ノード別に公式ドキュメントを読まないと分からない。

ノード外観では判断できないので、普段使い慣れてないノードのフィールドを使う場合は公式も参照すること。

この概念がフィールド

このように親を辿ってそこからデータを取るのがフィールド(ひし形)の最初の概念だ。

とは言えまだ分かりにくいと思うので例をだしていく。

ちょっとむずかしい例

次のような例は少し混乱するかもしれない。

緑が2つ

この場合は緑のソケットが2つあるのでどちらかわかリにくい。

ただ、これは簡単で基本的にはいちばん上(1)のソケットが対象になる。

つまりUV SpherePositionAdd演算を加えた後Rotationに入る。

こちらも例外がある可能性があるので注意。

フィールドが使えない例

上までの理解では次でつまずくことも多いかと思う。

エラーの例

Set PositionではなくTransformというノードでメッシュを移動しようとするとエラーになる。

なぜ?

よく見てほしい。Transformの入力ソケットはマルになっている。

マルになっている

ひとまずここでは「マルには接続できない」「かならずひし形同士で接続」ということを覚えておこう。

これには理由があるので最後まで読んでもらえれば理解出来ると思う。

二股になっている例

さて、次が一番難しい例。

次はどのような実行結果になるだろうか。

二股になっているPosition

一つのPositionが2つのメッシュにそれぞれ分かれて別々に位置調整を行っている。

いったいどこのPositionなのか。プログラムが混乱しないのだろうか。

Addノードは上がY + 1.00, 下はY - 1.00になっている。

実行結果

上のノードは完全に正しい例で実行結果は次のようになる。

2つの値に変化

つまりここでのPositionCubeSphereで別々の値を出力していることになる。

どういうこと?

これはPositionというノードをつなげた時点で既に出力される値が確定するわけではないから。

ここでは「Positionを取ってきてね」という「命令」を渡している。

つまりPositionという命令は2つのSet Positionそれぞれ実行されるタイミングで別のPositionを取ってくるから正常な動作となる。

picture 10

イメージ的には上の図の方がわかりやすいと思う。

また、上の図のノードの組み方でも間違っておらず、正常動作する。

わからん!

正直なところ解説が難しくここが理解できないユーザーも少なくはないだろう。

使いながらなんとなく覚えていくか、混乱するなら上の例のように初めから2つ用意してもらえば問題ない。

なぜ分かりにくい仕様に?

ではなんでこんな仕様になっているのだろうか。

ここはあくまで私の予想だが次が挙げられる。

  • ノードプログラミングは線が多すぎて逆に見にくくなる => この仕様なら線が減る
  • 誤った線をつなげられないのでエラーになりにくくなる

ノード上で解説

フィールドのもう一つの重要な役割

フィールド(ひし形の入出力)にはもう一つ重要な役割がある。

こちらも簡単な例で示す。

カーブとスプレッドシート

まずは次のCurve Circle(カーブ円)ノードで円のカーブを作る

円を作るだけ

この状態でスプレッドシートを見ると

スプレッドシート

コントロールポイントと呼ばれるところに頂点(のようなもの)がたくさんできているのがわかる。

どうやら座標が入っているだけのようだ。

アトリビュートを追加する方法

ここに次のSet Curve Radius(カーブ半径設定)ノードを付ける。

カーブ半径設定ノード

半径を1.111にしてみると

radiusが追加

radiusというアトリビュートが各ポイントに追加されていることが解る。

ただ、全てが1.111という同じデータになっている。

ポイントごとに違った値にする

気づいた人もいるかもしれないが、この半径Radiusひし形になっている。

つまり「フィールド」のデータを受け取っている。

というわけで次に改造する。

Radiusにインデックスを入れた

実用的な例ではないが... Indexはフィールドである。

これが何を意味しているかというと

ポイント別に違う値になった

名称はどれもradiusだがコントロールポイントごとに別の値が格納された

これがフィールドのもう一つの重要なポイント。

つまり

フィールドには値ではなく命令を入れることができるので、実行した結果が違えば格納される値も違ってくる。

つまり、頂点や辺など1つ1つに別々の値を入れてやることができるのだ。

別々の値が入るとは?

フィールドとは別々の値である、というイメージができる例を考えた。

単純にGridExtrude Mesh(メッシュ押し出し)してやる例。

GridをExtrude Mesh

Valueの出力ソケットはフィールドではなく単一の値(マル型)なので

実行結果

実行結果はGridに均一な厚みが付いた。

Extrude Mesh(メッシュ押し出し)ノードの解説は次を参照。

【Geometry Nodes】Extrude Meshノード【Blender】 | 謎の技術研究部

Index別で押し出し

次はフィールドを使って別々の値で押し出してみよう。

Index別で演算

各面に対してそのIndexは別々なので、押し出す値はそれぞれ変わる。

階段のようなモニュメント

階段のようなモニュメントが完成した。

おまけ:Transformがエラーだったのは何?

上の例でTransformノードにフィールドを入れた時エラーだったのを思い出してみよう。

このノードはGeometryにつながっている物をまとめて単一の値で動かすノードである。

したがってフィールドが入ってきても扱えない。

一方でSet Positionはフィールドを入力できるので、頂点ごとに別のポジション移動が可能になるというワケだ。

SetPositionとTransform

次の例はTransformでは作れない

SetPositionの例

無限の作例が考えられる

以上で解説は終了だ。

このフィールドを使いこなすことによって頂点や面ごとに別々の演算をしていけるので可能性が無限に広がる。

また、PositionIndexといったシステム側が用意したもののみならず、アトリビュート自体はユーザーが変数のように追加していけるのでそちらも試すと良い。

このフィールドで使うノードも様々なので私のBLOGで紹介している個別ノードも色々みてもらえたら幸いだ。

ひし形のソケットに繋ぐものがフィールドだが、更に細かく関数ノードと入力ノードに分かれており、厳密には細かい違いがある。

混乱するのでこの記事では同じものとして解説している。

おそらく現段階ではそこまで厳密な理解は不要かと思う。



謎の技術研究部 (謎技研)