Blenderのジオメトリノード / Geometry Node を使って、モノとの距離に応じて光の強さを変えるランプ群を作る方法のメモです。
(実行環境:Blender4.4.1/Windows11)
完成像
こんなふうに、ターゲットオブジェクトとの距離の変化に応じて、複製配置したランプの光の強さが変化します。
ノードの全体像はこのような感じです(後で詳しく解説)。
(左:シェーディングエディタ、右:ジオメトリノードエディタ)
用意するもの
3Dビューポート上に以下の設定をしたオブジェクトを用意します。
(名前は自由ですが後の説明の便宜上以下のように設定)
-
Lamp
: ランプ(発光体) として使いたいオブジェクト- 適当なマテリアルを設定しておき、名前は
Light
としておく
- 適当なマテリアルを設定しておき、名前は
-
Target
: 光の強さを調整する距離計測の対象とするオブジェクト
残りは全てジオメトリノード上で作成します。
完成形
ジオメトリノードとマテリアルノードでできています。
作り方
大まかに3つの部分で構成されます。
1️⃣LampをGrid上のポイントに複製配置
手順
- Lampを選択した状態で、ジオメトリノードエディタで➕️ボタンを押すと、1-1 (
Group Input
) と1-2 (Group Output
)が作成されるはず (Group Inputには Lampオブジェクトが入る) -
Grid
ノードで、Lampを配置するための基準となる頂点ポイントを作成 -
Instance on Points
ノードで、LampをGridの頂点ポイント上に配置
結果:Lampが、Gridの格子ポイント上に配置されるはず。
2️⃣複製配置したインスタンスたちに渡す明るさ属性をつくる
手順
-
Store Named Attribute
ノードで、Gridから流れてくる各ポイント(複製配置先)にマッピング対応する値を保存できる属性を用意 -
Set Material
ノードで、複製配置したLampのインスタンスたちに対してマテリアル Light を設定 -
Position
ノードを用意 (のちのちこれはGridノードがつくる頂点ポイントたちを読み込む) -
Object Info
ノードで、オブジェクト Target の Location を読み込む -
Vector Math
ノードで、3と4の距離を計算・出力 -
Map Range
ノードで、5から流れ込んだ距離を、適切な値にスケールして、1に流し込む -
Store Named Attribute
ノード上で、属性に名前を付ける (ここでは PowerbyDistance という名前)
結果:Gridの各頂点に紐づく、ターゲットオブジェクトとの距離に対応する明るさ属性がつくられ、複製配列したLamp インスタンスたちにおのおの引き渡せるようになる
3️⃣明るさ属性を、Light マテリアルの情報に紐づけさせる
-
Attribute
ノードを追加し、EmissionのStrengthに、さきほどつくった属性を流し込む
結果:Lampのインスタンスたちの明るさが、Targetとの距離に反応するようになる。
補足:属性の確認のしかた
Girdがつくる各頂点に対して付与した属性の値をリアルタイムで確認することができます。
-
Store Named Attibute
ノードに、Viewer
ノードを付け、目を開けさせる - SpreadSheetを開いて確認 (右上のピンをとめておく)
Store Named Attributeでつくった、Gridがつくる、0から8までの9つのVertex(頂点)に付与した属性 (ここでは "PowerbyDistance")が、ターゲットとの距離に応じて変化している様子が確認できます。
以上