| 使用ソフトウェア | バージョン | 備考 |
|---|---|---|
| Blender | 3.2 |
Blenderのジオメトリノードを使う時に、ソケットの形状が「ひし形」になっているものはフィールドというデータが利用されている。
このフィールドの概念が少々難しくイマイチ理解できない人は多いと思う。
この記事ではそれをできるだけ分かりやすく解説したい。
理解してしまえばさほど難しい概念ではない。
フィールドの理解に行く前にIndexやPositionのような赤いノードをみて疑問に思うことは無いだろうか。
そう、赤ノードには入力ソケットが無い(一部関係ない入力を持つものもある)
Positionは座標を取得するノードで、Indexは頂点番号を取ってくる。
例えば、あなたの隣りに座っている友人に「ちょい、場所おしえて~」と聞くとする。
おそらく「え、何の場所?」って聞き返されるだろう。
プログラムもこれは同じでPositionを取ろうと思ったら「何のPositionを取ってくるのか」を明示するのが普通である。
通常はこの情報を与えるのが入力ソケット(プログラムでいう引数)だ。
次の項でこの入力のないポジションがどうなっているのかを考える。
「何のPositionを取得するのか」という問いは実は意外にシンプル。
このひし形でつながっているノードの元を辿った時に緑のソケットがつながっているノードまで遡れば良い
つまりPositionを呼び出してる親(そしてその親...その親...)を辿っていき、一番上が緑のソケットになっている時に「その緑の奴のPositionを取る」という仕組みだ。
この場合はSet PositionにつながっているUV SphereのPositionを取ってきている。
2022/08/06:追記
Raycastのような一部ノードでは直近の緑ソケットは関係なく、さらに上につながっているノードからデータを取得するので注意する。
上のケースでは(1)Target Geometryソケットに入っているNormalを取得しRay Directionに適用しているように見える。
しかし実際は(2)ソケット以降のノードからNormalを取得してくるという特性がある。
このようなケースは稀だが、ノード別に公式ドキュメントを読まないと分からない。
ノード外観では判断できないので、普段使い慣れてないノードのフィールドを使う場合は公式も参照すること。
このように親を辿ってそこからデータを取るのがフィールド(ひし形)の最初の概念だ。
とは言えまだ分かりにくいと思うので例をだしていく。
次のような例は少し混乱するかもしれない。
この場合は緑のソケットが2つあるのでどちらかわかリにくい。
ただ、これは簡単で基本的にはいちばん上(1)のソケットが対象になる。
つまりUV SphereのPositionにAdd演算を加えた後Rotationに入る。
上までの理解では次でつまずくことも多いかと思う。
Set PositionではなくTransformというノードでメッシュを移動しようとするとエラーになる。
よく見てほしい。Transformの入力ソケットはマルになっている。
ひとまずここでは「マルには接続できない」「かならずひし形同士で接続」ということを覚えておこう。
これには理由があるので最後まで読んでもらえれば理解出来ると思う。
さて、次が一番難しい例。
次はどのような実行結果になるだろうか。
一つのPositionが2つのメッシュにそれぞれ分かれて別々に位置調整を行っている。
いったいどこのPositionなのか。プログラムが混乱しないのだろうか。
Addノードは上がY + 1.00, 下はY - 1.00になっている。
上のノードは完全に正しい例で実行結果は次のようになる。
つまりここでのPositionはCubeとSphereで別々の値を出力していることになる。
これはPositionというノードをつなげた時点で既に出力される値が確定するわけではないから。
ここでは「Positionを取ってきてね」という「命令」を渡している。
つまりPositionという命令は2つのSet Positionがそれぞれ実行されるタイミングで別のPositionを取ってくるから正常な動作となる。
イメージ的には上の図の方がわかりやすいと思う。
また、上の図のノードの組み方でも間違っておらず、正常動作する。
正直なところ解説が難しくここが理解できないユーザーも少なくはないだろう。
使いながらなんとなく覚えていくか、混乱するなら上の例のように初めから2つ用意してもらえば問題ない。
ではなんでこんな仕様になっているのだろうか。
ここはあくまで私の予想だが次が挙げられる。
フィールド(ひし形の入出力)にはもう一つ重要な役割がある。
こちらも簡単な例で示す。
まずは次のCurve Circle(カーブ円)ノードで円のカーブを作る
この状態でスプレッドシートを見ると
コントロールポイントと呼ばれるところに頂点(のようなもの)がたくさんできているのがわかる。
どうやら座標が入っているだけのようだ。
ここに次のSet Curve Radius(カーブ半径設定)ノードを付ける。
半径を1.111にしてみると
radiusというアトリビュートが各ポイントに追加されていることが解る。
ただ、全てが1.111という同じデータになっている。
気づいた人もいるかもしれないが、この半径Radiusはひし形になっている。
つまり「フィールド」のデータを受け取っている。
というわけで次に改造する。
実用的な例ではないが... Indexはフィールドである。
これが何を意味しているかというと
名称はどれもradiusだがコントロールポイントごとに別の値が格納された。
これがフィールドのもう一つの重要なポイント。
フィールドには値ではなく命令を入れることができるので、実行した結果が違えば格納される値も違ってくる。
つまり、頂点や辺など1つ1つに別々の値を入れてやることができるのだ。
フィールドとは別々の値である、というイメージができる例を考えた。
単純にGridをExtrude Mesh(メッシュ押し出し)してやる例。
Valueの出力ソケットはフィールドではなく単一の値(マル型)なので
実行結果はGridに均一な厚みが付いた。
Extrude Mesh(メッシュ押し出し)ノードの解説は次を参照。
次はフィールドを使って別々の値で押し出してみよう。
各面に対してそのIndexは別々なので、押し出す値はそれぞれ変わる。
階段のようなモニュメントが完成した。
上の例でTransformノードにフィールドを入れた時エラーだったのを思い出してみよう。
このノードはGeometryにつながっている物をまとめて単一の値で動かすノードである。
したがってフィールドが入ってきても扱えない。
一方でSet Positionはフィールドを入力できるので、頂点ごとに別のポジション移動が可能になるというワケだ。
次の例はTransformでは作れない
以上で解説は終了だ。
このフィールドを使いこなすことによって頂点や面ごとに別々の演算をしていけるので可能性が無限に広がる。
また、PositionやIndexといったシステム側が用意したもののみならず、アトリビュート自体はユーザーが変数のように追加していけるのでそちらも試すと良い。
このフィールドで使うノードも様々なので私のBLOGで紹介している個別ノードも色々みてもらえたら幸いだ。
ひし形のソケットに繋ぐものがフィールドだが、更に細かく関数ノードと入力ノードに分かれており、厳密には細かい違いがある。
混乱するのでこの記事では同じものとして解説している。
おそらく現段階ではそこまで厳密な理解は不要かと思う。
