Blenderのジオメトリノードで使うRaycastノードについてのまとめです。
いつもどっちがターゲットでどの値が出るのかこんがらがって忘れてしまうので…。
レイを発射する側はどっちなのか、どっちに当たった何の値がどこに出てるのかに焦点を当てつつ、
簡単な使い方とか、どういうときに使えるかなどをまとめておきます。
Raycastノードとは
Raycast(レイキャスト)ノードは、
あるジオメトリからレイ(光線)を飛ばして、別のジオメトリに当たるか調べるノードです。
そして当たった場合に、
- 当たった位置
- 法線
- 距離
- 任意の属性
などを取得できます。
どっちが「レイの発射側」でどっちが「ターゲット」かここが私の個人的な一番の混乱ポイントです。

結論
レイを発射する側 → 今処理しているジオメトリ(=コンテキスト)
レイを受ける側 → Target Geometry(ターゲット)
各パラメータの解説
Source Position(ソースの位置)
レイの発射地点
デフォルトでは
Positionノードと同じで各ポイント(頂点)から発射します。(Positionノードをつなぐ必要はありません。)
例えば、レイの発射地点をズラしたいときに、Vector Mathノードを使って、レイの発射地点を変更することができます。(右の下図)
※ちなみに、画像では可視化していませんが、平面のジオメトリの全ての点からレイが出ていて、当たってないものはRay Lengthの長さまで伸びています。

The image shows a visualization of the rays. In reality, the rays are not visible.
Ray Direction(レイの方向)
どの方向に飛ばすか
例:
(0, 0, 1) → 上に飛ばす
(0, 0, -1) → 下に飛ばす
Normal → 面の法線方向に飛ばす

The image shows a visualization of the rays. In reality, the rays are not visible.
Ray Length(レイの長さ)
どこまで飛ばすか(最大距離)
当たらなければ「ヒットなし」
最大距離まで到達したら終了
出力について
出力はすべて発射側(元ジオメトリ)に対して出力されます
Is Hit(ヒットフラグ)
そのポイントから飛ばしたレイが当たったかどうか
true:当たった
false:当たってない
つまり:
「この頂点から撃ったレイ、当たった?」っていう判定
Hit Position(ヒット位置)
当たった場所の座標
ターゲット上の位置
ワールド空間(または現在の空間)
Hit Normal(ヒット法線)
当たった場所の面の向き
ターゲット側の法線
Hit Distance(ヒット距離)
発射地点 → ヒット位置までの距離
当たらなかった場合:
→ Ray Lengthがそのまま返る

Attribute(属性)
ターゲットの属性値を、レイが当たった位置でサンプリング(参照)する
例:(フィールドをそのままつなげると元ジオメトリの属性値として出てきてしまうので、Store Named Attributeなどでターゲット側の属性として登録してから出力すると使いやすい)
- 色
- UV
- カスタム属性
参照しているだけなので、固定したいならStore Named Attributeなどで登録する
Attributeの補間(Interpolation)
- Interpolated(補間)
- 面の中でなめらかに補間
- 普通はこれ
- Nearest(最近傍)
- 一番近い頂点の値を使う
- カクッとした結果になる

よくある使い方
① 地面にスナップ
上から下にレイを飛ばす
地面の位置に合わせる
カーブなどを地面位置に合わせて、何かオブジェクトが進むコースとして使用することができます。

② 他オブジェクトへの距離取得
他オブジェクト間の距離をHit Distanceで取得して
- 距離ベースでエフェクト制御
- メッシュの長さなどサイズとして使う
③ 表面に貼り付ける
①と近いですが、例えば平面のデカール、シールを
凹凸のある表面に貼り付けたり、プロジェクション的な使い方ができます。
ある複雑な構造を平面で作っておいて、立体物にレイキャストし、高さや位置を取得して立体物にしたりできます。
④ 当たった場所の色を取得
Attributeでカラー取得
⑤はみ出しを削除
ある領域からはみ出したインスタンスなどを削除
中に配置したポイントから、容器へレイキャストし、当たらなかったら削除、などの方法ではみ出しを防ぐことができます。
他にも、ある閉じた領域内のものを検出したときはRay DirectionをPositionの方向にして、Hit Normalとの内積をとって検出することもできます。
※ちなみにBox Selectionノードなどを使っても、ある立方体の中のポイントを検出することができます。

まとめ
Raycastは各頂点がレーザーポインターを持ってると考えて、
どこに当たる?
距離は?
その場所の情報は?
などをまとめて取れるノードです。
ただ、Attributeなどをとるときは、フィールドをそのままつなぐと元ジオメトリの属性値しか取得できなくなってしまうので、名前付き属性値を使うことが必要です。
関連記事
ジオメトリノードのガイド記事


コメント