2023-06-02(更新)

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

最も近い場所にある別メッシュの表面上にある値を(補完して)取ってくるノード。v3.4で追加された。

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

2023/06/02:「出し方」のカテゴリが変更されているので修正。

前提

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

こちらの記事を読む前にSample Nearest(最近接サンプル)ノードを理解しておいたほうが良い。

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

Sample Nearest Surfaceノード

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

Sample Nearest Surface外観

概要

別メッシュと比較して、最も近い場所のValueを取ってくるノード。

頂点や面など指定できず、その表面上であればどこでも最近接と認識される。

出力されるValueもその地点で補完して出力される。

Transfer Attributeが廃止

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

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

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

出し方

Mesh(メッシュ) > Sample(サンプル) > Sample Nearest Surface(最近接表面サンプル)

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

使い方

このノードの実用的な例がいまいち思いつかないため、私も使いこなせていない。

よって今回は最低限の使い方が分かるレベルの解説に留める。

基本

非常にわかりにくいので例で解説する。

まず、Ico球があるとする。

ICO球

ICO球のノード

これを次のようなノードにするとIco球の中にCubeが出来るのは分かると思う

Cubeのノード

中にキューブが隠れている

このIco球を変形させてCubeにシュリンクラップのような効果を出したい。

こんなときにSample Nearest Surface(最近接表面サンプル)が使える。

最終的なノード

最終的に次のようなノードにすれば良い。

最終ノード

この時Sample Nearest Surface(最近接表面サンプル)のMeshソケットに繋ぐのはCubeなのか、Ico球なのか混乱するユーザーも多いと思う。

この件に関してはGeometry ProximityについているTargetソケットと全く同じ考え方で良いので、次の記事を参考にしてもらいたい。

【Geometry Nodes】Geometry Proximity(ジオメトリ近接)ノード【Blender】 | 謎の技術研究部

実行結果は次のようになる。

実行結果

これはもともとIcoだった頂点それぞれがCube上にある最も近い位置に移動したためこうなっている。

Geometry Proximityノードに似ている

日本語:ジオメトリ近接

このノードは新しく追加された3種とは別の(以前より実装されていた)Geometry Proximityに非常によく似ている。

したがって、上の例であれば次のようなノードを組んでも全く同じ動作となる。

Geometry Proximityを使った例

むしろこちらのほうがノード数が少なくて済む上にDistance値も取れるおまけ付き。

Geometry Proximityとの違い

Sample Nearest Surface(最近接表面サンプル)にはValueという入力がある。

ここに自由にデータを設定できるのが強み。

つまりGeometry Proximity(ジオメトリ近接)はPositionしか取ってこれないのに対してこちらは別の値も取ることができる。

Valueソケットの違い

最も近いIndex番号を取ってみる

次は試しにIco球の各頂点それぞれから見てCube上のどのIndexが近いかを取ってみる。

Indexを取得するノード例

この状態でスプレッドシートを見ると最も近いIndexの値が記録されているのが分かる

スプレッドシート

ということは各ポイントに自由な値を格納しておき、別のメッシュからそれを取得できると考えて良さそうだ。

上の例でCubeの頂点は98個しかないのにIndexで300番代が出ているのはFace Cornerが384あるからだと思われる。

そもそもSample Nearest Surfaceという名称からも予想がつくように近接の対象は単純に頂点ではないようなので注意。

Indexを取っているがIntegerFloatにすると小数点が出てくるので、曖昧な箇所の値は新しく補完される?

公式では次のような一文がある。

Non-face attributes are interpolated across the surface.

意訳:ノンフェイスアトリビュートはサーフェス上で補完されます。

Sample Nearestとの違い

このノードはその名前にSurfaceとある通り面や頂点のような明らかなポイントではなくその中間に存在する曖昧な箇所も再近接として認識している(たぶん)

つまりメッシュの表面上であれば頂点や面は関係なく、どこでも「最近接」になる可能性がある。

そうなると「そこのValueは明示的に記録されていないけどどうするの?」という疑問が湧く。

これは上の読み飛ばし欄に書いたがその曖昧な値はノードによって補完され中間のデータが返ってくると思われる。

曖昧なポイントの補完

よって上のIndexを取ってくる例では、本来小数点をもたないIndexが少数を含んで帰ってくる。

各頂点などに保存されているデータを正確に取得したい場合はSample Nearest(最近接サンプル)を使おう。

なるほど、わからん。

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

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

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

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

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

この仕組みについてはあくまで私の実験からの予想なので違っている可能性に注意してほしい。

以上

それなりに高度なジオメトリノードを組まない限り出番はなさそうだ。

しかしながらTransfer Attributeが廃止された代わりに追加されたノードなので「そんなのあったな」ぐらいには覚えておかないと後々困ると思われる。



この記事をシェア


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