2022-08-30

【Geometry Nodes】Geometry Proximity(ジオメトリ近接)ノード【Blender】

特定の点から最も近い別のジオメトリ上の座標を取得するノード。こちらの概念をわかりやすく解説する。中級者向け。

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

Geometry Proximityノード

日本語:ジオメトリ近接

Geometry Proximity外観

概要

とある点から、ターゲットのジオメトリを見たとき、その最も近い点の座標を取得する。

例えば次。

作例

これは何か起こっているのかというと

  1. 球の中央にある点をAとする
  2. 点Aから地面を見たときに最も近い点をBとする
  3. AとBをカーブで結ぶ

このとき、2の処理(点Bの座標を取る)を行っているのがGeometry Proximityノード

動画で確認

上の球を動かすとよりわかりやすい。

球からみて最も近い地面を検出してカーブを結んでいる。

したがって球が動くと線が落ちる座標が変化している。

非常に混乱しやすいノード

入力ソケットは

  • ジオメトリのTarget
  • フィールドのSource Position(ソースの位置)

という違う種類のソケットが付いており、まずここでAとBどっちを繋ぐのかが分かりにくい。

そして出力にPositionが一つだけ。

このPositionからは何がでてくるのかも想像しにくい。

わかりにくいノード外観

したがってこのノードはこれらをしっかり理解しておかなければ使い物にならない。

DistanceFacesが入っているセレクトボックスはここでは関係ないのでひとまず無視してもよい。別途解説する。

ノードの概念理解を目標とする

よって、この記事ではノードの概念を理解することを目標とする。

あくまでこの記事では使い方だけを学習し、実用例は別途研究してもらえればと思う。

Targetを理解する

Targetソケット

最も重要なTargetソケットから理解する。

球と地面、どちらをTargetに入れるのかで迷うと思う。

PositionはかならずTargetの上にある

ここで最も重要なことはアウトプットのPositionから出てくる座標は必ずこのTarget上に存在する点であるということ。

つまりこの場合は地面のジオメトリをTargetソケットに入れることで、地面の上のどこかを探すことになる。

地面上の点

上の画像の赤点はPositionとして出力される可能性がある点の一例。

地面上であればどこがPositionになってもおかしくない。

逆を言えば

離れた点

ターゲットの上にない座標がPositionからアウトプットされることはない。

今回の例で考えると

カーブのスタート座標は常に球の座標だと分かっている。

しかし、そこから最も近い地面上の座標は演算しないと分からない。

したがってGeometry Proximityに入れるジオメトリは「地面」になることが分かると思う。

地面をTargetに入れる

Source Positionを理解する

日本語:ソースの位置

Source Positionソケット

ここまで読めば予想がつくかもしれないが、このSource Positionから見て、最も近いTarget上の座標がPositionから出る仕組みになっている。

つまり上の例では球の位置を入れてやれば良い。

ここがフィールド&ベクトル

よく見るとこのソケットはフィールドになっているので単一ではなく複数の値を入れることができる。

フィールド(ひし形)の概念は次の記事で解説(2022/06/25追記)

【Geometry Nodes】フィールドって何?PositionやIndexの使い方【Blender】 | 謎の技術研究部

そしてTargetソケットがジオメトリ入力に対してこちらはVector型になっている点にも注意。

このあたりが混乱するポイントになっていると思う。

今回の例では単一の値

今回の作例では単一の値をSource Positionに渡しているのでまずはその方法から見ていく。

今回の作例ノード

クリックで画像拡大

Selectionソケットの使用方法は次を参照。

【Geometry Nodes】Selection(選択)って何【Blender】 | 謎の技術研究部

少しノードを読んでもらう必要があるが、上のようにSource Positionを含め3箇所に球の中央の座標を入れている。

左側のランダムな位置アニメと書いてあるノードの中には位置をアニメーションするノードが入っているだけなので省略。

ランダムな位置アニメの中身は付録で解説(自作ノード)

ランダムな位置アニメの代わりにVectorノードやCombineノードなどをで単一の値を入れるだけでも十分わかる。

Vectorノード

Source Positionは省略可

実はSource Positionソケットは空のままでも動作する。

他のユーザーの作例を見ているとここに何も繋いでいないケースほうが多い印象。

Source Positionに何も入力しないバージョンに変換してみると次のようになる。

改造例1

これでも全く同じ動作をする。

なぜSource Positionが省略できるのか

