使用ソフトウェア | バージョン | 備考 |
---|---|---|
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で紹介している個別ノードも色々みてもらえたら幸いだ。
ひし形のソケットに繋ぐものがフィールドだが、更に細かく関数ノードと入力ノードに分かれており、厳密には細かい違いがある。
混乱するのでこの記事では同じものとして解説している。
おそらく現段階ではそこまで厳密な理解は不要かと思う。