2023-06-02(更新)

Sample Nearest(最近接サンプル)を解説【Blender - Geometry Nodes】

最も近い場所にある別メッシュのインデックスを取ってくるノード。v3.4で追加された。

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

2023/06/02:「出し方」の項目が間違っていたので訂正。合わせてカテゴリが変更されているので修正。

前提

このノードは上級者向け。

Sample Nearest

日本語:最近接サンプル

概要

別メッシュと比較して、最も近い頂点/辺/面いずれかのIndexを取ってくるノード

Sample Nearest外観

Transfer Attributeが廃止

このノードはv3.3までのTransfer Attributeが廃止され、その代わりに3つのノードのうちの1つ。

追加されたのは次の通り。

  • Sample Nearest Surface(最近接表面サンプル)
  • Sample Nearest(最近接サンプル)
  • Sample Index(インデックスサンプル)

出し方

Geometry(ジオメトリ) > Sample(サンプル) > Sample Nearest(最近接表面サンプル)

このノードはGeometryカテゴリに分類されているが、似ているノードのSample Nearest Surface(最近接表面サンプル)はMeshに入っているので注意。

使い方

使い方自体はシンプル。

Sample Nearest(最近接サンプル)は設定した頂点/辺/面のいずれかの最近接のIndexを取得するので

ノード例

このように繋ぐだけでIco球の各頂点に、そこから最も近いCubeの頂点のIndexを取得できる。

イメージがわかない人向けの参考。

上の例はIco球の中にCubeが作られている。分かりやすい見た目にすると次のような状態。

Ico球の中にCube

このIco球の各頂点から見て、Cube上のどの頂点が最も近いかが記録される。

スプレッドシートは次のようになる。

スプレッドシート結果

Sample Indexと合わせて使う

上の例ではStore named Attribute(名前付き属性格納)を使用したが、公式DocのサンプルにあるようにSample Index(インデックスサンプル)と合わせて使うと自由なアトリビュートを取得できる。

例えば次のような例

ポジションを取る例

このように組むとIco球の各頂点データそれぞれに、「そこから最も近いCubeの頂点のPosition」を記録できる。

ポジションが記録されたスプレッドシート

作例

上の2つのノードを使って作例を作った。

ノードを掲載するが少し複雑になってしまったので、組み方はお好きな方だけ見てもらえればと思う。

ノード例

画像クリックで拡大

何が起こっている?

  1. Ico球の外側に大きなUV球を作っている
  2. UV球の各頂点からみて最も近いIco球の頂点に線を結ぶ
  3. 再生時間からアニメーションを生成
  4. 頂点や線を可視化してレンダリング

Geometry Proximity(ジオメトリ近接)でもできる

このケースだと単に最近接のPositionを取得しているだけなのでGeometry Proximity(ジオメトリ近接)ノードでも置き換えられるかと思う。

この組み合わせは自分で追加したアトリビュートやタンジェントなど特殊なデータを取得するケースでもっと輝くのではないだろうか。

Sample Nearest Surfaceとの違い

日本語:最近接表面サンプル

似ているノードを並べた

このノードはSample Nearest Surface(最近接表面サンプル)と似ている。

次のページで解説しているので参考にしてもらえたらと思う。

Sample Nearest Surface(最近接表面サンプル)を解説【Blender - Geometry Nodes】 | 謎の技術研究部

この2つの具体的な違いはなんだろうか。

そもそもアウトプットのソケットが違うが、それ以上に大きな違いがある。

Sample Nearest Surface(最近接表面サンプル)を使用して「最も近いIndex」を取ってみる。

Indexを取得するノード例

Ico球の各頂点から見て、最も近いCubeのIndexを取得し、Ico球の頂点内にデータとして保存している。

スプレッドシート

このやり方はあまりよくない

気づいたと思うがIndexに小数点以下の値が含まれている。

なぜなら上のノードはメッシュの表面上ならあらゆる箇所を最近接として認識するからだと思われる。

そのため、その地点には実際には存在しない値を、近くのValueから補完して出力するという動作になる。

つまり上の例だと存在しないIndex値が補完され小数点で帰ってきてしまう。

どうやらVertexではなくFace CornerIndexから算出される模様。

これらは私の実験結果からの予測なので間違っている可能性に注意。

なるほど、わからん。

わからん人向けに比較動画を作った。

Sample Nearest(最近接サンプル)を使って最近接のポイント(赤玉)に線を結ぶノードを組む。

かならずCubeの頂点が近接として処理されている(設定で面や辺にも変えられる)

同じノードの組み方でSample Nearest Surface(最近接表面サンプル)を使うと

頂点が存在しないCubeの面上も最近接と認識され、そこに赤玉が落ちている。

曖昧な値がほしくないときはSample Nearestを使おう

というわけで、面や頂点に明示的に保存されている値を取りたい場合はSample Nearest(最近接サンプル)を使う。

さいごに

自由度が一気に広がるので、大きな可能性を感じるノードだ。

ただ、このノードの組み合わせを使って壮大な作例を作れるアイデアを私は持ち合わせていない。

何かもっと実用的なものがあれば別途記事にしたいところ。



この記事をシェア


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