フィールドの概念によりPositionの先につながっているノードからSource Positionを取得できるため。

逆注入のノード

ここではSet PositionノードからCurve Lineの各頂点の座標をとってきている。

上のノードではCurve LineEnd側の座標をSource Positionとして取得して動作する。

SelectionFalseになった頂点の情報はGeometry Proximityに渡らないようだ(Startの点は無視される)

なぜEndにも球の座標を入れたのか

Endにも同じ座標を入れたノード

Source Positionはフィールドなので各頂点ごとで別々に評価されるため。

Curve LineEnd(0, 0, 0)のままにしてしまうと、固定値が常にGeometry ProximitySource Positionに入ることになる。

ということはつまりSource Position(0, 0, 0)Vectorを入れたのと同じ状態になってしまう。

計算するのは球の座標から見た地面の最も近い場所であるため、これは意図しない動作となる。

終点が固定

000を入れたのと同義

Source Positionに複数の値を入れる

Source Position(ソースの位置)はフィールドであるため複数の値を入れることができる。

私の知る限り単一の値しか使わない例のほうが稀なイメージなので、こちらも理解しておきたい。

複数の値を入れる例

複数の値を使う例として次の変更を行った

  1. 球を平面に変更
  2. 平面の中央ではなく頂点ごとにGeometry Proximityを計算
  3. 各頂点から1本ずつ線を引く

動画で確認すると、次のように平面の各頂点から別々に線が出ることが分かると思う。

平面の頂点ごとに最も近い地面の位置が計算されているので、線の方向や長さはさまざまになる。

実際のノード

ノードは次のようになっている。

ノード例

画像をクリックで拡大

  • Spline ParameterFactor=1になっている頂点は終点(End)を示している。0だと始点。その間の頂点は場合は位置の割合が出てくる。

  • Instance on PointsでカーブがインスタンスになってしまうのでRealize Instancesノードでインスタンスをカーブに変換し直す。これがないとFactorが取れない。

何が起こっているのか

これまでは球の中央から線を1本引いただけだったが、今回は平面の各頂点ごとに1つの線を引いている。

複数の値を入れる場合はGeometry ProximityノードのSource Positionには何も入力しないのが基本。

Set Position側から頂点の座標を別々に取得している。

別々の線を引く解説

このようにフィールドの概念を利用することでGeometry Proximityで複数の値を処理することができる。

このときに前の例と同様Selectionが機能しているので線のEnd側のみ地面に落ちる仕組み。

基本的な概念はここまでで終了。

ここからは残りの設定を解説する。

Points/Edges/Faces設定

Points/Edges/Faces設定外観

こちらの設定はシンプルで、出力される座標Positionこの設定にスナップする。

最初の例の地面上の頂点に球を配置して確認する。

次の3つの画像では球と地面は全く同じ状態でPoints/Edges/Faces設定だけを変化させている。

Points

必ずTarget上の頂点座標がPositionになる。

頂点にスナップ

つまりエッジ上や平面上の座標は出力されない。

Edges

エッジ上のPositionにスナップする。

エッジの上に頂点が必要ないのでPointsよりなめらかなPositionが出力される。

エッジにスナップ

Faces

Facesに設定すると面上のポジションも出力される。

面にスナップ

すなわちこの設定の場合ジオメトリ全体がターゲットとなるので最も細かいPositionが取得できる。

Distance

日本語:距離

Distanceソケット外観

単純に元の座標(Source Position)からPositionまでの長さ(Float)

Distanceの例

いつ使う?

距離が離れすぎている場合は処理しない条件として利用すると便利。

またはこの値を使ってジオメトリを変化させるなどにも有用かと思う。

付録

解説してない部分のノードは本記事とはあまり関係ないが、参考のため掲載する。

「ランダムな位置アニメ」の中身

ランダムな位置アニメと書いてある緑色のノードはグループノード。

中に次のノードがまとめてある。

「ランダムな位置アニメ」の中身

こちらのノードはかなり直感で組んだものなのでもっと良い組み方があるかもしれないので参考までに。

地面用のノード

今回「地面」となっているノード。

平面をしわくちゃにしただけ。

地面ノード

Noise Textureを使って3次元方向にディスプレイスメントしているので布のような面が生成できる。

地面の例

以上

今回かなり長い記事となってしまった。

こちらのノードは使いこなすとかなり面白い作品が作れそうだ。

実用例までは掲載していないが、色々試してもらえたらと思う。




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