使用ソフトウェア | バージョン | 備考 |
---|---|---|
Blender | 3.2 |
日本語:ジオメトリ近接
とある点から、ターゲットのジオメトリを見たとき、その最も近い点の座標を取得する。
例えば次。
これは何か起こっているのかというと
このとき、2の処理(点Bの座標を取る)を行っているのがGeometry Proximity
ノード
上の球を動かすとよりわかりやすい。
球からみて最も近い地面を検出してカーブを結んでいる。
したがって球が動くと線が落ちる座標が変化している。
入力ソケットは
Target
Source Position(ソースの位置)
という違う種類のソケットが付いており、まずここでAとBどっちを繋ぐのかが分かりにくい。
そして出力にPosition
が一つだけ。
このPosition
からは何がでてくるのかも想像しにくい。
したがってこのノードはこれらをしっかり理解しておかなければ使い物にならない。
Distance
やFaces
が入っているセレクトボックスはここでは関係ないのでひとまず無視してもよい。別途解説する。
よって、この記事ではノードの概念を理解することを目標とする。
あくまでこの記事では使い方だけを学習し、実用例は別途研究してもらえればと思う。
最も重要なTarget
ソケットから理解する。
球と地面、どちらをTarget
に入れるのかで迷うと思う。
ここで最も重要なことはアウトプットのPosition
から出てくる座標は必ずこのTarget上に存在する点であるということ。
つまりこの場合は地面のジオメトリをTarget
ソケットに入れることで、地面の上のどこかを探すことになる。
上の画像の赤点はPosition
として出力される可能性がある点の一例。
地面上であればどこがPosition
になってもおかしくない。
逆を言えば
ターゲットの上にない座標がPosition
からアウトプットされることはない。
カーブのスタート座標は常に球の座標だと分かっている。
しかし、そこから最も近い地面上の座標は演算しないと分からない。
したがってGeometry Proximity
に入れるジオメトリは「地面」になることが分かると思う。
日本語:ソースの位置
ここまで読めば予想がつくかもしれないが、このSource Position
から見て、最も近いTarget
上の座標がPosition
から出る仕組みになっている。
つまり上の例では球の位置を入れてやれば良い。
よく見るとこのソケットはフィールドになっているので単一ではなく複数の値を入れることができる。
フィールド(ひし形)の概念は次の記事で解説(2022/06/25追記)
【Geometry Nodes】フィールドって何?PositionやIndexの使い方【Blender】 | 謎の技術研究部
そしてTarget
ソケットがジオメトリ入力に対してこちらはVector
型になっている点にも注意。
このあたりが混乱するポイントになっていると思う。
今回の作例では単一の値をSource Position
に渡しているのでまずはその方法から見ていく。
クリックで画像拡大
Selection
ソケットの使用方法は次を参照。
少しノードを読んでもらう必要があるが、上のようにSource Position
を含め3箇所に球の中央の座標を入れている。
左側のランダムな位置アニメ
と書いてあるノードの中には位置をアニメーションするノードが入っているだけなので省略。
実はSource Position
ソケットは空のままでも動作する。
他のユーザーの作例を見ているとここに何も繋いでいないケースほうが多い印象。
Source Position
に何も入力しないバージョンに変換してみると次のようになる。
これでも全く同じ動作をする。
フィールドの概念によりPosition
の先につながっているノードからSource Position
を取得できるため。
ここではSet Position
ノードからCurve Line
の各頂点の座標をとってきている。
上のノードではCurve Line
のEnd
側の座標をSource Position
として取得して動作する。
Selection
でFalse
になった頂点の情報はGeometry Proximity
に渡らないようだ(Start
の点は無視される)
Source Position
はフィールドなので各頂点ごとで別々に評価されるため。
Curve Line
のEnd
を(0, 0, 0)
のままにしてしまうと、固定値が常にGeometry Proximity
のSource Position
に入ることになる。
ということはつまりSource Position
に(0, 0, 0)
のVector
を入れたのと同じ状態になってしまう。
計算するのは球の座標から見た地面の最も近い場所であるため、これは意図しない動作となる。
Source Position
(ソースの位置)はフィールドであるため複数の値を入れることができる。
私の知る限り単一の値しか使わない例のほうが稀なイメージなので、こちらも理解しておきたい。
複数の値を使う例として次の変更を行った
Geometry Proximity
を計算動画で確認すると、次のように平面の各頂点から別々に線が出ることが分かると思う。
平面の頂点ごとに最も近い地面の位置が計算されているので、線の方向や長さはさまざまになる。
ノードは次のようになっている。
画像をクリックで拡大
Spline Parameter
のFactor=1
になっている頂点は終点(End)を示している。0だと始点。その間の頂点は場合は位置の割合が出てくる。
Instance on Points
でカーブがインスタンスになってしまうのでRealize Instances
ノードでインスタンスをカーブに変換し直す。これがないとFactor
が取れない。
Spline Parameter
ノードについては次も参照
【Geometry Nodes】Spline Parameter(スプラインパラメーター)ノードを解説【Blender】 | 謎の技術研究部
これまでは球の中央から線を1本引いただけだったが、今回は平面の各頂点ごとに1つの線を引いている。
複数の値を入れる場合はGeometry Proximity
ノードのSource Position
には何も入力しないのが基本。
Set Position
側から頂点の座標を別々に取得している。
このようにフィールドの概念を利用することでGeometry Proximity
で複数の値を処理することができる。
このときに前の例と同様Selection
が機能しているので線のEnd
側のみ地面に落ちる仕組み。
基本的な概念はここまでで終了。
ここからは残りの設定を解説する。
こちらの設定はシンプルで、出力される座標Position
がこの設定にスナップする。
最初の例の地面上の頂点に球を配置して確認する。
次の3つの画像では球と地面は全く同じ状態でPoints/Edges/Faces
設定だけを変化させている。
必ずTarget
上の頂点座標がPosition
になる。
つまりエッジ上や平面上の座標は出力されない。
エッジ上のPosition
にスナップする。
エッジの上に頂点が必要ないのでPoints
よりなめらかなPosition
が出力される。
Faces
に設定すると面上のポジションも出力される。
すなわちこの設定の場合ジオメトリ全体がターゲットとなるので最も細かいPosition
が取得できる。
日本語:距離
単純に元の座標(Source Position
)からPosition
までの長さ(Float)
距離が離れすぎている場合は処理しない条件として利用すると便利。
またはこの値を使ってジオメトリを変化させるなどにも有用かと思う。
解説してない部分のノードは本記事とはあまり関係ないが、参考のため掲載する。
ランダムな位置アニメ
と書いてある緑色のノードはグループノード。
中に次のノードがまとめてある。
こちらのノードはかなり直感で組んだものなのでもっと良い組み方があるかもしれないので参考までに。
今回「地面」となっているノード。
平面をしわくちゃにしただけ。
Noise Texture
を使って3次元方向にディスプレイスメントしているので布のような面が生成できる。
今回かなり長い記事となってしまった。
こちらのノードは使いこなすとかなり面白い作品が作れそうだ。
実用例までは掲載していないが、色々試してもらえたらと思う。